-
Notifications
You must be signed in to change notification settings - Fork 14
/
package.go
79 lines (69 loc) · 1.51 KB
/
package.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
package gossa
import (
"go/constant"
"reflect"
)
var (
registerPkgs = make(map[string]*Package)
)
// lookup register pkgs
func LookupPackage(name string) (pkg *Package, ok bool) {
pkg, ok = registerPkgs[name]
return
}
// register pkg
func RegisterPackage(pkg *Package) {
if p, ok := registerPkgs[pkg.Path]; ok {
for k, v := range pkg.Interfaces {
p.Interfaces[k] = v
}
for k, v := range pkg.NamedTypes {
p.NamedTypes[k] = v
}
for k, v := range pkg.Vars {
p.Vars[k] = v
}
for k, v := range pkg.Funcs {
p.Funcs[k] = v
}
for k, v := range pkg.UntypedConsts {
p.UntypedConsts[k] = v
}
return
}
registerPkgs[pkg.Path] = pkg
// externPackages[pkg.Path] = true
}
type TypedConst struct {
Typ reflect.Type
Value constant.Value
}
type UntypedConst struct {
Typ string
Value constant.Value
}
type NamedType struct {
Typ reflect.Type
Methods string
PtrMethods string
}
type Package struct {
Name string
Path string
Interfaces map[string]reflect.Type
NamedTypes map[string]NamedType
AliasTypes map[string]reflect.Type
Vars map[string]reflect.Value
Funcs map[string]reflect.Value
TypedConsts map[string]TypedConst
UntypedConsts map[string]UntypedConst
Deps map[string]string
methods map[string]reflect.Value // methods cached
}
var (
externValues = make(map[string]reflect.Value)
)
// register external interface
func RegisterExternal(key string, i interface{}) {
externValues[key] = reflect.ValueOf(i)
}