gopkg.in/alecthomas/gometalinter.v3@v3.0.0/_linters/src/golang.org/x/tools/go/gcexportdata/main.go (about) 1 // Copyright 2017 The Go Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style 3 // license that can be found in the LICENSE file. 4 5 // +build ignore 6 7 // The gcexportdata command is a diagnostic tool that displays the 8 // contents of gc export data files. 9 package main 10 11 import ( 12 "flag" 13 "fmt" 14 "go/token" 15 "go/types" 16 "log" 17 "os" 18 19 "golang.org/x/tools/go/gcexportdata" 20 "golang.org/x/tools/go/types/typeutil" 21 ) 22 23 func main() { 24 log.SetPrefix("gcexportdata: ") 25 log.SetFlags(0) 26 flag.Usage = func() { 27 fmt.Fprintln(os.Stderr, "usage: gcexportdata file.a") 28 } 29 flag.Parse() 30 if flag.NArg() != 1 { 31 flag.Usage() 32 os.Exit(2) 33 } 34 filename := flag.Args()[0] 35 36 f, err := os.Open(filename) 37 if err != nil { 38 log.Fatal(err) 39 } 40 41 r, err := gcexportdata.NewReader(f) 42 if err != nil { 43 log.Fatalf("%s: %s", filename, err) 44 } 45 46 // Decode the package. 47 imports := make(map[string]*types.Package) 48 fset := token.NewFileSet() 49 pkg, err := gcexportdata.Read(r, fset, imports, "dummy") 50 if err != nil { 51 log.Fatal("%s: %s", filename, err) 52 } 53 54 // Print all package-level declarations, including non-exported ones. 55 fmt.Printf("package %s\n", pkg.Name()) 56 for _, imp := range pkg.Imports() { 57 fmt.Printf("import %q\n", imp.Path()) 58 } 59 qual := func(p *types.Package) string { 60 if pkg == p { 61 return "" 62 } 63 return p.Name() 64 } 65 scope := pkg.Scope() 66 for _, name := range scope.Names() { 67 obj := scope.Lookup(name) 68 fmt.Printf("%s: %s\n", 69 fset.Position(obj.Pos()), 70 types.ObjectString(obj, qual)) 71 72 // For types, print each method. 73 if _, ok := obj.(*types.TypeName); ok { 74 for _, method := range typeutil.IntuitiveMethodSet(obj.Type(), nil) { 75 fmt.Printf("%s: %s\n", 76 fset.Position(method.Obj().Pos()), 77 types.SelectionString(method, qual)) 78 } 79 } 80 } 81 }