Skip to content

Commit a86c1cc

Browse files
authored
replace emitting MarkedString[] with MarkupContent (#179)
1 parent c620f59 commit a86c1cc

File tree

9 files changed

+212
-193
lines changed

9 files changed

+212
-193
lines changed

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

Lines changed: 43 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -128,11 +128,13 @@ object SnapshotLsifCommand {
128128
resultSetId <- lsif.next.get(o.getId).toList
129129
hoverId <- lsif.hoverEdges.get(resultSetId).toList
130130
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")
131+
contents <- hover.getContents.getValue
132+
} yield contents
133+
).mkString
134+
.split("\n---\n")
135+
.last
136+
.stripPrefix("```java\n")
137+
.stripSuffix("\n```")
136138
val symInfo = SymbolInformation
137139
.newBuilder()
138140
// we cheese it a bit here, as this is less work than trying to reconstruct
@@ -174,14 +176,19 @@ object SnapshotLsifCommand {
174176
.map(m => m.getIdentifier -> m)
175177
.toMap
176178
val hovers: Map[String, String] = monikers.map { case (sym, obj) =>
177-
val hoverMessage =
179+
val hover =
178180
for {
179181
resultSet <- monikerInverse.get(obj.getId).toList
180182
hoverEdge <- hoverEdges.get(resultSet).toList
181183
hoverResult <- hoverVertexes.get(hoverEdge).toList
182-
contents <- hoverResult.getContentsList.asScala
183-
} yield contents.getValue.trim
184-
sym -> hoverMessage.mkString("\n\n")
184+
contents = hoverResult.getContents.getValue.trim
185+
codeFence <- contents
186+
.linesIterator
187+
.dropWhile(_ != "```java")
188+
.drop(1)
189+
.takeWhile(_ != "```")
190+
} yield codeFence
191+
sym -> hover.mkString("\n\n")
185192
}
186193

187194
def visualizeGraph(): String = {
@@ -193,7 +200,7 @@ object SnapshotLsifCommand {
193200
import org.scalameta.ascii.graph.Graph
194201
val monikers =
195202
byLabel("moniker")
196-
.filter(o => o.getType() == "vertex" && o.getIdentifier() == symbol)
203+
.filter(o => o.getType == "vertex" && o.getIdentifier == symbol)
197204
.toList
198205
val moniker =
199206
monikers match {
@@ -209,56 +216,54 @@ object SnapshotLsifCommand {
209216
val edges = ListBuffer.empty[(String, String)]
210217
val inputs = mutable.Map.empty[String, Input]
211218
def input(range: LsifObject): Input = {
212-
val uri = G
213-
.predecessors(range)
214-
.asScala
215-
.iterator
216-
.filter(_.getLabel() == "document")
217-
.next()
218-
.getUri()
219+
val uri =
220+
G.predecessors(range)
221+
.asScala
222+
.iterator
223+
.filter(_.getLabel == "document")
224+
.next()
225+
.getUri
219226
inputs.getOrElseUpdate(uri, Input.path(Paths.get(URI.create(uri))))
220227
}
221228
def renderPos(pos: LsifPosition): String = {
222-
s"${pos.getLine()}:${pos.getCharacter()}"
229+
s"${pos.getLine}:${pos.getCharacter}"
223230
}
224231
val addedVertexes = mutable.Set.empty[String]
225232
def render(node: LsifObject): String = {
226-
(node.getType(), node.getLabel()) match {
233+
(node.getType, node.getLabel) match {
227234
case ("vertex", "document") =>
228235
val filename = sourceroot
229-
.relativize(Paths.get(URI.create(node.getUri())))
236+
.relativize(Paths.get(URI.create(node.getUri)))
230237
.iterator()
231238
.asScala
232239
.mkString("/")
233240
s"document ${filename}"
234241
case ("vertex", "hoverResult") =>
235242
val contents = node
236-
.getResult()
237-
.getContentsList()
238-
.asScala
239-
.map(_.getValue())
240-
.mkString("\n")
243+
.getResult
244+
.getContents
245+
.getValue
241246
.replace("\n", "\\n")
242247
.trim()
243-
s"hoverResult(${node.getId()}) ${contents}"
248+
s"hoverResult(${node.getId}) ${contents}"
244249
case ("vertex", "moniker") =>
245-
s"moniker ${node.getIdentifier()}"
250+
s"moniker ${node.getIdentifier}"
246251
case ("vertex", "range") =>
247252
val i = input(node)
248253
val p = Position.range(
249254
i,
250-
node.getStart().getLine(),
251-
node.getStart().getCharacter(),
252-
node.getEnd().getLine(),
253-
node.getEnd().getCharacter()
255+
node.getStart.getLine,
256+
node.getStart.getCharacter,
257+
node.getEnd.getLine,
258+
node.getEnd.getCharacter
254259
)
255-
s"range(${node.getId()}) ${renderPos(node.getStart())} '${p.text}'"
260+
s"range(${node.getId}) ${renderPos(node.getStart)} '${p.text}'"
256261
case ("vertex", "packageInformation") =>
257-
s"${node.getName()}(${node.getId()})"
262+
s"${node.getName}(${node.getId})"
258263
case ("vertex", label) =>
259-
s"${label}(${node.getId()})"
264+
s"${label}(${node.getId})"
260265
case _ =>
261-
s"${node.getType}/${node.getLabel} (${node.getId()})"
266+
s"${node.getType}/${node.getLabel} (${node.getId})"
262267
}
263268
}
264269
def isAdded(vertex: LsifObject) = addedVertexes.contains(render(vertex))
@@ -309,14 +314,14 @@ object SnapshotLsifCommand {
309314
val S = GraphBuilder.directed().immutable[LsifObject]()
310315
val visited = mutable.Set.empty[Int]
311316
def loop(l: LsifObject): Unit = {
312-
if (visited.add(l.getId())) {
317+
if (visited.add(l.getId)) {
313318
S.addNode(l)
314319
G.predecessors(l)
315320
.forEach { n =>
316321
S.putEdge(EndpointPair.ordered(l, n))
317322
loop(n)
318323
}
319-
if (isSuccessorRelevantLabel(l.getLabel())) {
324+
if (isSuccessorRelevantLabel(l.getLabel)) {
320325
G.successors(l)
321326
.forEach { n =>
322327
S.putEdge(EndpointPair.ordered(n, l))
@@ -357,7 +362,7 @@ object SnapshotLsifCommand {
357362
} {
358363
B.addEdge(
359364
EndpointPair.ordered(outV, inV),
360-
o.toBuilder().clearInVs().setInV(inId).build()
365+
o.toBuilder.clearInVs().setInV(inId).build()
361366
)
362367
}
363368
}

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

Lines changed: 24 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package com.sourcegraph.lsif_semanticdb;
22

3+
import com.sourcegraph.lsif_protocol.MarkupKind;
34
import com.sourcegraph.semanticdb_javac.Semanticdb;
45
import com.sourcegraph.semanticdb_javac.Semanticdb.SymbolInformation;
56
import com.sourcegraph.semanticdb_javac.Semanticdb.SymbolOccurrence;
@@ -8,12 +9,7 @@
89
import java.io.IOException;
910
import java.nio.file.Files;
1011
import java.nio.file.Path;
11-
import java.util.ArrayList;
12-
import java.util.LinkedHashSet;
13-
import java.util.List;
14-
import java.util.Map;
15-
import java.util.NoSuchElementException;
16-
import java.util.Set;
12+
import java.util.*;
1713
import java.util.concurrent.ConcurrentHashMap;
1814
import java.util.stream.Collectors;
1915
import java.util.stream.Stream;
@@ -127,21 +123,35 @@ private Integer processDocument(
127123
}
128124

129125
// Hover
130-
ArrayList<MarkedString> markedStrings = new ArrayList<>();
131126
String documentation = symbolInformation.getDocumentation().getMessage();
127+
128+
StringBuilder markupContent = new StringBuilder(documentation.length());
129+
132130
if (!documentation.isEmpty()) {
133-
markedStrings.add(new MarkedString(Semanticdb.Language.UNKNOWN_LANGUAGE, documentation));
131+
markupContent.append(documentation.replaceAll("\n", "\n\n"));
134132
}
135133

136134
if (symbolInformation.hasSignature()) {
137-
markedStrings.add(
138-
new MarkedString(
139-
doc.semanticdb.getLanguage(),
140-
new SignatureFormatter(symbolInformation, symtab).formatSymbol()));
135+
if (markupContent.length() != 0) markupContent.append("\n---\n");
136+
137+
String language =
138+
doc.semanticdb.getLanguage().toString().toLowerCase(Locale.ROOT).intern();
139+
String signature = new SignatureFormatter(symbolInformation, symtab).formatSymbol();
140+
141+
markupContent.ensureCapacity(
142+
markupContent.length() + signature.length() + language.length() + 8);
143+
markupContent
144+
.append("```")
145+
.append(language)
146+
.append('\n')
147+
.append(signature)
148+
.append("\n```");
141149
}
142150

143-
if (!markedStrings.isEmpty()) {
144-
int hoverId = writer.emitHoverResult(markedStrings.toArray(new MarkedString[0]));
151+
if (markupContent.length() != 0) {
152+
int hoverId =
153+
writer.emitHoverResult(
154+
new MarkupContent(MarkupKind.MARKDOWN, markupContent.toString()));
145155
writer.emitHoverEdge(ids.resultSet, hoverId);
146156
}
147157
}

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

Lines changed: 5 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -92,21 +92,15 @@ public int emitDefinitionResult(int resultSet) {
9292
return definitionResult;
9393
}
9494

95-
public int emitHoverResult(MarkedString[] markedStrings) {
95+
public int emitHoverResult(MarkupContent markupContents) {
9696
return emitObject(
9797
lsifVertex("hoverResult")
9898
.setResult(
9999
LsifHover.newBuilder()
100-
.addAllContents(
101-
Arrays.stream(markedStrings)
102-
.map(
103-
(ms) ->
104-
Content.newBuilder()
105-
.setLanguage(
106-
ms.language.toString().toLowerCase(Locale.ROOT))
107-
.setValue(ms.value)
108-
.build())
109-
.collect(Collectors.toList()))));
100+
.setContents(
101+
Content.newBuilder()
102+
.setKind(markupContents.kind.toString().toLowerCase())
103+
.setValue(markupContents.value))));
110104
}
111105

112106
public void emitHoverEdge(int outV, int inV) {

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

Lines changed: 0 additions & 13 deletions
This file was deleted.
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.lsif_protocol.MarkupKind;
4+
5+
public class MarkupContent {
6+
public final String value;
7+
public final MarkupKind kind;
8+
9+
public MarkupContent(MarkupKind kind, String value) {
10+
this.value = value;
11+
this.kind = kind;
12+
}
13+
}

lsif-semanticdb/src/main/protobuf/lsif.proto

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -39,9 +39,14 @@ message LsifPosition {
3939
}
4040

4141
message LsifHover {
42-
repeated Content contents = 1;
42+
Content contents = 1;
4343
message Content {
44-
string language = 1;
44+
string kind = 1; // not MarkupKind because must be lowercase
4545
string value = 2;
4646
}
4747
}
48+
49+
enum MarkupKind {
50+
PLAINTEXT = 0;
51+
MARKDOWN = 1;
52+
}

tests/snapshots/src/main/generated/index-semanticdb/locals

Lines changed: 38 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -17,37 +17,41 @@ public class Example {
1717
──────────────────────────────────
1818
│ LSIF Graph for symbol 'local0' │
1919
──────────────────────────────────
20-
╭──────────╮
21-
│project(2)│
22-
╰─────┬────╯
23-
24-
v
25-
╭─────────────────────────────╮ ╭───────────────────╮
26-
│document example/Example.java│ │referenceResult(48)│
27-
╰┬─────────────────┬──────────╯ ╰────┬───┬──────────╯
28-
│ │ │^ │
29-
│ │ ╭─────────────╯│ │
30-
│ │ │ │ │
31-
│ v v │ │
32-
│ ╭──────────────────╮ │ │
33-
│ │range(56) 3:46 'n'│ │ │
34-
│ ╰──────────┬───────╯ │ │
35-
│ │ ╭───────────╯ │
36-
│ v │ │
37-
│ ╭─────────┴───╮ │
38-
│ │resultSet(43)│ │
39-
│ ╰──┬──┬──┬────╯ │
40-
│ │ │ │ ^╭───────────╯
41-
│ │ │ ╰──┼┼────────────────╮
42-
│ │ ╰─────┼┼╮ │
43-
│ v │││ │
44-
│ ╭────────────────────╮ │││ │
45-
│ │definitionResult(46)│ │││ │
46-
│ ╰────────────────┬───╯ │││ │
47-
╰─────────────────╮ │ ╭──╯││ │
48-
╭────────────┼───┼───┼───┼╯ │
49-
│ │ │ │ │ │
50-
v v v │ v v
51-
╭──────────────╮ ╭───────────┴──────╮ ╭─────────────────────╮
52-
│moniker local0│ │range(50) 3:34 'n'│ │hoverResult(54) int n│
53-
╰──────────────╯ ╰──────────────────╯ ╰─────────────────────╯
20+
╭──────────╮
21+
│project(2)│
22+
╰─────┬────╯
23+
24+
╭───────────────╯
25+
26+
v
27+
╭─────────────────────────────╮ ╭───────────────────╮
28+
│document example/Example.java│ │referenceResult(48)│
29+
╰──────┬─────────────┬────────╯ ╰────┬───────┬──────╯
30+
│ │ │^ │
31+
╭───────╯ │ ╭───────────────╯│ ╰───╮
32+
│ │ │ │ │
33+
│ v v │ │
34+
│ ╭──────────────────╮ │ │
35+
│ │range(56) 3:46 'n'│ │ │
36+
│ ╰────────────┬─────╯ │ │
37+
│ │ ╭───────────╯ │
38+
│ v │ │
39+
│ ╭─────────┴───╮ │
40+
│ │resultSet(43)│ │
41+
│ ╰──┬─────┬───┬╯ │
42+
│ │ │ ^│ │
43+
│ v │ ││ │
44+
│ ╭────────────────────╮ │ ││ │
45+
│ │definitionResult(46)│ │ ││ │
46+
│ ╰────────────┬───────╯ │ ││ │
47+
│ │ │ ││ │
48+
│ │ ╰──┼┼──────────────╮ │
49+
│ │ ╭──────────╯│ │ │
50+
╰───────────────╮ │ │ │ │ │
51+
╭────────────┼───┼───┼───────────╯ │ │
52+
│ │ │ │ ╭──────────────────────┼────╯
53+
│ │ │ │ │ │
54+
v v v │ v v
55+
╭──────────────╮ ╭───────────┴──────╮ ╭───────────────────────────────────╮
56+
│moniker local0│ │range(50) 3:34 'n'│ │hoverResult(54) ```java\nint n\n```│
57+
╰──────────────╯ ╰──────────────────╯ ╰───────────────────────────────────╯

0 commit comments

Comments
 (0)