@@ -77,10 +77,7 @@ func (c *Collector) Export(ctx context.Context) (*uniast.Repository, error) {
77
77
// export symbols
78
78
for _ , symbol := range c .syms {
79
79
visited := make (map [* lsp.DocumentSymbol ]* uniast.Identity )
80
- _ , err := c .exportSymbol (& repo , symbol , "" , visited )
81
- if err != nil {
82
- log .Info ("export symbol %s failed: %v\n " , symbol , err )
83
- }
80
+ _ , _ = c .exportSymbol (& repo , symbol , "" , visited )
84
81
}
85
82
86
83
// patch module
@@ -96,6 +93,11 @@ func (c *Collector) Export(ctx context.Context) (*uniast.Repository, error) {
96
93
return & repo , nil
97
94
}
98
95
96
+ var (
97
+ ErrStdSymbol = errors .New ("std symbol" )
98
+ ErrExternalSymbol = errors .New ("external symbol" )
99
+ )
100
+
99
101
// NOTICE: for rust and golang, each entity has separate location
100
102
// TODO: some language may allow local symbols inside another symbol,
101
103
func (c * Collector ) filterLocalSymbols () {
@@ -113,9 +115,16 @@ func (c *Collector) filterLocalSymbols() {
113
115
}
114
116
}
115
117
116
- func (c * Collector ) exportSymbol (repo * uniast.Repository , symbol * DocumentSymbol , refName string , visited map [* DocumentSymbol ]* uniast.Identity ) (* uniast.Identity , error ) {
118
+ func (c * Collector ) exportSymbol (repo * uniast.Repository , symbol * DocumentSymbol , refName string , visited map [* DocumentSymbol ]* uniast.Identity ) (id * uniast.Identity , e error ) {
119
+ defer func () {
120
+ if e != nil && e != ErrStdSymbol && e != ErrExternalSymbol {
121
+ log .Info ("export symbol %s failed: %v\n " , symbol , e )
122
+ }
123
+ }()
124
+
117
125
if symbol == nil {
118
- return nil , errors .New ("symbol is nil" )
126
+ e = errors .New ("symbol is nil" )
127
+ return
119
128
}
120
129
if id , ok := visited [symbol ]; ok {
121
130
return id , nil
@@ -124,22 +133,32 @@ func (c *Collector) exportSymbol(repo *uniast.Repository, symbol *DocumentSymbol
124
133
name := symbol .Name
125
134
if name == "" {
126
135
if refName == "" {
127
- return nil , fmt .Errorf ("both symbol %v name and refname is empty" , symbol )
136
+ e = fmt .Errorf ("both symbol %v name and refname is empty" , symbol )
137
+ return
128
138
}
129
139
// NOTICE: use refName as id when symbol name is missing
130
140
name = refName
131
141
}
132
142
file := symbol .Location .URI .File ()
133
143
mod , path , err := c .spec .NameSpace (file )
134
144
if err != nil {
135
- return nil , err
145
+ e = err
146
+ return
136
147
}
137
- id := uniast .NewIdentity (mod , path , name )
138
- visited [symbol ] = & id
148
+
149
+ if ! c .NeedStdSymbol && mod == "" {
150
+ e = ErrStdSymbol
151
+ return
152
+ }
153
+
154
+ tmp := uniast .NewIdentity (mod , path , name )
155
+ id = & tmp
156
+ visited [symbol ] = id
139
157
140
158
// Load eternal symbol on demands
141
159
if ! c .LoadExternalSymbol && (! c .internal (symbol .Location ) || symbol .Kind == SKUnknown ) {
142
- return & id , nil
160
+ e = ErrExternalSymbol
161
+ return
143
162
}
144
163
145
164
if repo .Modules [mod ] == nil {
@@ -196,7 +215,6 @@ func (c *Collector) exportSymbol(repo *uniast.Repository, symbol *DocumentSymbol
196
215
tok , _ := c .cli .Locate (input .Location )
197
216
tyid , err := c .exportSymbol (repo , input .Symbol , tok , visited )
198
217
if err != nil {
199
- log .Error ("export input symbol %s failed: %v\n " , input .Symbol , err )
200
218
continue
201
219
}
202
220
dep := uniast .NewDependency (* tyid , c .fileLine (input .Location ))
@@ -208,7 +226,6 @@ func (c *Collector) exportSymbol(repo *uniast.Repository, symbol *DocumentSymbol
208
226
tok , _ := c .cli .Locate (input .Location )
209
227
tyid , err := c .exportSymbol (repo , input .Symbol , tok , visited )
210
228
if err != nil {
211
- log .Error ("export input symbol %s failed: %v\n " , input .Symbol , err )
212
229
continue
213
230
}
214
231
dep := uniast .NewDependency (* tyid , c .fileLine (input .Location ))
@@ -220,7 +237,6 @@ func (c *Collector) exportSymbol(repo *uniast.Repository, symbol *DocumentSymbol
220
237
tok , _ := c .cli .Locate (output .Location )
221
238
tyid , err := c .exportSymbol (repo , output .Symbol , tok , visited )
222
239
if err != nil {
223
- log .Error ("export output symbol %s failed: %v\n " , output .Symbol , err )
224
240
continue
225
241
}
226
242
dep := uniast .NewDependency (* tyid , c .fileLine (output .Location ))
@@ -242,9 +258,7 @@ func (c *Collector) exportSymbol(repo *uniast.Repository, symbol *DocumentSymbol
242
258
if info .Method .Interface != nil {
243
259
itok , _ := c .cli .Locate (info .Method .Interface .Location )
244
260
iid , err := c .exportSymbol (repo , info .Method .Interface .Symbol , itok , visited )
245
- if err != nil {
246
- log .Error ("export interface symbol %s failed: %v\n " , info .Method .Interface .Symbol , err )
247
- } else {
261
+ if err == nil {
248
262
id .Name = iid .Name + "<" + id .Name + ">"
249
263
}
250
264
}
@@ -259,8 +273,6 @@ func (c *Collector) exportSymbol(repo *uniast.Repository, symbol *DocumentSymbol
259
273
if info .Method .ImplHead != "" {
260
274
obj .Content = info .Method .ImplHead + obj .Content + "\n }"
261
275
}
262
- } else {
263
- log .Error ("export receiver symbol %s failed: %v\n " , info .Method .Receiver .Symbol , err )
264
276
}
265
277
}
266
278
// collect deps
@@ -269,7 +281,6 @@ func (c *Collector) exportSymbol(repo *uniast.Repository, symbol *DocumentSymbol
269
281
tok , _ := c .cli .Locate (dep .Location )
270
282
depid , err := c .exportSymbol (repo , dep .Symbol , tok , visited )
271
283
if err != nil {
272
- log .Error ("export dep symbol %s failed: %v\n " , dep .Symbol , err )
273
284
continue
274
285
}
275
286
pdep := uniast .NewDependency (* depid , c .fileLine (dep .Location ))
@@ -297,7 +308,7 @@ func (c *Collector) exportSymbol(repo *uniast.Repository, symbol *DocumentSymbol
297
308
}
298
309
}
299
310
}
300
- obj .Identity = id
311
+ obj .Identity = * id
301
312
pkg .Functions [id .Name ] = obj
302
313
303
314
// Type
@@ -314,7 +325,6 @@ func (c *Collector) exportSymbol(repo *uniast.Repository, symbol *DocumentSymbol
314
325
tok , _ := c .cli .Locate (dep .Location )
315
326
depid , err := c .exportSymbol (repo , dep .Symbol , tok , visited )
316
327
if err != nil {
317
- log .Error ("export dep symbol %s failed: %v\n " , dep .Symbol , err )
318
328
continue
319
329
}
320
330
switch dep .Symbol .Kind {
@@ -332,14 +342,13 @@ func (c *Collector) exportSymbol(repo *uniast.Repository, symbol *DocumentSymbol
332
342
tok , _ := c .cli .Locate (method .Location )
333
343
mid , err := c .exportSymbol (repo , method , tok , visited )
334
344
if err != nil {
335
- log .Error ("export method symbol %s failed: %v\n " , method , err )
336
345
continue
337
346
}
338
347
// NOTICE: use method name as key here
339
348
obj .Methods [method .Name ] = * mid
340
349
}
341
350
}
342
- obj .Identity = id
351
+ obj .Identity = * id
343
352
pkg .Types [id .Name ] = obj
344
353
// Vars
345
354
case lsp .SKConstant , lsp .SKVariable :
@@ -354,17 +363,15 @@ func (c *Collector) exportSymbol(repo *uniast.Repository, symbol *DocumentSymbol
354
363
tyid , err := c .exportSymbol (repo , ty .Symbol , tok , visited )
355
364
if err == nil {
356
365
obj .Type = tyid
357
- } else {
358
- log .Error ("export var type symbol %s failed: %v\n " , ty .Symbol , err )
359
366
}
360
367
}
361
- obj .Identity = id
368
+ obj .Identity = * id
362
369
pkg .Vars [id .Name ] = obj
363
370
default :
364
371
log .Error ("symbol %s not collected\n " , symbol )
365
372
}
366
373
367
- return & id , nil
374
+ return
368
375
}
369
376
370
377
func mapKind (kind lsp.SymbolKind ) uniast.TypeKind {
0 commit comments