Skip to content

Commit

Permalink
Merge pull request #566 from sourcegraph/olafurpg/reference-bijection
Browse files Browse the repository at this point in the history
Emit inverse relationships
  • Loading branch information
olafurpg authored May 2, 2023
2 parents b847cd1 + ef1e175 commit f36c68a
Show file tree
Hide file tree
Showing 29 changed files with 276 additions and 6 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,10 @@ final case class IndexSemanticdbCommand(
@Description(
"Whether to infer the location of SemanticDB files based as produced by Bazel"
) bazel: Boolean = true,
@Description(
"Whether to emit parent->child relationships for 'Find references' and 'Find implementations'. " +
"This flag exists as a workaround for the issue https://github.com/sourcegraph/sourcegraph/issues/50927"
) emitInverseRelationships: Boolean = true,
@Description("URL to a PackageHub instance")
@Hidden
packagehub: Option[String] = None,
Expand Down Expand Up @@ -85,7 +89,8 @@ final case class IndexSemanticdbCommand(
format,
parallel,
packages.map(_.toPackageInformation).asJava,
buildKind
buildKind,
emitInverseRelationships
)
ScipSemanticdb.run(options)
postPackages(packages)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,6 @@
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.PathMatcher;
import java.sql.Array;
import java.util.*;
import java.util.stream.Collectors;
import java.util.stream.Stream;
Expand Down Expand Up @@ -48,7 +47,8 @@ public void error(Throwable e) {
ScipOutputFormat.TYPED_PROTOBUF,
options.parallel,
mavenPackages,
"");
"",
true);
ScipSemanticdb.run(scipOptions);
if (!scipOptions.reporter.hasErrors()) {
System.out.println("done: " + scipOptions.output);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -65,7 +65,8 @@ private void run() throws IOException {

private void runTyped(List<Path> files, PackageTable packages) {
writer.emitTyped(typedMetadata());
filesStream(files).forEach(document -> processTypedDocument(document, packages));
InverseReferenceRelationships references = inverseReferenceRelationships(files);
filesStream(files).forEach(document -> processTypedDocument(document, packages, references));
}

private String typedSymbol(String symbol, Package pkg) {
Expand All @@ -82,7 +83,8 @@ public static boolean isDefinitionRole(Role role) {
return role == Role.DEFINITION || role == Role.SYNTHETIC_DEFINITION;
}

private void processTypedDocument(Path path, PackageTable packages) {
private void processTypedDocument(
Path path, PackageTable packages, InverseReferenceRelationships references) {
for (ScipTextDocument doc : parseTextDocument(path).collect(Collectors.toList())) {
if (doc.semanticdb.getOccurrencesCount() == 0) {
continue;
Expand Down Expand Up @@ -130,6 +132,19 @@ private void processTypedDocument(Path path, PackageTable packages) {
Scip.SymbolInformation.Builder scipInfo =
Scip.SymbolInformation.newBuilder().setSymbol(typedSymbol(info.getSymbol(), pkg));

// TODO: this can be removed once https://github.com/sourcegraph/sourcegraph/issues/50927 is
// fixed.
ArrayList<String> inverseReferences = references.map.get(info.getSymbol());
if (inverseReferences != null) {
for (String inverseReference : inverseReferences) {
scipInfo.addRelationships(
Scip.Relationship.newBuilder()
.setSymbol(inverseReference)
.setIsImplementation(true)
.setIsReference(true));
}
}

for (int i = 0; i < info.getDefinitionRelationshipsCount(); i++) {
String definitionSymbol = info.getDefinitionRelationships(i);
if (definitionSymbol.isEmpty()) {
Expand Down Expand Up @@ -245,6 +260,50 @@ private Stream<Path> filesStream(List<Path> files) {
return options.parallel ? files.parallelStream() : files.stream();
}

private static class InverseReferenceRelationships {
public final Map<String, ArrayList<String>> map;

private InverseReferenceRelationships(Map<String, ArrayList<String>> map) {
this.map = map;
}
}

private InverseReferenceRelationships inverseReferenceRelationships(List<Path> files) {
if (!options.emitInverseRelationships) {
return new InverseReferenceRelationships(Collections.emptyMap());
}
return new InverseReferenceRelationships(
filesStream(files)
.flatMap(this::parseTextDocument)
.flatMap(this::referenceRelationships)
.collect(
Collectors.groupingBy(
SymbolRelationship::getTo,
Collectors.mapping(
SymbolRelationship::getFrom, Collectors.toCollection(ArrayList::new)))));
}

private Stream<SymbolRelationship> referenceRelationships(ScipTextDocument document) {
ArrayList<SymbolRelationship> relationships = new ArrayList<>();
for (int i = 0; i < document.semanticdb.getSymbolsCount(); i++) {
SymbolInformation info = document.semanticdb.getSymbols(i);
if (!supportsReferenceRelationship(info)) {
continue;
}
if (info.getSymbol().isEmpty() || SemanticdbSymbols.isLocal(info.getSymbol())) {
continue;
}
for (int j = 0; j < info.getOverriddenSymbolsCount(); j++) {
String overriddenSymbol = info.getOverriddenSymbols(j);
if (SemanticdbSymbols.isLocal(overriddenSymbol)) {
continue;
}
relationships.add(new SymbolRelationship(info.getSymbol(), overriddenSymbol));
}
}
return relationships.stream();
}

private Set<String> exportSymbols(List<Path> files) {
return filesStream(files)
.flatMap(this::parseTextDocument)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@ public class ScipSemanticdbOptions {
public final boolean parallel;
public final List<MavenPackage> packages;
public final String buildKind;
public final boolean emitInverseRelationships;

public ScipSemanticdbOptions(
List<Path> targetroots,
Expand All @@ -28,7 +29,8 @@ public ScipSemanticdbOptions(
ScipOutputFormat format,
boolean parallel,
List<MavenPackage> packages,
String buildKind) {
String buildKind,
boolean emitInverseRelationships) {
this.targetroots = targetroots;
this.output = output;
this.sourceroot = sourceroot;
Expand All @@ -39,5 +41,6 @@ public ScipSemanticdbOptions(
this.parallel = parallel;
this.packages = packages;
this.buildKind = buildKind;
this.emitInverseRelationships = emitInverseRelationships;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
package com.sourcegraph.scip_semanticdb;

public class SymbolRelationship {
public final String from;
public final String to;

public SymbolRelationship(String from, String to) {
this.from = from;
this.to = to;
}

public String getFrom() {
return from;
}

public String getTo() {
return to;
}
}
3 changes: 3 additions & 0 deletions tests/snapshots/src/main/generated/ByteParser.scala
Original file line number Diff line number Diff line change
Expand Up @@ -107,6 +107,9 @@ abstract class ByteParser[J] extends upickle.core.BufferingByteParser{
protected[this] def close(): Unit
// ^^^^^ definition semanticdb maven maven/com.lihaoyi/ujson_2.13 1.4.0 ujson/ByteParser#close().
// documentation ```scala\ndef close(): Unit\n```
// relationship is_reference is_implementation ujson/ByteArrayParser#close().
// relationship is_reference is_implementation ujson/ByteBufferParser#close().
// relationship is_reference is_implementation ujson/InputStreamParser#close().
// ^^^^ reference semanticdb maven maven/org.scala-lang/scala-library 2.13.10 scala/Unit#

/**
Expand Down
2 changes: 2 additions & 0 deletions tests/snapshots/src/main/generated/CharParser.scala
Original file line number Diff line number Diff line change
Expand Up @@ -107,6 +107,8 @@ abstract class CharParser[J] extends upickle.core.BufferingCharParser{
protected[this] def close(): Unit
// ^^^^^ definition semanticdb maven maven/com.lihaoyi/ujson_2.13 1.4.0 ujson/CharParser#close().
// documentation ```scala\ndef close(): Unit\n```
// relationship is_reference is_implementation ujson/CharSequenceParser#close().
// relationship is_reference is_implementation ujson/StringParser#close().
// ^^^^ reference semanticdb maven maven/org.scala-lang/scala-library 2.13.10 scala/Unit#

/**
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -60,6 +60,7 @@ interface ResultCallback {
void onResult(@NonNull DiffResult result);
// ^^^^^^^^ definition semanticdb maven . . com/airbnb/epoxy/AsyncEpoxyDiffer#ResultCallback#onResult().
// documentation ```java\npublic abstract void onResult(DiffResult result)\n```
// relationship is_reference is_implementation com/airbnb/epoxy/EpoxyControllerAdapter#onResult().
// ^^^^^^^ reference semanticdb maven maven/androidx.annotation/annotation 1.1.0 androidx/annotation/NonNull#
// ^^^^^^^^^^ reference semanticdb maven . . com/airbnb/epoxy/DiffResult#
// ^^^^^^ definition local 0
Expand Down
Loading

0 comments on commit f36c68a

Please sign in to comment.