@@ -48,7 +48,7 @@ func NewFileVisitor(
48
48
pkg : pkg ,
49
49
file : file ,
50
50
pkgLookup : pkgLookup ,
51
- locals : map [token.Pos ]string {},
51
+ locals : map [token.Pos ]lookup. Local {},
52
52
pkgSymbols : pkgSymbols ,
53
53
globalSymbols : globalSymbols ,
54
54
occurrences : occurrences ,
@@ -77,8 +77,8 @@ type fileVisitor struct {
77
77
// soething
78
78
pkgLookup loader.PackageLookup
79
79
80
- // local definition position to symbol
81
- locals map [token.Pos ]string
80
+ // local definition position to symbol and its type information
81
+ locals map [token.Pos ]lookup. Local
82
82
83
83
// field definition position to symbol for the package
84
84
pkgSymbols * lookup.Package
@@ -103,13 +103,19 @@ type fileVisitor struct {
103
103
// Implements ast.Visitor
104
104
var _ ast.Visitor = & fileVisitor {}
105
105
106
- func (f * fileVisitor ) createNewLocalSymbol (pos token.Pos ) string {
107
- if _ , ok := f .locals [pos ]; ok {
106
+ func (v * fileVisitor ) createNewLocalSymbol (pos token.Pos , obj types. Object ) string {
107
+ if _ , ok := v .locals [pos ]; ok {
108
108
panic ("Cannot create a new local symbol for an ident that has already been created" )
109
109
}
110
110
111
- f .locals [pos ] = fmt .Sprintf ("local %d" , len (f .locals ))
112
- return f .locals [pos ]
111
+ symbol := fmt .Sprintf ("local %d" , len (v .locals ))
112
+
113
+ v .locals [pos ] = lookup.Local {
114
+ Symbol : symbol ,
115
+ Obj : obj ,
116
+ }
117
+
118
+ return symbol
113
119
}
114
120
115
121
func (v * fileVisitor ) Visit (n ast.Node ) ast.Visitor {
@@ -127,16 +133,19 @@ func (v *fileVisitor) Visit(n ast.Node) ast.Visitor {
127
133
}
128
134
129
135
if node .Name != nil && node .Name .Name != "." {
130
- sym := v .createNewLocalSymbol (node .Name .Pos ())
131
- v .NewDefinition (sym , symbols .RangeFromName (v .pkg .Fset .Position (node .Name .Pos ()), node .Name .Name , false ))
136
+ pkgAlias := v .pkg .TypesInfo .Defs [node .Name ]
137
+ symName := v .createNewLocalSymbol (node .Name .Pos (), pkgAlias )
138
+ rangeFromName := symbols .RangeFromName (
139
+ v .pkg .Fset .Position (node .Name .Pos ()), node .Name .Name , false )
140
+ v .NewDefinition (symName , rangeFromName )
132
141
133
142
// Save package name override, so that we use the new local symbol
134
143
// within this file
135
- v .overrides .pkgNameOverride [newtypes .GetID (importedPackage )] = sym
144
+ v .overrides .pkgNameOverride [newtypes .GetID (importedPackage )] = symName
136
145
}
137
146
138
147
position := v .pkg .Fset .Position (node .Path .Pos ())
139
- v .emitImportReference (v .globalSymbols , v . doc , position , importedPackage )
148
+ v .emitImportReference (v .globalSymbols , position , importedPackage )
140
149
141
150
return nil
142
151
@@ -197,8 +206,8 @@ func (v *fileVisitor) Visit(n ast.Node) ast.Visitor {
197
206
198
207
// Short circuit on case clauses
199
208
if obj , ok := v .overrides .caseClauses [node .Pos ()]; ok {
200
- sym := v .createNewLocalSymbol (obj .Pos ())
201
- v .NewDefinition (sym , scipRange (position , obj ))
209
+ symName := v .createNewLocalSymbol (obj .Pos (), obj )
210
+ v .NewDefinition (symName , scipRange (position , obj ))
202
211
return nil
203
212
}
204
213
@@ -207,16 +216,16 @@ func (v *fileVisitor) Visit(n ast.Node) ast.Visitor {
207
216
// Emit Definition
208
217
def := info .Defs [node ]
209
218
if def != nil {
210
- var sym string
219
+ var symName string
211
220
if pkgSymbols , ok := v .pkgSymbols .GetSymbol (def .Pos ()); ok {
212
- sym = pkgSymbols
221
+ symName = pkgSymbols
213
222
} else if globalSymbol , ok := v .globalSymbols .GetSymbol (v .pkg , def .Pos ()); ok {
214
- sym = globalSymbol
223
+ symName = globalSymbol
215
224
} else {
216
- sym = v .createNewLocalSymbol (def .Pos ())
225
+ symName = v .createNewLocalSymbol (def .Pos (), def )
217
226
}
218
227
219
- v .NewDefinition (sym , scipRange (position , def ))
228
+ v .NewDefinition (symName , scipRange (position , def ))
220
229
}
221
230
222
231
// Emit Reference
@@ -228,7 +237,7 @@ func (v *fileVisitor) Visit(n ast.Node) ast.Visitor {
228
237
)
229
238
230
239
if localSymbol , ok := v .locals [ref .Pos ()]; ok {
231
- symbol = localSymbol
240
+ symbol = localSymbol . Symbol
232
241
233
242
if _ , ok := v .overrides .caseClauses [ref .Pos ()]; ok {
234
243
overrideType = v .pkg .TypesInfo .TypeOf (node )
@@ -285,17 +294,16 @@ func (v *fileVisitor) Visit(n ast.Node) ast.Visitor {
285
294
286
295
func (v * fileVisitor ) emitImportReference (
287
296
globalSymbols * lookup.Global ,
288
- doc * document.Document ,
289
297
position token.Position ,
290
298
importedPackage * packages.Package ,
291
299
) {
292
300
scipRange := symbols .RangeFromName (position , importedPackage .PkgPath , true )
293
- symbol := globalSymbols .GetPkgNameSymbol (importedPackage )
294
- if symbol == nil {
301
+ if scipRange == nil {
295
302
handler .ErrOrPanic ("Missing symbol for package path: %s" , importedPackage .ID )
296
303
return
297
304
}
298
305
306
+ symbol := globalSymbols .GetPkgNameSymbol (importedPackage )
299
307
if symbol == nil {
300
308
handler .ErrOrPanic ("Missing symbol information for package: %s" , importedPackage .ID )
301
309
return
@@ -338,10 +346,22 @@ func (v *fileVisitor) ToScipDocument() *scip.Document {
338
346
}
339
347
340
348
documentSymbols := v .pkgSymbols .SymbolsForFile (documentFile )
341
- for _ , localSymbol := range v .locals {
342
- documentSymbols = append (documentSymbols , & scip.SymbolInformation {
343
- Symbol : localSymbol ,
344
- })
349
+ for _ , local := range v .locals {
350
+ symbolInfo := & scip.SymbolInformation {
351
+ Symbol : local .Symbol ,
352
+ }
353
+
354
+ if obj := local .Obj ; obj != nil {
355
+ symbolInfo .DisplayName = obj .Name ()
356
+ if txt := local .SignatureText (); txt != "" {
357
+ symbolInfo .SignatureDocumentation = & scip.Document {
358
+ Language : "go" ,
359
+ Text : txt ,
360
+ }
361
+ }
362
+ }
363
+
364
+ documentSymbols = append (documentSymbols , symbolInfo )
345
365
}
346
366
347
367
return & scip.Document {
0 commit comments