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