Skip to content

Commit 7561f5a

Browse files
authored
Merge pull request #570 from sourcegraph/olafurpg/regression
Fix a regression where the SCIP index contained invalid symbols
2 parents f36c68a + 19bf935 commit 7561f5a

27 files changed

+246
-185
lines changed

scip-java/src/main/scala/com/sourcegraph/scip_java/ScipPrinters.scala

+4
Original file line numberDiff line numberDiff line change
@@ -149,6 +149,10 @@ object ScipPrinters {
149149
caretCharacter * width
150150

151151
val symbol = syntheticDefinition.fold(occ.getSymbol)(_.getSymbol)
152+
153+
// Fail the tests if the index contains symbols that don't parse as valid SCIP symbols.
154+
val _ = ScipSymbol.parseOrThrowExceptionIfInvalid(symbol)
155+
152156
out
153157
.append(comment)
154158
.append(indent)
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
package com.sourcegraph.scip_java
2+
3+
import com.sourcegraph.scip_semanticdb.SymbolDescriptor
4+
import com.sourcegraph.semanticdb_javac.SemanticdbSymbols
5+
6+
sealed abstract class ScipSymbol {}
7+
final case class LocalScipSymbol(identifier: String) extends ScipSymbol
8+
final case class GlobalScipSymbol(
9+
scheme: String,
10+
packageManager: String,
11+
packageName: String,
12+
packageVersion: String,
13+
descriptors: List[SymbolDescriptor]
14+
) extends ScipSymbol
15+
16+
object ScipSymbol {
17+
18+
def parseOrThrowExceptionIfInvalid(scipSymbol: String): ScipSymbol = {
19+
if (scipSymbol.startsWith("local ")) {
20+
LocalScipSymbol(scipSymbol.stripPrefix("local "))
21+
} else {
22+
scipSymbol.split(" ", 5) match {
23+
case Array(
24+
scheme,
25+
packageManager,
26+
packageName,
27+
packageVersion,
28+
descriptor
29+
) =>
30+
GlobalScipSymbol(
31+
scheme,
32+
packageManager,
33+
packageName,
34+
packageVersion,
35+
parseDescriptors(descriptor)
36+
)
37+
case _ =>
38+
throw new IllegalArgumentException(
39+
s"Invalid scip symbol: $scipSymbol"
40+
)
41+
}
42+
}
43+
}
44+
45+
private def parseDescriptors(
46+
semanticdbSymbol: String
47+
): List[SymbolDescriptor] = {
48+
val descriptor = SymbolDescriptor.parseFromSymbol(semanticdbSymbol)
49+
if (descriptor.owner == SemanticdbSymbols.ROOT_PACKAGE)
50+
Nil
51+
else
52+
descriptor :: parseDescriptors(descriptor.owner)
53+
}
54+
55+
}

scip-semanticdb/src/main/java/com/sourcegraph/scip_semanticdb/ScipSemanticdb.java

+3-1
Original file line numberDiff line numberDiff line change
@@ -137,9 +137,11 @@ private void processTypedDocument(
137137
ArrayList<String> inverseReferences = references.map.get(info.getSymbol());
138138
if (inverseReferences != null) {
139139
for (String inverseReference : inverseReferences) {
140+
Package inverseReferencePkg =
141+
packages.packageForSymbol(inverseReference).orElse(Package.EMPTY);
140142
scipInfo.addRelationships(
141143
Scip.Relationship.newBuilder()
142-
.setSymbol(inverseReference)
144+
.setSymbol(typedSymbol(inverseReference, inverseReferencePkg))
143145
.setIsImplementation(true)
144146
.setIsReference(true));
145147
}

tests/snapshots/src/main/generated/ByteParser.scala

+3-3
Original file line numberDiff line numberDiff line change
@@ -107,9 +107,9 @@ abstract class ByteParser[J] extends upickle.core.BufferingByteParser{
107107
protected[this] def close(): Unit
108108
// ^^^^^ definition semanticdb maven maven/com.lihaoyi/ujson_2.13 1.4.0 ujson/ByteParser#close().
109109
// documentation ```scala\ndef close(): Unit\n```
110-
// relationship is_reference is_implementation ujson/ByteArrayParser#close().
111-
// relationship is_reference is_implementation ujson/ByteBufferParser#close().
112-
// relationship is_reference is_implementation ujson/InputStreamParser#close().
110+
// relationship is_reference is_implementation semanticdb maven maven/com.lihaoyi/ujson_2.13 1.4.0 ujson/ByteArrayParser#close().
111+
// relationship is_reference is_implementation semanticdb maven maven/com.lihaoyi/ujson_2.13 1.4.0 ujson/ByteBufferParser#close().
112+
// relationship is_reference is_implementation semanticdb maven maven/com.lihaoyi/ujson_2.13 1.4.0 ujson/InputStreamParser#close().
113113
// ^^^^ reference semanticdb maven maven/org.scala-lang/scala-library 2.13.10 scala/Unit#
114114

115115
/**

tests/snapshots/src/main/generated/CharParser.scala

+2-2
Original file line numberDiff line numberDiff line change
@@ -107,8 +107,8 @@ abstract class CharParser[J] extends upickle.core.BufferingCharParser{
107107
protected[this] def close(): Unit
108108
// ^^^^^ definition semanticdb maven maven/com.lihaoyi/ujson_2.13 1.4.0 ujson/CharParser#close().
109109
// documentation ```scala\ndef close(): Unit\n```
110-
// relationship is_reference is_implementation ujson/CharSequenceParser#close().
111-
// relationship is_reference is_implementation ujson/StringParser#close().
110+
// relationship is_reference is_implementation semanticdb maven maven/com.lihaoyi/ujson_2.13 1.4.0 ujson/CharSequenceParser#close().
111+
// relationship is_reference is_implementation semanticdb maven maven/com.lihaoyi/ujson_2.13 1.4.0 ujson/StringParser#close().
112112
// ^^^^ reference semanticdb maven maven/org.scala-lang/scala-library 2.13.10 scala/Unit#
113113

114114
/**

tests/snapshots/src/main/generated/com/airbnb/epoxy/AsyncEpoxyDiffer.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,7 @@ interface ResultCallback {
6060
void onResult(@NonNull DiffResult result);
6161
// ^^^^^^^^ definition semanticdb maven . . com/airbnb/epoxy/AsyncEpoxyDiffer#ResultCallback#onResult().
6262
// documentation ```java\npublic abstract void onResult(DiffResult result)\n```
63-
// relationship is_reference is_implementation com/airbnb/epoxy/EpoxyControllerAdapter#onResult().
63+
// relationship is_reference is_implementation semanticdb maven . . com/airbnb/epoxy/EpoxyControllerAdapter#onResult().
6464
// ^^^^^^^ reference semanticdb maven maven/androidx.annotation/annotation 1.1.0 androidx/annotation/NonNull#
6565
// ^^^^^^^^^^ reference semanticdb maven . . com/airbnb/epoxy/DiffResult#
6666
// ^^^^^^ definition local 0

0 commit comments

Comments
 (0)