Skip to content

Commit ee59136

Browse files
authored
Merge pull request #232 from olafurpg/robust-snapshot
Make `snapshot-lsif` command more robust
2 parents a258ae8 + 9f33f2c commit ee59136

File tree

4 files changed

+55
-9
lines changed

4 files changed

+55
-9
lines changed

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

Lines changed: 15 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2,20 +2,26 @@ package com.sourcegraph.lsif_java
22

33
import scala.jdk.CollectionConverters._
44

5+
import com.sourcegraph.lsif_java.commands.CommentSyntax
56
import com.sourcegraph.lsif_semanticdb.SignatureFormatter
67
import com.sourcegraph.lsif_semanticdb.Symtab
78
import com.sourcegraph.semanticdb_javac.Semanticdb.SymbolOccurrence
89
import com.sourcegraph.semanticdb_javac.Semanticdb.SymbolOccurrence.Role
910
import com.sourcegraph.semanticdb_javac.Semanticdb.TextDocument
1011

1112
object SemanticdbPrinters {
12-
def printTextDocument(doc: TextDocument): String = {
13+
def printTextDocument(
14+
doc: TextDocument,
15+
comments: CommentSyntax = CommentSyntax.default
16+
): String = {
1317
val occurrencesByLine = doc
1418
.getOccurrencesList
1519
.asScala
1620
.groupBy(_.getRange.getStartLine)
1721
val out = new StringBuilder()
1822
val symtab = new Symtab(doc)
23+
val extension = doc.getUri.split("\\.").lastOption.getOrElse("")
24+
val commentSyntax = comments.extensionSyntax(extension)
1925
doc
2026
.getText
2127
.linesWithSeparators
@@ -32,7 +38,7 @@ object SemanticdbPrinters {
3238
)
3339
)
3440
occurrences.foreach { occ =>
35-
formatOccurrence(out, occ, line, symtab)
41+
formatOccurrence(out, occ, line, symtab, commentSyntax)
3642
}
3743
}
3844
out.toString()
@@ -42,7 +48,8 @@ object SemanticdbPrinters {
4248
out: StringBuilder,
4349
occ: SymbolOccurrence,
4450
line: String,
45-
symtab: Symtab
51+
symtab: Symtab,
52+
commentSyntax: String
4653
): Unit = {
4754
val r = occ.getRange
4855
val isMultiline = r.getStartLine != r.getEndLine
@@ -54,10 +61,12 @@ object SemanticdbPrinters {
5461
}
5562
out
5663
.append(
57-
if (r.getStartCharacter > 2)
58-
"// " + " " * (r.getStartCharacter - 3)
64+
if (r.getStartCharacter > commentSyntax.length)
65+
s"$commentSyntax " +
66+
" " *
67+
(r.getStartCharacter - commentSyntax.length - 1)
5968
else
60-
"//"
69+
commentSyntax
6170
)
6271
.append(
6372
if (r.getStartCharacter == 1)
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
package com.sourcegraph.lsif_java.commands
2+
3+
case class CommentSyntax(value: String) {
4+
private val map =
5+
value
6+
.split("\\s+")
7+
.map(_.split(","))
8+
.collect { case Array(a, b) =>
9+
a -> b
10+
}
11+
.toMap
12+
def extensionSyntax(fileExtension: String): String =
13+
map.getOrElse(fileExtension, "//")
14+
}
15+
object CommentSyntax {
16+
val default = CommentSyntax("py,# sql,-- yaml,# yml,#")
17+
implicit val codec = moped.macros.deriveCodec(default)
18+
}

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

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -82,8 +82,12 @@ case class SnapshotCommand(
8282
}
8383

8484
object SnapshotCommand {
85-
def writeSnapshot(doc: TextDocument, outputDirectory: Path): Unit = {
86-
val document = SemanticdbPrinters.printTextDocument(doc)
85+
def writeSnapshot(
86+
doc: TextDocument,
87+
outputDirectory: Path,
88+
commentSyntax: CommentSyntax = CommentSyntax.default
89+
): Unit = {
90+
val document = SemanticdbPrinters.printTextDocument(doc, commentSyntax)
8791
val snapshotOutput = outputDirectory.resolve(doc.getUri)
8892
Files.createDirectories(snapshotOutput.getParent)
8993
Files.write(snapshotOutput, document.getBytes(StandardCharsets.UTF_8))

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

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,8 @@ import com.sourcegraph.semanticdb_javac.Semanticdb.SymbolOccurrence
3333
import com.sourcegraph.semanticdb_javac.Semanticdb.SymbolOccurrence.Role
3434
import com.sourcegraph.semanticdb_javac.Semanticdb.TextDocument
3535
import moped.annotations.CommandName
36+
import moped.annotations.Description
37+
import moped.annotations.ExampleValue
3638
import moped.annotations.Inline
3739
import moped.annotations.PositionalArguments
3840
import moped.cli.Application
@@ -46,6 +48,12 @@ import org.scalameta.ascii.layout.prefs.LayoutPrefsImpl
4648
case class SnapshotLsifCommand(
4749
@Inline() app: Application = Application.default,
4850
output: Path = Paths.get("generated"),
51+
@Description(
52+
"Space-separated list of '$FILE_EXTENSION,$COMMENT_SYNTAX' that determines what syntax " +
53+
"to use for comments depending on the file extension of the source file."
54+
)
55+
@ExampleValue("py,# scala,// ") commentSyntax: CommentSyntax =
56+
CommentSyntax.default,
4957
@PositionalArguments() input: List[Path] = List(Paths.get("dump.lsif"))
5058
) extends Command {
5159

@@ -63,9 +71,14 @@ case class SnapshotLsifCommand(
6371
.of(Paths.get(doc.getUri), sourceroot)
6472
.normalize()
6573
if (docPath.toAbsolutePath.startsWith(sourceroot)) {
66-
SnapshotCommand.writeSnapshot(doc, finalOutput)
74+
SnapshotCommand.writeSnapshot(doc, finalOutput, commentSyntax)
75+
} else {
76+
app.warning(
77+
s"skipping path '$docPath' because it is not part of the sourceroot '$sourceroot'"
78+
)
6779
}
6880
}
81+
app.info(finalOutput.toString())
6982
0
7083
}
7184

@@ -85,6 +98,8 @@ object SnapshotLsifCommand {
8598
val lsif = new IndexedLsif(input, objects, sourceroot)
8699
lsif
87100
.ranges
101+
.iterator
102+
.filter(o => lsif.contains.contains(o.getId))
88103
.foreach { o =>
89104
val docId = lsif.contains(o.getId)
90105
val doc = lsif.textDocument(docId)

0 commit comments

Comments
 (0)