go/gcexportdata: a new simpler API for the deprecated go/gcimporter15
Fixes golang/go#15651
Change-Id: I7dc7ba731a22c677e3c01bf13e91ecfff9e46765
Reviewed-on: https://go-review.googlesource.com/30612
Reviewed-by: Robert Griesemer <gri@golang.org>
diff --git a/go/gcexportdata/example_test.go b/go/gcexportdata/example_test.go
new file mode 100644
index 0000000..d16d712
--- /dev/null
+++ b/go/gcexportdata/example_test.go
@@ -0,0 +1,111 @@
+// Copyright 2016 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.
+
+package gcexportdata_test
+
+import (
+ "fmt"
+ "go/ast"
+ "go/parser"
+ "go/token"
+ "go/types"
+ "log"
+ "os"
+ "path/filepath"
+
+ "golang.org/x/tools/go/gcexportdata"
+)
+
+// ExampleRead uses gcexportdata.Read to load type information for the
+// "fmt" package from the fmt.a file produced by the gc compiler.
+func ExampleRead() {
+ // Find the export data file.
+ filename, path := gcexportdata.Find("fmt", "")
+ if filename == "" {
+ log.Fatalf("can't find export data for fmt")
+ }
+ fmt.Printf("Package path: %s\n", path)
+ fmt.Printf("Export data: %s\n", filepath.Base(filename))
+
+ // Open and read the file.
+ f, err := os.Open(filename)
+ if err != nil {
+ log.Fatal(err)
+ }
+ defer f.Close()
+ r, err := gcexportdata.NewReader(f)
+ if err != nil {
+ log.Fatalf("reading export data %s: %v", filename, err)
+ }
+
+ // Decode the export data.
+ fset := token.NewFileSet()
+ imports := make(map[string]*types.Package)
+ pkg, err := gcexportdata.Read(r, fset, imports, path)
+ if err != nil {
+ log.Fatal(err)
+ }
+
+ // Print package information.
+ fmt.Printf("Package members: %s...\n", pkg.Scope().Names()[:5])
+ println := pkg.Scope().Lookup("Println")
+ posn := fset.Position(println.Pos())
+ posn.Line = 123 // make example deterministic
+ fmt.Printf("Println type: %s\n", println.Type())
+ fmt.Printf("Println location: %s\n", posn)
+
+ // Output:
+ //
+ // Package path: fmt
+ // Export data: fmt.a
+ // Package members: [Errorf Formatter Fprint Fprintf Fprintln]...
+ // Println type: func(a ...interface{}) (n int, err error)
+ // Println location: $GOROOT/src/fmt/print.go:123:1
+}
+
+// ExampleNewImporter demonstrates usage of NewImporter to provide type
+// information for dependencies when type-checking Go source code.
+func ExampleNewImporter() {
+ const src = `package twopi
+
+import "math"
+
+const TwoPi = 2 * math.Pi
+`
+ fset := token.NewFileSet()
+ f, err := parser.ParseFile(fset, "twopi.go", src, 0)
+ if err != nil {
+ log.Fatal(err)
+ }
+
+ packages := make(map[string]*types.Package)
+ imp := gcexportdata.NewImporter(fset, packages)
+ conf := types.Config{Importer: imp}
+ pkg, err := conf.Check("twopi", fset, []*ast.File{f}, nil)
+ if err != nil {
+ log.Fatal(err)
+ }
+
+ // object from imported package
+ pi := packages["math"].Scope().Lookup("Pi")
+ fmt.Printf("const %s.%s %s = %s // %s\n",
+ pi.Pkg().Path(),
+ pi.Name(),
+ pi.Type(),
+ pi.(*types.Const).Val(),
+ fset.Position(pi.Pos()))
+
+ // object in source package
+ twopi := pkg.Scope().Lookup("TwoPi")
+ fmt.Printf("const %s %s = %s // %s\n",
+ twopi.Name(),
+ twopi.Type(),
+ twopi.(*types.Const).Val(),
+ fset.Position(twopi.Pos()))
+
+ // Output:
+ //
+ // const math.Pi untyped float = 3.14159 // $GOROOT/src/math/const.go:11:1
+ // const TwoPi untyped float = 6.28319 // twopi.go:5:7
+}