1 // Copyright 2016 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.
8 package gcexportdata_test
20 "golang.org/x/tools/go/gcexportdata"
23 // ExampleRead uses gcexportdata.Read to load type information for the
24 // "fmt" package from the fmt.a file produced by the gc compiler.
26 // Find the export data file.
27 filename, path := gcexportdata.Find("fmt", "")
29 log.Fatalf("can't find export data for fmt")
31 fmt.Printf("Package path: %s\n", path)
32 fmt.Printf("Export data: %s\n", filepath.Base(filename))
34 // Open and read the file.
35 f, err := os.Open(filename)
40 r, err := gcexportdata.NewReader(f)
42 log.Fatalf("reading export data %s: %v", filename, err)
45 // Decode the export data.
46 fset := token.NewFileSet()
47 imports := make(map[string]*types.Package)
48 pkg, err := gcexportdata.Read(r, fset, imports, path)
53 // Print package information.
54 members := pkg.Scope().Names()
55 if members[0] == ".inittask" {
56 // An improvement to init handling in 1.13 added ".inittask". Remove so go >= 1.13 and go < 1.13 both pass.
59 fmt.Printf("Package members: %s...\n", members[:5])
60 println := pkg.Scope().Lookup("Println")
61 posn := fset.Position(println.Pos())
62 posn.Line = 123 // make example deterministic
63 fmt.Printf("Println type: %s\n", println.Type())
64 fmt.Printf("Println location: %s\n", slashify(posn))
70 // Package members: [Errorf Formatter Fprint Fprintf Fprintln]...
71 // Println type: func(a ...interface{}) (n int, err error)
72 // Println location: $GOROOT/src/fmt/print.go:123:1
75 // ExampleNewImporter demonstrates usage of NewImporter to provide type
76 // information for dependencies when type-checking Go source code.
77 func ExampleNewImporter() {
78 const src = `package myrpc
80 // choosing a package that doesn't change across releases
83 const serverError rpc.ServerError = ""
85 fset := token.NewFileSet()
86 f, err := parser.ParseFile(fset, "myrpc.go", src, 0)
91 packages := make(map[string]*types.Package)
92 imp := gcexportdata.NewImporter(fset, packages)
93 conf := types.Config{Importer: imp}
94 pkg, err := conf.Check("myrpc", fset, []*ast.File{f}, nil)
99 // object from imported package
100 pi := packages["net/rpc"].Scope().Lookup("ServerError")
101 fmt.Printf("type %s.%s %s // %s\n",
104 pi.Type().Underlying(),
105 slashify(fset.Position(pi.Pos())),
108 // object in source package
109 twopi := pkg.Scope().Lookup("serverError")
110 fmt.Printf("const %s %s = %s // %s\n",
113 twopi.(*types.Const).Val(),
114 slashify(fset.Position(twopi.Pos())),
119 // type net/rpc.ServerError string // $GOROOT/src/net/rpc/client.go:20:1
120 // const serverError net/rpc.ServerError = "" // myrpc.go:6:7
123 func slashify(posn token.Position) token.Position {
124 posn.Filename = filepath.ToSlash(posn.Filename) // for MS Windows portability