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)
}
}