func main()

in cmd/generate-fastjson/main.go [55:153]


func main() {
	flag.Parse()
	if flag.NArg() != 1 {
		flag.Usage()
		os.Exit(1)
	}
	if outfile != "-" {
		if _, err := os.Stat(outfile); err == nil {
			if force {
				if err := os.Remove(outfile); err != nil {
					log.Fatal(err)
				}
			} else {
				fmt.Fprintf(os.Stderr, "%s already exists, and -f not specified; aborting\n", outfile)
				os.Exit(2)
			}
		}
	}

	cfg := &packages.Config{
		Mode: packages.NeedTypes | packages.NeedSyntax | packages.NeedTypesInfo,
	}
	pkgs, err := packages.Load(cfg, flag.Arg(0))
	if err != nil {
		fmt.Fprintf(os.Stderr, "load: %v\n", err)
		os.Exit(1)
	}
	if packages.PrintErrors(pkgs) > 0 {
		os.Exit(1)
	}
	pkg := pkgs[0]

	var buf bytes.Buffer
	fmt.Fprintf(&buf, `
// Code generated by "generate-fastjson". DO NOT EDIT.

package %s

import (
	"errors"
	"math"

	%q
)

var (
	_ = errors.New
	_ = math.IsNaN
)
`[1:], pkg.Types.Name(), fastjsonPath)

	var generated int
	for _, f := range pkg.Syntax {
		for _, decl := range f.Decls {
			genDecl, ok := decl.(*ast.GenDecl)
			if !ok || genDecl.Tok != token.TYPE {
				continue
			}
			for _, spec := range genDecl.Specs {
				typeSpec, ok := spec.(*ast.TypeSpec)
				if !ok {
					continue
				}
				obj := pkg.TypesInfo.Defs[typeSpec.Name]
				if obj == nil || !obj.Exported() {
					continue
				}
				typeName := obj.(*types.TypeName)
				named := typeName.Type().(*types.Named)
				if !hasMethod(named, marshalMethod) {
					generate(&buf, named)
					generated++
				}
			}
		}
	}

	formatted, err := format.Source(buf.Bytes())
	if err != nil {
		fmt.Println(buf.String())
		log.Fatal(err)
	}

	var out io.Writer = os.Stdout
	if outfile != "-" {
		f, err := os.Create(outfile)
		if err != nil {
			log.Fatal(err)
		}
		defer f.Close()
		out = f
	}
	if _, err := out.Write(formatted); err != nil {
		log.Fatal(err)
	}
	if outfile != "" {
		fmt.Fprintf(os.Stderr, "generated %d methods in %q\n", generated, outfile)
	}
}