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