mirror of
https://github.com/golang/go
synced 2024-11-12 06:30:21 -07:00
f9489bed72
R=rsc CC=golang-dev https://golang.org/cl/5338043
73 lines
1.2 KiB
Go
73 lines
1.2 KiB
Go
package main
|
|
|
|
import (
|
|
"bytes"
|
|
"flag"
|
|
"go/ast"
|
|
"go/parser"
|
|
"go/printer"
|
|
"go/token"
|
|
"log"
|
|
"os"
|
|
"text/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)
|
|
}
|
|
}
|