...
1
2
3
4
5 package gcimporter_test
6
7 import (
8 "bytes"
9 "fmt"
10 "go/token"
11 "go/types"
12 "runtime"
13 "testing"
14 "unsafe"
15
16 "golang.org/x/tools/go/gcexportdata"
17 "golang.org/x/tools/go/packages"
18 "golang.org/x/tools/internal/testenv"
19 )
20
21
22
23 func TestStdlib(t *testing.T) {
24 testenv.NeedsGoPackages(t)
25
26
27
28
29
30 if unsafe.Sizeof(token.NoPos) < 8 {
31 t.Skip("skipping test on 32-bit machine")
32 }
33
34
35
36 cfg := &packages.Config{Mode: packages.LoadAllSyntax}
37 patterns := []string{"std"}
38 minPkgs := 225
39 switch runtime.GOOS {
40 case "android", "ios":
41
42
43 default:
44 patterns = append(patterns, "golang.org/x/tools/...")
45 minPkgs += 160
46 }
47 pkgs, err := packages.Load(cfg, patterns...)
48 if err != nil {
49 t.Fatalf("failed to load/parse/type-check: %v", err)
50 }
51 if packages.PrintErrors(pkgs) > 0 {
52 t.Fatal("there were errors during loading")
53 }
54 if len(pkgs) < minPkgs {
55 t.Errorf("too few packages (%d) were loaded", len(pkgs))
56 }
57
58 export := make(map[string][]byte)
59
60
61 packages.Visit(pkgs, nil, func(pkg *packages.Package) {
62 packages := make(map[string]*types.Package)
63 cfg := &types.Config{
64 Error: func(e error) {
65 t.Errorf("type error: %v", e)
66 },
67 Importer: importerFunc(func(importPath string) (*types.Package, error) {
68
69 imported := pkg.Imports[importPath]
70
71 if imported.PkgPath == "unsafe" {
72 return types.Unsafe, nil
73 }
74
75 data, ok := export[imported.ID]
76 if !ok {
77 return nil, fmt.Errorf("missing export data for %s", importPath)
78 }
79 return gcexportdata.Read(bytes.NewReader(data), pkg.Fset, packages, imported.PkgPath)
80 }),
81 }
82
83
84 newPkg := types.NewPackage(pkg.PkgPath, pkg.Name)
85 check := types.NewChecker(cfg, pkg.Fset, newPkg, nil)
86 check.Files(pkg.Syntax)
87
88 var out bytes.Buffer
89 if err := gcexportdata.Write(&out, pkg.Fset, newPkg); err != nil {
90 t.Fatalf("internal error writing export data: %v", err)
91 }
92 export[pkg.ID] = out.Bytes()
93 })
94 }
95
View as plain text