@@ -47,9 +47,10 @@ func NewProgram(fset *token.FileSet, mode BuilderMode) *Program {
47
47
// typechecker object obj.
48
48
//
49
49
// For objects from Go source code, syntax is the associated syntax
50
- // tree (for funcs and vars only); it will be used during the build
50
+ // tree (for funcs and vars only) and goversion defines the
51
+ // appropriate interpretation; they will be used during the build
51
52
// phase.
52
- func memberFromObject (pkg * Package , obj types.Object , syntax ast.Node ) {
53
+ func memberFromObject (pkg * Package , obj types.Object , syntax ast.Node , goversion string ) {
53
54
name := obj .Name ()
54
55
switch obj := obj .(type ) {
55
56
case * types.Builtin :
@@ -108,6 +109,7 @@ func memberFromObject(pkg *Package, obj types.Object, syntax ast.Node) {
108
109
Prog : pkg .Prog ,
109
110
typeparams : tparams ,
110
111
info : pkg .info ,
112
+ goversion : goversion ,
111
113
}
112
114
pkg .created .Add (fn )
113
115
if syntax == nil {
@@ -130,24 +132,27 @@ func memberFromObject(pkg *Package, obj types.Object, syntax ast.Node) {
130
132
// membersFromDecl populates package pkg with members for each
131
133
// typechecker object (var, func, const or type) associated with the
132
134
// specified decl.
133
- func membersFromDecl (pkg * Package , decl ast.Decl ) {
135
+ func membersFromDecl (pkg * Package , decl ast.Decl , goversion string ) {
134
136
switch decl := decl .(type ) {
135
137
case * ast.GenDecl : // import, const, type or var
136
138
switch decl .Tok {
137
139
case token .CONST :
138
140
for _ , spec := range decl .Specs {
139
141
for _ , id := range spec .(* ast.ValueSpec ).Names {
140
142
if ! isBlankIdent (id ) {
141
- memberFromObject (pkg , pkg .info .Defs [id ], nil )
143
+ memberFromObject (pkg , pkg .info .Defs [id ], nil , "" )
142
144
}
143
145
}
144
146
}
145
147
146
148
case token .VAR :
147
149
for _ , spec := range decl .Specs {
150
+ for _ , rhs := range spec .(* ast.ValueSpec ).Values {
151
+ pkg .initVersion [rhs ] = goversion
152
+ }
148
153
for _ , id := range spec .(* ast.ValueSpec ).Names {
149
154
if ! isBlankIdent (id ) {
150
- memberFromObject (pkg , pkg .info .Defs [id ], spec )
155
+ memberFromObject (pkg , pkg .info .Defs [id ], spec , goversion )
151
156
}
152
157
}
153
158
}
@@ -156,15 +161,15 @@ func membersFromDecl(pkg *Package, decl ast.Decl) {
156
161
for _ , spec := range decl .Specs {
157
162
id := spec .(* ast.TypeSpec ).Name
158
163
if ! isBlankIdent (id ) {
159
- memberFromObject (pkg , pkg .info .Defs [id ], nil )
164
+ memberFromObject (pkg , pkg .info .Defs [id ], nil , "" )
160
165
}
161
166
}
162
167
}
163
168
164
169
case * ast.FuncDecl :
165
170
id := decl .Name
166
171
if ! isBlankIdent (id ) {
167
- memberFromObject (pkg , pkg .info .Defs [id ], decl )
172
+ memberFromObject (pkg , pkg .info .Defs [id ], decl , goversion )
168
173
}
169
174
}
170
175
}
@@ -197,8 +202,10 @@ func (prog *Program) CreatePackage(pkg *types.Package, files []*ast.File, info *
197
202
Members : make (map [string ]Member ),
198
203
objects : make (map [types.Object ]Member ),
199
204
Pkg : pkg ,
200
- info : info , // transient (CREATE and BUILD phases)
201
- files : files , // transient (CREATE and BUILD phases)
205
+ // transient values (CREATE and BUILD phases)
206
+ info : info ,
207
+ files : files ,
208
+ initVersion : make (map [ast.Expr ]string ),
202
209
}
203
210
204
211
// Add init() function.
@@ -209,6 +216,7 @@ func (prog *Program) CreatePackage(pkg *types.Package, files []*ast.File, info *
209
216
Pkg : p ,
210
217
Prog : prog ,
211
218
info : p .info ,
219
+ goversion : "" , // See Package.build() for details.
212
220
}
213
221
p .Members [p .init .name ] = p .init
214
222
p .created .Add (p .init )
@@ -218,8 +226,9 @@ func (prog *Program) CreatePackage(pkg *types.Package, files []*ast.File, info *
218
226
if len (files ) > 0 {
219
227
// Go source package.
220
228
for _ , file := range files {
229
+ goversion := goversionOf (p , file )
221
230
for _ , decl := range file .Decls {
222
- membersFromDecl (p , decl )
231
+ membersFromDecl (p , decl , goversion )
223
232
}
224
233
}
225
234
} else {
@@ -229,11 +238,11 @@ func (prog *Program) CreatePackage(pkg *types.Package, files []*ast.File, info *
229
238
scope := p .Pkg .Scope ()
230
239
for _ , name := range scope .Names () {
231
240
obj := scope .Lookup (name )
232
- memberFromObject (p , obj , nil )
241
+ memberFromObject (p , obj , nil , "" )
233
242
if obj , ok := obj .(* types.TypeName ); ok {
234
243
if named , ok := obj .Type ().(* types.Named ); ok {
235
244
for i , n := 0 , named .NumMethods (); i < n ; i ++ {
236
- memberFromObject (p , named .Method (i ), nil )
245
+ memberFromObject (p , named .Method (i ), nil , "" )
237
246
}
238
247
}
239
248
}
0 commit comments