package main import ( "bytes" "flag" "go/parser" "go/printer" "go/ast" "go/token" "log" "os" "template" ) 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) } }