Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 2 additions & 4 deletions .github/workflows/sourcegraph.yml
Original file line number Diff line number Diff line change
Expand Up @@ -17,9 +17,9 @@ jobs:

- uses: actions/setup-java@v3
with:
distribution: 'temurin'
distribution: "temurin"
java-version: 8
cache: 'sbt'
cache: "sbt"

Comment on lines -20 to 23
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Rest of the changes aside, let's bikeshed about this for a few days.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I have format on save enabled in VS Code and 🤷🏻 Worth adding a CI check to format the YAML files with prettier

- name: Publish CLI locally
run: sbt publishLocal dumpScipJavaVersion
Expand All @@ -35,11 +35,9 @@ jobs:
if-no-files-found: error

- name: Install src
if: startsWith(github.ref, 'refs/tags/v') || (github.ref == 'refs/heads/main')
run: yarn global add @sourcegraph/src

- name: Upload sourcegraph data
if: startsWith(github.ref, 'refs/tags/v') || (github.ref == 'refs/heads/main')
run: sbt -Dscip-java-version=$(cat VERSION) sourcegraphUpload
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
1 change: 1 addition & 0 deletions scip-semanticdb/BUILD
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@ java_library(
"//scip-java-proto/src/main/protobuf:scip_java_proto",
"//semanticdb-java",
"//semanticdb-java/src/main/protobuf:semanticdb_java_proto",
"@maven//:com_google_code_findbugs_jsr305",
"@maven//:com_google_protobuf_protobuf_java",
"@maven//:com_google_protobuf_protobuf_java_util",
],
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
import com.sourcegraph.semanticdb_javac.SemanticdbSymbols;
import com.sourcegraph.Scip;

import javax.annotation.Nullable;
import java.io.IOException;
import java.net.URI;
import java.nio.file.*;
Expand Down Expand Up @@ -126,7 +127,7 @@ private void processTypedDocument(Path path, PackageTable packages) {
continue;
}
Package pkg = packages.packageForSymbol(info.getSymbol()).orElse(Package.EMPTY);
Scip.SymbolInformation.Builder tinfo =
Scip.SymbolInformation.Builder scipInfo =
Scip.SymbolInformation.newBuilder().setSymbol(typedSymbol(info.getSymbol(), pkg));

for (int i = 0; i < info.getDefinitionRelationshipsCount(); i++) {
Expand All @@ -137,15 +138,23 @@ private void processTypedDocument(Path path, PackageTable packages) {
Package definitionSymbolPkg =
packages.packageForSymbol(definitionSymbol).orElse(Package.EMPTY);
SymbolInformation definitionInfo = symtab.symbols.get(definitionSymbol);
tinfo.addRelationships(

scipInfo.addRelationships(
Scip.Relationship.newBuilder()
.setSymbol(typedSymbol(definitionSymbol, definitionSymbolPkg))
.setIsDefinition(true)
.setIsReference(
definitionInfo != null
&& definitionInfo.getDisplayName().equals(info.getDisplayName())
&& supportsReferenceRelationship(info)));

addReferenceRelationships(
symtab, info, scipInfo, doc.definitionCliques.get(definitionSymbol), packages);
}

addReferenceRelationships(
symtab, info, scipInfo, doc.definitionCliques.get(info.getSymbol()), packages);

for (int i = 0; i < info.getOverriddenSymbolsCount(); i++) {
String overriddenSymbol = info.getOverriddenSymbols(i);
if (overriddenSymbol.isEmpty()) {
Expand All @@ -156,7 +165,7 @@ private void processTypedDocument(Path path, PackageTable packages) {
}
Package overriddenSymbolPkg =
packages.packageForSymbol(overriddenSymbol).orElse(Package.EMPTY);
tinfo.addRelationships(
scipInfo.addRelationships(
Scip.Relationship.newBuilder()
.setSymbol(typedSymbol(overriddenSymbol, overriddenSymbolPkg))
.setIsImplementation(true)
Expand All @@ -166,18 +175,45 @@ private void processTypedDocument(Path path, PackageTable packages) {
String language =
doc.semanticdb.getLanguage().toString().toLowerCase(Locale.ROOT).intern();
String signature = new SignatureFormatter(info, symtab).formatSymbol();
tinfo.addDocumentation("```" + language + "\n" + signature + "\n```");
scipInfo.addDocumentation("```" + language + "\n" + signature + "\n```");
}
String documentation = info.getDocumentation().getMessage();
if (!documentation.isEmpty()) {
tinfo.addDocumentation(documentation);
scipInfo.addDocumentation(documentation);
}
tdoc.addSymbols(tinfo);
tdoc.addSymbols(scipInfo);
}
writer.emitTyped(Scip.Index.newBuilder().addDocuments(tdoc).build());
}
}

private void addReferenceRelationships(
Symtab symtab,
SymbolInformation info,
Scip.SymbolInformation.Builder scipInfo,
@Nullable ArrayList<String> clique,
PackageTable packages) {
if (clique == null) {
return;
}
for (String symbol : clique) {
if (symbol.equals(info.getSymbol())) {
continue;
}
SymbolInformation otherInfo = symtab.symbols.get(symbol);
if (otherInfo == null) {
continue;
}
if (!symbol.endsWith(".apply().")
&& !otherInfo.getDisplayName().equals(info.getDisplayName())) {
continue;
}
Package pkg = packages.packageForSymbol(symbol).orElse(Package.EMPTY);
scipInfo.addRelationships(
Scip.Relationship.newBuilder().setSymbol(typedSymbol(symbol, pkg)).setIsReference(true));
}
}

private Scip.Index typedMetadata() {
return Scip.Index.newBuilder()
.setMetadata(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,14 @@ public class ScipTextDocument {
public int id;
public final Map<String, Semanticdb.SymbolInformation> symbols;
public final Map<String, ResultIds> localSymbols;
// Map from symbols that have a definition occurrence to the list of symbols that have
// `is_definition` relationships to that symbol.
// This map is used to add `is_reference` relationships between all symbols in the list so that
// doing "Find references"
// on any of those symbols returns occurrences for all of the symbols in the "clique" (per
// https://en.wikipedia.org/wiki/Clique_(graph_theory)).
// See https://github.com/sourcegraph/sourcegraph/issues/50927 for more details.
public final Map<String, ArrayList<String>> definitionCliques = new HashMap<>();

public ScipTextDocument(
Path semanticdbPath, Semanticdb.TextDocument semanticdb, Path sourceroot) {
Expand Down Expand Up @@ -79,7 +87,7 @@ private void setSemanticdb(Semanticdb.TextDocument semanticdb) {
}
}

public static Semanticdb.TextDocument manifestOccurrencesForSyntheticSymbols(
public Semanticdb.TextDocument manifestOccurrencesForSyntheticSymbols(
Semanticdb.TextDocument semanticdb) {
if (semanticdb.getLanguage() != Semanticdb.Language.SCALA) {
// It's only semanticdb-scalac that emits SymbolInformation for symbols that have no
Expand All @@ -98,13 +106,18 @@ public static Semanticdb.TextDocument manifestOccurrencesForSyntheticSymbols(
Semanticdb.SymbolInformation.Builder newInfo = Semanticdb.SymbolInformation.newBuilder(info);
Semanticdb.SymbolOccurrence definition = definitionOccurrences.get(info.getSymbol());
if (definition != null) {
// This symbol has a definition so it doesn't need an is_definition relationship.
builder.addSymbols(newInfo);
continue;
}
for (Semanticdb.SymbolOccurrence alternativeSymbol : alternativeSymbols(info)) {
Semanticdb.SymbolOccurrence alternativeDefinition =
definitionOccurrences.get(alternativeSymbol.getSymbol());
if (alternativeDefinition != null) {
ArrayList<String> clique =
this.definitionCliques.computeIfAbsent(
alternativeSymbol.getSymbol(), k -> new ArrayList<>());
clique.add(info.getSymbol());
newInfo.addDefinitionRelationships(alternativeDefinition.getSymbol());
break;
}
Expand Down
4 changes: 4 additions & 0 deletions tests/snapshots/src/main/generated/BaseByteRenderer.scala
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@ import upickle.core.{ArrVisitor, ObjVisitor}
class BaseByteRenderer[T <: upickle.core.ByteOps.Output]
// ^^^^^^^^^^^^^^^^ definition semanticdb maven maven/com.lihaoyi/ujson_2.13 1.4.0 ujson/BaseByteRenderer#
// documentation ```scala\nclass BaseByteRenderer[T <: Output]\n```
// relationship is_reference semanticdb maven maven/com.lihaoyi/ujson_2.13 1.4.0 ujson/BaseByteRenderer.
// ________________ synthetic_definition semanticdb maven maven/com.lihaoyi/ujson_2.13 1.4.0 ujson/BaseByteRenderer.
// documentation ```scala\nobject BaseByteRenderer\n```
// relationship is_definition semanticdb maven maven/com.lihaoyi/ujson_2.13 1.4.0 ujson/BaseByteRenderer#
Expand All @@ -36,20 +37,23 @@ class BaseByteRenderer[T <: upickle.core.ByteOps.Output]
(out: T,
// ^^^ definition semanticdb maven maven/com.lihaoyi/ujson_2.13 1.4.0 ujson/BaseByteRenderer#out.
// documentation ```scala\nprivate[this] val out: T\n```
// relationship is_reference semanticdb maven maven/com.lihaoyi/ujson_2.13 1.4.0 ujson/BaseByteRenderer#`<init>`().(out)
// ___ synthetic_definition semanticdb maven maven/com.lihaoyi/ujson_2.13 1.4.0 ujson/BaseByteRenderer#`<init>`().(out)
// documentation ```scala\nout: T \n```
// relationship is_reference is_definition semanticdb maven maven/com.lihaoyi/ujson_2.13 1.4.0 ujson/BaseByteRenderer#out.
// ^ reference semanticdb maven maven/com.lihaoyi/ujson_2.13 1.4.0 ujson/BaseByteRenderer#[T]
indent: Int = -1,
// ^^^^^^ definition semanticdb maven maven/com.lihaoyi/ujson_2.13 1.4.0 ujson/BaseByteRenderer#indent.
// documentation ```scala\nprivate[this] val indent: Int\n```
// relationship is_reference semanticdb maven maven/com.lihaoyi/ujson_2.13 1.4.0 ujson/BaseByteRenderer#`<init>`().(indent)
// ______ synthetic_definition semanticdb maven maven/com.lihaoyi/ujson_2.13 1.4.0 ujson/BaseByteRenderer#`<init>`().(indent)
// documentation ```scala\ndefault indent: Int \n```
// relationship is_reference is_definition semanticdb maven maven/com.lihaoyi/ujson_2.13 1.4.0 ujson/BaseByteRenderer#indent.
// ^^^ reference semanticdb maven maven/org.scala-lang/scala-library 2.13.10 scala/Int#
escapeUnicode: Boolean = false) extends JsVisitor[T, T]{
// ^^^^^^^^^^^^^ definition semanticdb maven maven/com.lihaoyi/ujson_2.13 1.4.0 ujson/BaseByteRenderer#escapeUnicode.
// documentation ```scala\nprivate[this] val escapeUnicode: Boolean\n```
// relationship is_reference semanticdb maven maven/com.lihaoyi/ujson_2.13 1.4.0 ujson/BaseByteRenderer#`<init>`().(escapeUnicode)
// _____________ synthetic_definition semanticdb maven maven/com.lihaoyi/ujson_2.13 1.4.0 ujson/BaseByteRenderer#`<init>`().(escapeUnicode)
// documentation ```scala\ndefault escapeUnicode: Boolean \n```
// relationship is_reference is_definition semanticdb maven maven/com.lihaoyi/ujson_2.13 1.4.0 ujson/BaseByteRenderer#escapeUnicode.
Expand Down
4 changes: 4 additions & 0 deletions tests/snapshots/src/main/generated/BaseCharRenderer.scala
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@ import upickle.core.{ArrVisitor, ObjVisitor}
class BaseCharRenderer[T <: upickle.core.CharOps.Output]
// ^^^^^^^^^^^^^^^^ definition semanticdb maven maven/com.lihaoyi/ujson_2.13 1.4.0 ujson/BaseCharRenderer#
// documentation ```scala\nclass BaseCharRenderer[T <: Output]\n```
// relationship is_reference semanticdb maven maven/com.lihaoyi/ujson_2.13 1.4.0 ujson/BaseCharRenderer.
// ________________ synthetic_definition semanticdb maven maven/com.lihaoyi/ujson_2.13 1.4.0 ujson/BaseCharRenderer.
// documentation ```scala\nobject BaseCharRenderer\n```
// relationship is_definition semanticdb maven maven/com.lihaoyi/ujson_2.13 1.4.0 ujson/BaseCharRenderer#
Expand All @@ -36,20 +37,23 @@ class BaseCharRenderer[T <: upickle.core.CharOps.Output]
(out: T,
// ^^^ definition semanticdb maven maven/com.lihaoyi/ujson_2.13 1.4.0 ujson/BaseCharRenderer#out.
// documentation ```scala\nprivate[this] val out: T\n```
// relationship is_reference semanticdb maven maven/com.lihaoyi/ujson_2.13 1.4.0 ujson/BaseCharRenderer#`<init>`().(out)
// ___ synthetic_definition semanticdb maven maven/com.lihaoyi/ujson_2.13 1.4.0 ujson/BaseCharRenderer#`<init>`().(out)
// documentation ```scala\nout: T \n```
// relationship is_reference is_definition semanticdb maven maven/com.lihaoyi/ujson_2.13 1.4.0 ujson/BaseCharRenderer#out.
// ^ reference semanticdb maven maven/com.lihaoyi/ujson_2.13 1.4.0 ujson/BaseCharRenderer#[T]
indent: Int = -1,
// ^^^^^^ definition semanticdb maven maven/com.lihaoyi/ujson_2.13 1.4.0 ujson/BaseCharRenderer#indent.
// documentation ```scala\nprivate[this] val indent: Int\n```
// relationship is_reference semanticdb maven maven/com.lihaoyi/ujson_2.13 1.4.0 ujson/BaseCharRenderer#`<init>`().(indent)
// ______ synthetic_definition semanticdb maven maven/com.lihaoyi/ujson_2.13 1.4.0 ujson/BaseCharRenderer#`<init>`().(indent)
// documentation ```scala\ndefault indent: Int \n```
// relationship is_reference is_definition semanticdb maven maven/com.lihaoyi/ujson_2.13 1.4.0 ujson/BaseCharRenderer#indent.
// ^^^ reference semanticdb maven maven/org.scala-lang/scala-library 2.13.10 scala/Int#
escapeUnicode: Boolean = false) extends JsVisitor[T, T]{
// ^^^^^^^^^^^^^ definition semanticdb maven maven/com.lihaoyi/ujson_2.13 1.4.0 ujson/BaseCharRenderer#escapeUnicode.
// documentation ```scala\nprivate[this] val escapeUnicode: Boolean\n```
// relationship is_reference semanticdb maven maven/com.lihaoyi/ujson_2.13 1.4.0 ujson/BaseCharRenderer#`<init>`().(escapeUnicode)
// _____________ synthetic_definition semanticdb maven maven/com.lihaoyi/ujson_2.13 1.4.0 ujson/BaseCharRenderer#`<init>`().(escapeUnicode)
// documentation ```scala\ndefault escapeUnicode: Boolean \n```
// relationship is_reference is_definition semanticdb maven maven/com.lihaoyi/ujson_2.13 1.4.0 ujson/BaseCharRenderer#escapeUnicode.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,37 +4,52 @@ package minimized
case class Issue396(a: Int)
// ^^^^^^^^ definition semanticdb maven . . minimized/Issue396#
// documentation ```scala\ncase class Issue396(a: Int)\n```
// relationship is_reference semanticdb maven . . minimized/Issue396.
// relationship is_reference semanticdb maven . . minimized/Issue396.apply().
// ________ synthetic_definition semanticdb maven . . minimized/Issue396#copy().
// documentation ```scala\ndef copy(a: Int): Issue396\n```
// relationship is_definition semanticdb maven . . minimized/Issue396#
// relationship is_reference semanticdb maven . . minimized/Issue396.apply().
// ________ synthetic_definition semanticdb maven . . minimized/Issue396#productElement().
// documentation ```scala\ndef productElement(x$1: Int): Any\n```
// relationship is_definition semanticdb maven . . minimized/Issue396#
// relationship is_reference semanticdb maven . . minimized/Issue396.apply().
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Lifting from slack: both @olafurpg and I agree that productElement* family of methods shouldn't be referencing apply

copy is fine
default constructor is fine-ish (even though it's the other way around?)

// relationship is_reference is_implementation semanticdb maven . . scala/Product#productElement().
// ________ synthetic_definition semanticdb maven . . minimized/Issue396.
// documentation ```scala\nobject Issue396\n```
// relationship is_definition semanticdb maven . . minimized/Issue396#
// relationship is_reference semanticdb maven . . minimized/Issue396.apply().
// ________ synthetic_definition semanticdb maven . . minimized/Issue396.apply().
// documentation ```scala\ndef apply(a: Int): Issue396\n```
// relationship is_definition semanticdb maven . . minimized/Issue396#
// relationship is_reference is_implementation semanticdb maven . . scala/Function1#apply().
// ________ synthetic_definition semanticdb maven . . minimized/Issue396#productElementName().
// documentation ```scala\ndef productElementName(x$1: Int): String\n```
// relationship is_definition semanticdb maven . . minimized/Issue396#
// relationship is_reference semanticdb maven . . minimized/Issue396.apply().
// relationship is_reference is_implementation semanticdb maven . . scala/Product#productElementName().
// ^ definition semanticdb maven . . minimized/Issue396#`<init>`().
// documentation ```scala\ndef this(a: Int)\n```
// ^ definition semanticdb maven . . minimized/Issue396#a.
// documentation ```scala\nval a: Int\n```
// relationship is_reference semanticdb maven . . minimized/Issue396#`<init>`().(a)
// relationship is_reference semanticdb maven . . minimized/Issue396#copy().(a)
// relationship is_reference semanticdb maven . . minimized/Issue396.apply().(a)
// _ synthetic_definition semanticdb maven . . minimized/Issue396.apply().(a)
// documentation ```scala\na: Int \n```
// relationship is_reference semanticdb maven . . minimized/Issue396#`<init>`().(a)
// relationship is_reference is_definition semanticdb maven . . minimized/Issue396#a.
// relationship is_reference semanticdb maven . . minimized/Issue396#copy().(a)
// _ synthetic_definition semanticdb maven . . minimized/Issue396#`<init>`().(a)
// documentation ```scala\na: Int \n```
// relationship is_reference is_definition semanticdb maven . . minimized/Issue396#a.
// relationship is_reference semanticdb maven . . minimized/Issue396#copy().(a)
// relationship is_reference semanticdb maven . . minimized/Issue396.apply().(a)
// _ synthetic_definition semanticdb maven . . minimized/Issue396#copy().(a)
// documentation ```scala\ndefault a: Int \n```
// relationship is_reference semanticdb maven . . minimized/Issue396#`<init>`().(a)
// relationship is_reference is_definition semanticdb maven . . minimized/Issue396#a.
// relationship is_reference semanticdb maven . . minimized/Issue396.apply().(a)
// ^^^ reference semanticdb maven . . scala/Int#
object Issue396App {
// ^^^^^^^^^^^ definition semanticdb maven . . minimized/Issue396App.
Expand Down
Loading