You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

70 lines
1.6 KiB

  1. // Copyright 2013 The Go Authors. All rights reserved.
  2. //
  3. // Use of this source code is governed by a BSD-style
  4. // license that can be found in the LICENSE file or at
  5. // https://developers.google.com/open-source/licenses/bsd.
  6. // +build ignore
  7. // Command astprint prints the AST for a file.
  8. //
  9. // Usage: go run asprint.go fname
  10. package main
  11. import (
  12. "flag"
  13. "go/ast"
  14. "go/build"
  15. "go/doc"
  16. "go/parser"
  17. "go/token"
  18. "io/ioutil"
  19. "log"
  20. "path/filepath"
  21. "strings"
  22. "github.com/davecgh/go-spew/spew"
  23. )
  24. func importer(imports map[string]*ast.Object, path string) (*ast.Object, error) {
  25. pkg := imports[path]
  26. if pkg == nil {
  27. name := path[strings.LastIndex(path, "/")+1:]
  28. pkg = ast.NewObj(ast.Pkg, name)
  29. pkg.Data = ast.NewScope(nil) // required by ast.NewPackage for dot-import
  30. imports[path] = pkg
  31. }
  32. return pkg, nil
  33. }
  34. func main() {
  35. flag.Parse()
  36. if len(flag.Args()) != 1 {
  37. log.Fatal("Usage: go run goprint.go path")
  38. }
  39. bpkg, err := build.Default.Import(flag.Args()[0], ".", 0)
  40. if err != nil {
  41. log.Fatal(err)
  42. }
  43. fset := token.NewFileSet()
  44. files := make(map[string]*ast.File)
  45. for _, fname := range bpkg.GoFiles {
  46. p, err := ioutil.ReadFile(filepath.Join(bpkg.SrcRoot, bpkg.ImportPath, fname))
  47. if err != nil {
  48. log.Fatal(err)
  49. }
  50. file, err := parser.ParseFile(fset, fname, p, parser.ParseComments)
  51. if err != nil {
  52. log.Fatal(err)
  53. }
  54. files[fname] = file
  55. }
  56. c := spew.NewDefaultConfig()
  57. c.DisableMethods = true
  58. apkg, _ := ast.NewPackage(fset, files, importer, nil)
  59. c.Dump(apkg)
  60. ast.Print(fset, apkg)
  61. dpkg := doc.New(apkg, bpkg.ImportPath, 0)
  62. c.Dump(dpkg)
  63. }