| package main |
| |
| import ( |
| "bytes" |
| "flag" |
| "go/parser" |
| "go/printer" |
| "go/ast" |
| "log" |
| "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 |
| file, err := parser.ParseFile(*srcFn, nil, 0) |
| if err != nil { |
| log.Exit(err) |
| } |
| // create printer |
| p := &printer.Config{ |
| Mode: 0, |
| Tabwidth: 8, |
| Styler: nil, |
| } |
| if *html { |
| p.Mode = printer.GenHTML |
| } |
| // create filter |
| filter := func(name string) bool { |
| return name == *getName |
| } |
| // filter |
| if !ast.FilterFile(file, filter) { |
| os.Exit(1) |
| } |
| b := new(bytes.Buffer) |
| p.Fprint(b, 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 |
| b.WriteTo(os.Stdout) |
| } |