...
Source file src/cmd/vendor/golang.org/x/tools/go/analysis/internal/facts/imports.go
1
2
3
4
5 package facts
6
7 import "go/types"
8
9
10
11
12
13
14
15
16
17
18
19
20 func importMap(imports []*types.Package) map[string]*types.Package {
21 objects := make(map[types.Object]bool)
22 packages := make(map[string]*types.Package)
23
24 var addObj func(obj types.Object) bool
25 var addType func(T types.Type)
26
27 addObj = func(obj types.Object) bool {
28 if !objects[obj] {
29 objects[obj] = true
30 addType(obj.Type())
31 if pkg := obj.Pkg(); pkg != nil {
32 packages[pkg.Path()] = pkg
33 }
34 return true
35 }
36 return false
37 }
38
39 addType = func(T types.Type) {
40 switch T := T.(type) {
41 case *types.Basic:
42
43 case *types.Named:
44 if addObj(T.Obj()) {
45 for i := 0; i < T.NumMethods(); i++ {
46 addObj(T.Method(i))
47 }
48 }
49 case *types.Pointer:
50 addType(T.Elem())
51 case *types.Slice:
52 addType(T.Elem())
53 case *types.Array:
54 addType(T.Elem())
55 case *types.Chan:
56 addType(T.Elem())
57 case *types.Map:
58 addType(T.Key())
59 addType(T.Elem())
60 case *types.Signature:
61 addType(T.Params())
62 addType(T.Results())
63 case *types.Struct:
64 for i := 0; i < T.NumFields(); i++ {
65 addObj(T.Field(i))
66 }
67 case *types.Tuple:
68 for i := 0; i < T.Len(); i++ {
69 addObj(T.At(i))
70 }
71 case *types.Interface:
72 for i := 0; i < T.NumMethods(); i++ {
73 addObj(T.Method(i))
74 }
75 }
76 }
77
78 for _, imp := range imports {
79 packages[imp.Path()] = imp
80
81 scope := imp.Scope()
82 for _, name := range scope.Names() {
83 addObj(scope.Lookup(name))
84 }
85 }
86
87 return packages
88 }
89
View as plain text