Skip to content

Commit bc5151a

Browse files
authored
Merge pull request #131 from sourcegraph/nsc/lsif-semanticdb-sigformat
2 parents dc3b330 + 2c6a47d commit bc5151a

File tree

122 files changed

+3701
-2941
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

122 files changed

+3701
-2941
lines changed

lsif-java/src/main/scala/com/sourcegraph/lsif_java/SemanticdbPrinters.scala

Lines changed: 22 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,10 @@ package com.sourcegraph.lsif_java
22

33
import scala.jdk.CollectionConverters._
44

5+
import com.sourcegraph.lsif_semanticdb.SignatureFormatter
6+
import com.sourcegraph.lsif_semanticdb.Symtab
57
import com.sourcegraph.semanticdb_javac.Semanticdb.SymbolOccurrence
8+
import com.sourcegraph.semanticdb_javac.Semanticdb.SymbolOccurrence.Role
69
import com.sourcegraph.semanticdb_javac.Semanticdb.TextDocument
710

811
object SemanticdbPrinters {
@@ -12,13 +15,14 @@ object SemanticdbPrinters {
1215
.asScala
1316
.groupBy(_.getRange.getStartLine)
1417
val out = new StringBuilder()
18+
val symtab = new Symtab(doc)
1519
doc
1620
.getText
1721
.linesWithSeparators
1822
.zipWithIndex
1923
.foreach { case (line, i) =>
2024
out.append(line.replace("\t", ""))
21-
val occurences = occurrencesByLine
25+
val occurrences = occurrencesByLine
2226
.getOrElse(i, Nil)
2327
.sortBy(o =>
2428
(
@@ -27,8 +31,8 @@ object SemanticdbPrinters {
2731
o.getRange.getEndCharacter
2832
)
2933
)
30-
occurences.foreach { occ =>
31-
formatOccurrence(out, occ, line)
34+
occurrences.foreach { occ =>
35+
formatOccurrence(out, occ, line, symtab)
3236
}
3337
}
3438
out.toString()
@@ -37,7 +41,8 @@ object SemanticdbPrinters {
3741
private def formatOccurrence(
3842
out: StringBuilder,
3943
occ: SymbolOccurrence,
40-
line: String
44+
line: String,
45+
symtab: Symtab
4146
): Unit = {
4247
val r = occ.getRange
4348
val isMultiline = r.getStartLine != r.getEndLine
@@ -76,6 +81,19 @@ object SemanticdbPrinters {
7681
else
7782
""
7883
)
84+
.append(
85+
symtab.symbols.asScala.get(occ.getSymbol) match {
86+
case Some(info) if occ.getRole == Role.DEFINITION =>
87+
val sig = new SignatureFormatter(info, symtab).formatSymbol()
88+
if (sig.isEmpty)
89+
" " + info.getDisplayName
90+
else
91+
" " + sig
92+
case _ =>
93+
""
94+
}
95+
)
7996
.append("\n")
8097
}
98+
8199
}

lsif-java/src/main/scala/com/sourcegraph/lsif_java/commands/SnapshotLsifCommand.scala

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ import com.sourcegraph.lsif_protocol.LsifObject
2828
import com.sourcegraph.lsif_protocol.LsifPosition
2929
import com.sourcegraph.semanticdb_javac.Semanticdb
3030
import com.sourcegraph.semanticdb_javac.Semanticdb.Language
31+
import com.sourcegraph.semanticdb_javac.Semanticdb.SymbolInformation
3132
import com.sourcegraph.semanticdb_javac.Semanticdb.SymbolOccurrence
3233
import com.sourcegraph.semanticdb_javac.Semanticdb.SymbolOccurrence.Role
3334
import com.sourcegraph.semanticdb_javac.Semanticdb.TextDocument
@@ -119,6 +120,27 @@ object SnapshotLsifCommand {
119120
.setSymbol(symbol)
120121
.build()
121122
doc.addOccurrences(occ)
123+
124+
if (isDefinition) {
125+
val hover =
126+
(
127+
for {
128+
resultSetId <- lsif.next.get(o.getId).toList
129+
hoverId <- lsif.hoverEdges.get(resultSetId).toList
130+
hover <- lsif.hoverVertexes.get(hoverId).toList
131+
contents <- hover.getContentsList.asScala
132+
if contents.getLanguage !=
133+
Language.UNKNOWN_LANGUAGE.toString.toLowerCase
134+
} yield contents.getValue
135+
).mkString("\n")
136+
val symInfo = SymbolInformation
137+
.newBuilder()
138+
// we cheese it a bit here, as this is less work than trying to reconstruct
139+
// a Signature from the pretty-printed Signature, with accompanying logic
140+
// to fallback to display_name in SemanticdbPrinters.scala
141+
.setDisplayName(hover).setSymbol(symbol).build()
142+
doc.addSymbols(symInfo)
143+
}
122144
}
123145
lsif.documents.values.map(_.build()).toList
124146
}

lsif-semanticdb/src/main/java/com/sourcegraph/lsif_semanticdb/LsifSemanticdb.java

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,8 @@ private Stream<Integer> processPath(Path path, Set<String> isExportedSymbol) {
7676
}
7777

7878
private Integer processDocument(LsifTextDocument doc, Set<String> isExportedSymbol) {
79+
Symtab symtab = new Symtab(doc.semanticdb);
80+
7981
int documentId = writer.emitDocument(doc);
8082
Set<String> localDefinitions =
8183
doc.semanticdb.getOccurrencesList().stream()
@@ -112,9 +114,21 @@ private Integer processDocument(LsifTextDocument doc, Set<String> isExportedSymb
112114
}
113115

114116
// Hover
117+
ArrayList<MarkedString> markedStrings = new ArrayList<>();
115118
String documentation = symbolInformation.getDocumentation().getMessage();
116119
if (!documentation.isEmpty()) {
117-
int hoverId = writer.emitHoverResult(doc.semanticdb.getLanguage(), documentation);
120+
markedStrings.add(new MarkedString(Semanticdb.Language.UNKNOWN_LANGUAGE, documentation));
121+
}
122+
123+
if (symbolInformation.hasSignature()) {
124+
markedStrings.add(
125+
new MarkedString(
126+
doc.semanticdb.getLanguage(),
127+
new SignatureFormatter(symbolInformation, symtab).formatSymbol()));
128+
}
129+
130+
if (!markedStrings.isEmpty()) {
131+
int hoverId = writer.emitHoverResult(markedStrings.toArray(new MarkedString[0]));
118132
writer.emitHoverEdge(ids.resultSet, hoverId);
119133
}
120134
}

lsif-semanticdb/src/main/java/com/sourcegraph/lsif_semanticdb/LsifWriter.java

Lines changed: 14 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -10,9 +10,12 @@
1010
import java.nio.file.Files;
1111
import java.nio.file.Path;
1212
import java.nio.file.StandardCopyOption;
13+
import java.util.Arrays;
14+
import java.util.Collections;
1315
import java.util.List;
1416
import java.util.Locale;
1517
import java.util.concurrent.atomic.AtomicInteger;
18+
import java.util.stream.Collectors;
1619

1720
/** High-level utility methods to write LSIF vertex/edge objects into the LSIF output stream. */
1821
public class LsifWriter implements AutoCloseable {
@@ -90,15 +93,21 @@ public int emitDefinitionResult(int resultSet) {
9093
return definitionResult;
9194
}
9295

93-
public int emitHoverResult(Semanticdb.Language language, String value) {
96+
public int emitHoverResult(MarkedString[] markedStrings) {
9497
return emitObject(
9598
lsifVertex("hoverResult")
9699
.setResult(
97100
LsifHover.newBuilder()
98-
.addContents(
99-
Content.newBuilder()
100-
.setLanguage(language.toString().toLowerCase(Locale.ROOT))
101-
.setValue(value))));
101+
.addAllContents(
102+
Arrays.stream(markedStrings)
103+
.map(
104+
(ms) ->
105+
Content.newBuilder()
106+
.setLanguage(
107+
ms.language.toString().toLowerCase(Locale.ROOT))
108+
.setValue(ms.value)
109+
.build())
110+
.collect(Collectors.toList()))));
102111
}
103112

104113
public void emitHoverEdge(int outV, int inV) {
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
package com.sourcegraph.lsif_semanticdb;
2+
3+
import com.sourcegraph.semanticdb_javac.Semanticdb;
4+
5+
public class MarkedString {
6+
public final String value;
7+
public final Semanticdb.Language language;
8+
9+
public MarkedString(Semanticdb.Language language, String value) {
10+
this.value = value;
11+
this.language = language;
12+
}
13+
}

0 commit comments

Comments
 (0)