| // Copyright 2013 The Go Authors. All rights reserved. |
| // |
| // Use of this source code is governed by a BSD-style |
| // license that can be found in the LICENSE file or at |
| // https://developers.google.com/open-source/licenses/bsd. |
| |
| // +build ignore |
| |
| // Command astprint prints the AST for a file. |
| // |
| // Usage: go run asprint.go fname |
| package main |
| |
| import ( |
| "flag" |
| "go/ast" |
| "go/build" |
| "go/doc" |
| "go/parser" |
| "go/token" |
| "io/ioutil" |
| "log" |
| "path/filepath" |
| "strings" |
| |
| "github.com/davecgh/go-spew/spew" |
| ) |
| |
| func importer(imports map[string]*ast.Object, path string) (*ast.Object, error) { |
| pkg := imports[path] |
| if pkg == nil { |
| name := path[strings.LastIndex(path, "/")+1:] |
| pkg = ast.NewObj(ast.Pkg, name) |
| pkg.Data = ast.NewScope(nil) // required by ast.NewPackage for dot-import |
| imports[path] = pkg |
| } |
| return pkg, nil |
| } |
| |
| func main() { |
| flag.Parse() |
| if len(flag.Args()) != 1 { |
| log.Fatal("Usage: go run goprint.go path") |
| } |
| bpkg, err := build.Default.Import(flag.Args()[0], ".", 0) |
| if err != nil { |
| log.Fatal(err) |
| } |
| fset := token.NewFileSet() |
| files := make(map[string]*ast.File) |
| for _, fname := range bpkg.GoFiles { |
| p, err := ioutil.ReadFile(filepath.Join(bpkg.SrcRoot, bpkg.ImportPath, fname)) |
| if err != nil { |
| log.Fatal(err) |
| } |
| file, err := parser.ParseFile(fset, fname, p, parser.ParseComments) |
| if err != nil { |
| log.Fatal(err) |
| } |
| files[fname] = file |
| } |
| c := spew.NewDefaultConfig() |
| c.DisableMethods = true |
| apkg, _ := ast.NewPackage(fset, files, importer, nil) |
| c.Dump(apkg) |
| ast.Print(fset, apkg) |
| dpkg := doc.New(apkg, bpkg.ImportPath, 0) |
| c.Dump(dpkg) |
| } |