@@ -68,6 +68,9 @@ private void runTyped(List<Path> files, PackageTable packages) {
68
68
}
69
69
70
70
private String typedSymbol (String symbol , Package pkg ) {
71
+ if (symbol .isEmpty ()) {
72
+ return "" ;
73
+ }
71
74
if (symbol .startsWith ("local" )) {
72
75
return "local " + symbol .substring ("local" .length ());
73
76
}
@@ -91,6 +94,9 @@ private void processTypedDocument(Path path, PackageTable packages) {
91
94
.collect (Collectors .joining ("/" ));
92
95
Scip .Document .Builder tdoc = Scip .Document .newBuilder ().setRelativePath (relativePath );
93
96
for (SymbolOccurrence occ : doc .sortedSymbolOccurrences ()) {
97
+ if (occ .getSymbol ().isEmpty ()) {
98
+ continue ;
99
+ }
94
100
int role = 0 ;
95
101
if (isDefinitionRole (occ .getRole ())) {
96
102
role |= Scip .SymbolRole .Definition_VALUE ;
@@ -116,12 +122,35 @@ private void processTypedDocument(Path path, PackageTable packages) {
116
122
}
117
123
Symtab symtab = new Symtab (doc .semanticdb );
118
124
for (SymbolInformation info : doc .semanticdb .getSymbolsList ()) {
125
+ if (info .getSymbol ().isEmpty ()) {
126
+ continue ;
127
+ }
119
128
Package pkg = packages .packageForSymbol (info .getSymbol ()).orElse (Package .EMPTY );
120
129
Scip .SymbolInformation .Builder tinfo =
121
130
Scip .SymbolInformation .newBuilder ().setSymbol (typedSymbol (info .getSymbol (), pkg ));
122
131
132
+ for (int i = 0 ; i < info .getDefinitionRelationshipsCount (); i ++) {
133
+ String definitionSymbol = info .getDefinitionRelationships (i );
134
+ if (definitionSymbol .isEmpty ()) {
135
+ continue ;
136
+ }
137
+ Package definitionSymbolPkg =
138
+ packages .packageForSymbol (definitionSymbol ).orElse (Package .EMPTY );
139
+ SymbolInformation definitionInfo = symtab .symbols .get (definitionSymbol );
140
+ tinfo .addRelationships (
141
+ Scip .Relationship .newBuilder ()
142
+ .setSymbol (typedSymbol (definitionSymbol , definitionSymbolPkg ))
143
+ .setIsDefinition (true )
144
+ .setIsReference (
145
+ definitionInfo != null
146
+ && definitionInfo .getDisplayName ().equals (info .getDisplayName ())
147
+ && supportsReferenceRelationship (info )));
148
+ }
123
149
for (int i = 0 ; i < info .getOverriddenSymbolsCount (); i ++) {
124
150
String overriddenSymbol = info .getOverriddenSymbols (i );
151
+ if (overriddenSymbol .isEmpty ()) {
152
+ continue ;
153
+ }
125
154
if (isIgnoredOverriddenSymbol (overriddenSymbol )) {
126
155
continue ;
127
156
}
@@ -225,82 +254,85 @@ private Integer processDocumentUnsafe(
225
254
Set <Integer > rangeIds = new LinkedHashSet <>();
226
255
227
256
for (SymbolOccurrence occ : doc .sortedSymbolOccurrences ()) {
228
- SymbolInformation symbolInformation =
229
- doc .symbols .getOrDefault (occ .getSymbol (), SymbolInformation .getDefaultInstance ());
230
- ResultIds ids = results .getOrInsertResultSet (occ .getSymbol ());
231
- int rangeId = writer .emitRange (occ .getRange ());
232
- rangeIds .add (rangeId );
233
-
234
- // Range
235
- if (occ .getRole () != Role .SYNTHETIC_DEFINITION ) {
236
- writer .emitNext (rangeId , ids .resultSet );
237
- }
238
-
239
- // Reference
240
- writer .emitItem (ids .referenceResult , rangeId , doc .id );
241
-
242
- // Definition
243
- if (isDefinitionRole (occ .getRole ())) {
244
- if (ids .isDefinitionDefined ()) {
245
- writer .emitItem (ids .definitionResult , rangeId , doc .id );
246
- } else {
247
- options .reporter .error (
248
- new NoSuchElementException (
249
- String .format ("no definition ID for symbol '%s'" , occ .getSymbol ())));
257
+ for (String symbol : occ .getSymbol ().split (";" )) {
258
+ SymbolInformation symbolInformation =
259
+ doc .symbols .getOrDefault (symbol , SymbolInformation .getDefaultInstance ());
260
+ ResultIds ids = results .getOrInsertResultSet (symbol );
261
+ int rangeId = writer .emitRange (occ .getRange ());
262
+ rangeIds .add (rangeId );
263
+
264
+ // Range
265
+ if (occ .getRole () != Role .SYNTHETIC_DEFINITION ) {
266
+ writer .emitNext (rangeId , ids .resultSet );
250
267
}
251
268
252
- // Hover 1: signature
253
- String documentation = symbolInformation .getDocumentation ().getMessage ();
254
- StringBuilder markupContent = new StringBuilder (documentation .length ());
255
- if (symbolInformation .hasSignature ()) {
256
- String language =
257
- doc .semanticdb .getLanguage ().toString ().toLowerCase (Locale .ROOT ).intern ();
258
- String signature = new SignatureFormatter (symbolInformation , symtab ).formatSymbol ();
259
- markupContent
260
- .append ("```" )
261
- .append (language )
262
- .append ('\n' )
263
- .append (signature )
264
- .append ("\n ```" );
265
- }
269
+ // Reference
270
+ writer .emitItem (ids .referenceResult , rangeId , doc .id );
266
271
267
- // Hover 2: docstring
268
- if (!documentation .isEmpty ()) {
269
- if (markupContent .length () != 0 ) markupContent .append ("\n ---\n " );
270
- markupContent .append (documentation .replaceAll ("\n " , "\n \n " ));
271
- }
272
+ // Definition
273
+ if (isDefinitionRole (occ .getRole ())) {
274
+ if (ids .isDefinitionDefined ()) {
275
+ writer .emitItem (ids .definitionResult , rangeId , doc .id );
276
+ } else {
277
+ options .reporter .error (
278
+ new NoSuchElementException (
279
+ String .format ("no definition ID for symbol '%s'" , symbol )));
280
+ }
272
281
273
- if (markupContent .length () == 0 ) {
274
- // Always emit a non-empty hover message to prevent Sourcegraph from falling back to
275
- // Search-Based hover messages.
276
- markupContent .append (symbolInformation .getDisplayName ());
277
- }
282
+ // Hover 1: signature
283
+ String documentation = symbolInformation .getDocumentation ().getMessage ();
284
+ StringBuilder markupContent = new StringBuilder (documentation .length ());
285
+ if (symbolInformation .hasSignature ()) {
286
+ String language =
287
+ doc .semanticdb .getLanguage ().toString ().toLowerCase (Locale .ROOT ).intern ();
288
+ String signature = new SignatureFormatter (symbolInformation , symtab ).formatSymbol ();
289
+ markupContent
290
+ .append ("```" )
291
+ .append (language )
292
+ .append ('\n' )
293
+ .append (signature )
294
+ .append ("\n ```" );
295
+ }
278
296
279
- int hoverId =
280
- writer . emitHoverResult (
281
- new MarkupContent ( MarkupKind . MARKDOWN , markupContent .toString ()) );
282
- writer . emitHoverEdge ( ids . resultSet , hoverId );
283
- }
297
+ // Hover 2: docstring
298
+ if (! documentation . isEmpty ()) {
299
+ if ( markupContent .length () != 0 ) markupContent . append ( " \n --- \n " );
300
+ markupContent . append ( documentation . replaceAll ( " \n " , " \n \n " ) );
301
+ }
284
302
285
- // Overrides
286
- if (symbolInformation .getOverriddenSymbolsCount () > 0
287
- && supportsReferenceRelationship (symbolInformation )
288
- && occ .getRole () == Role .DEFINITION ) {
289
- List <Integer > overriddenReferenceResultIds =
290
- new ArrayList <>(symbolInformation .getOverriddenSymbolsCount ());
291
- for (int i = 0 ; i < symbolInformation .getOverriddenSymbolsCount (); i ++) {
292
- String overriddenSymbol = symbolInformation .getOverriddenSymbols (i );
293
- if (isIgnoredOverriddenSymbol (overriddenSymbol )) {
294
- continue ;
303
+ if (markupContent .length () == 0 ) {
304
+ // Always emit a non-empty hover message to prevent Sourcegraph from falling
305
+ // back to
306
+ // Search-Based hover messages.
307
+ markupContent .append (symbolInformation .getDisplayName ());
295
308
}
296
- ResultIds overriddenIds = results .getOrInsertResultSet (overriddenSymbol );
297
- overriddenReferenceResultIds .add (overriddenIds .referenceResult );
298
- writer .emitReferenceResultsItemEdge (
299
- overriddenIds .referenceResult , Collections .singletonList (rangeId ), doc .id );
309
+
310
+ int hoverId =
311
+ writer .emitHoverResult (
312
+ new MarkupContent (MarkupKind .MARKDOWN , markupContent .toString ()));
313
+ writer .emitHoverEdge (ids .resultSet , hoverId );
300
314
}
301
- if (overriddenReferenceResultIds .size () > 0 ) {
302
- writer .emitReferenceResultsItemEdge (
303
- ids .referenceResult , overriddenReferenceResultIds , doc .id );
315
+
316
+ // Overrides
317
+ if (symbolInformation .getOverriddenSymbolsCount () > 0
318
+ && supportsReferenceRelationship (symbolInformation )
319
+ && occ .getRole () == Role .DEFINITION ) {
320
+ List <Integer > overriddenReferenceResultIds =
321
+ new ArrayList <>(symbolInformation .getOverriddenSymbolsCount ());
322
+ for (int i = 0 ; i < symbolInformation .getOverriddenSymbolsCount (); i ++) {
323
+ String overriddenSymbol = symbolInformation .getOverriddenSymbols (i );
324
+ if (isIgnoredOverriddenSymbol (overriddenSymbol )) {
325
+ continue ;
326
+ }
327
+ ResultIds overriddenIds = results .getOrInsertResultSet (overriddenSymbol );
328
+ overriddenReferenceResultIds .add (overriddenIds .referenceResult );
329
+ writer .emitReferenceResultsItemEdge (
330
+ overriddenIds .referenceResult , Collections .singletonList (rangeId ), doc .id );
331
+ }
332
+ if (overriddenReferenceResultIds .size () > 0 ) {
333
+ writer .emitReferenceResultsItemEdge (
334
+ ids .referenceResult , overriddenReferenceResultIds , doc .id );
335
+ }
304
336
}
305
337
}
306
338
}
@@ -363,16 +395,19 @@ private Semanticdb.TextDocuments textDocumentsParseFromBytes(byte[] bytes) throw
363
395
in .setRecursionLimit (1000 );
364
396
return Semanticdb .TextDocuments .parseFrom (in );
365
397
} catch (NoSuchMethodError ignored ) {
366
- // NOTE(olafur): For some reason, NoSuchMethodError gets thrown when running `snapshots/run`
367
- // in the sbt build. I'm unable to reproduce the error in `snapshots/test` or when running the
398
+ // NOTE(olafur): For some reason, NoSuchMethodError gets thrown when running
399
+ // `snapshots/run`
400
+ // in the sbt build. I'm unable to reproduce the error in `snapshots/test` or
401
+ // when running the
368
402
// published version
369
403
// of `scip-java index`.
370
404
return Semanticdb .TextDocuments .parseFrom (bytes );
371
405
}
372
406
}
373
407
374
408
private boolean isIgnoredOverriddenSymbol (String symbol ) {
375
- // Skip java/lang/Object# and similar symbols from Scala since it's the parent of all classes
409
+ // Skip java/lang/Object# and similar symbols from Scala since it's the parent
410
+ // of all classes
376
411
// making it noisy for "find implementations" results.
377
412
return symbol .equals ("java/lang/Object#" );
378
413
}
0 commit comments