| package main |
| |
| import ( |
| "bytes" |
| "flag" |
| "go/parser" |
| "go/printer" |
| "go/ast" |
| "go/token" |
| "log" |
| "template" |
| "os" |
| ) |
| |
| var ( |
| srcFn = flag.String("src", "", "source filename") |
| getName = flag.String("name", "", "func/type name to output") |
| html = flag.Bool("html", true, "output HTML") |
| showPkg = flag.Bool("pkg", false, "show package in output") |
| ) |
| |
| func main() { |
| // handle input |
| flag.Parse() |
| if *srcFn == "" || *getName == "" { |
| flag.Usage() |
| os.Exit(2) |
| } |
| // load file |
| fs := token.NewFileSet() |
| file, err := parser.ParseFile(fs, *srcFn, nil, 0) |
| if err != nil { |
| log.Fatal(err) |
| } |
| // create filter |
| filter := func(name string) bool { |
| return name == *getName |
| } |
| // filter |
| if !ast.FilterFile(file, filter) { |
| os.Exit(1) |
| } |
| // print the AST |
| var b bytes.Buffer |
| printer.Fprint(&b, fs, file) |
| // drop package declaration |
| if !*showPkg { |
| for { |
| c, err := b.ReadByte() |
| if c == '\n' || err != nil { |
| break |
| } |
| } |
| } |
| // drop leading newlines |
| for { |
| b, err := b.ReadByte() |
| if err != nil { |
| break |
| } |
| if b != '\n' { |
| os.Stdout.Write([]byte{b}) |
| break |
| } |
| } |
| // output |
| if *html { |
| template.HTMLEscape(os.Stdout, b.Bytes()) |
| } else { |
| b.WriteTo(os.Stdout) |
| } |
| } |