Skip to content

Commit c054f26

Browse files
authored
adds snapshot command to lsif-java cli (#117)
1 parent aef7bdb commit c054f26

File tree

8 files changed

+159
-3
lines changed

8 files changed

+159
-3
lines changed

.gitignore

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,3 +51,5 @@ out/
5151
*.hnir
5252
test-report.json
5353
dump.lsif
54+
55+
./generated

build.sbt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -119,6 +119,7 @@ lazy val cli = project
119119
.settings(
120120
moduleName := "lsif-java",
121121
mainClass.in(Compile) := Some("com.sourcegraph.lsif_java.LsifJava"),
122+
baseDirectory.in(run) := baseDirectory.in(ThisBuild).value,
122123
buildInfoKeys :=
123124
Seq[BuildInfoKey](
124125
version,
@@ -164,6 +165,7 @@ lazy val cli = project
164165
nativeImageOutput := target.in(NativeImage).value / "lsif-java"
165166
)
166167
.enablePlugins(NativeImagePlugin, BuildInfoPlugin)
168+
.dependsOn(plugin)
167169

168170
def minimizedSourceDirectory =
169171
file("tests/minimized/src/main/java").getAbsoluteFile

cli/src/main/scala/com/sourcegraph/lsif_java/LsifJava.scala

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,8 @@ object LsifJava {
1616
CommandParser[HelpCommand],
1717
CommandParser[VersionCommand],
1818
CommandParser[IndexCommand],
19-
CommandParser[IndexSemanticdbCommand]
19+
CommandParser[IndexSemanticdbCommand],
20+
CommandParser[SnapshotCommand]
2021
)
2122
)
2223
def main(args: Array[String]): Unit = {

tests/unit/src/main/scala/tests/SemanticdbPrinters.scala renamed to cli/src/main/scala/com/sourcegraph/lsif_java/SemanticdbPrinters.scala

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

33
import scala.jdk.CollectionConverters._
44

@@ -56,7 +56,7 @@ object SemanticdbPrinters {
5656
)
5757
.append(
5858
if (r.getStartCharacter == 1)
59-
"^" * (width-1)
59+
"^" * (width - 1)
6060
else
6161
"^" * width
6262
)
Lines changed: 97 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,97 @@
1+
package com.sourcegraph.lsif_java
2+
3+
import java.nio.charset.StandardCharsets
4+
import java.nio.file.FileSystems
5+
import java.nio.file.FileVisitResult
6+
import java.nio.file.Files
7+
import java.nio.file.Path
8+
import java.nio.file.Paths
9+
import java.nio.file.SimpleFileVisitor
10+
import java.nio.file.attribute.BasicFileAttributes
11+
12+
import scala.collection.mutable.ListBuffer
13+
import scala.jdk.CollectionConverters._
14+
15+
import com.sourcegraph.semanticdb_javac.Semanticdb.TextDocument
16+
import com.sourcegraph.semanticdb_javac.Semanticdb.TextDocuments
17+
import moped.annotations.CommandName
18+
import moped.annotations.Description
19+
import moped.annotations.ExampleUsage
20+
import moped.annotations.Inline
21+
import moped.annotations.PositionalArguments
22+
import moped.annotations.Usage
23+
import moped.cli.Application
24+
import moped.cli.Command
25+
import moped.cli.CommandParser
26+
27+
@Description(
28+
"Generates annotated snapshots for each SemanticDB file in the given target roots."
29+
)
30+
@Usage("lsif-java snapshot [OPTIONS ...] [POSITIONAL ARGUMENTS ...]")
31+
@ExampleUsage(
32+
"lsif-java snapshot --output=generated/ my/targetroo1 my/targetroot2"
33+
)
34+
@CommandName("snapshot")
35+
case class SnapshotCommand(
36+
@PositionalArguments
37+
@Description(
38+
"List of directories containing SemanticDB files"
39+
) targetroot: List[Path] = Nil,
40+
@Description("Output directory for the annotated snapshots") output: Path =
41+
Paths.get("generated"),
42+
@Inline() app: Application = Application.default
43+
) extends Command {
44+
def sourceroot: Path = app.env.workingDirectory
45+
46+
override def run(): Int = {
47+
val semanticdbPattern = FileSystems
48+
.getDefault
49+
.getPathMatcher("glob:**.semanticdb")
50+
Files.walkFileTree(output, new DeleteVisitor())
51+
Files.createDirectories(output)
52+
val semanticdbFiles = ListBuffer.empty[TextDocument]
53+
54+
targetroot.foreach { root =>
55+
Files.walkFileTree(
56+
root,
57+
new SimpleFileVisitor[Path] {
58+
override def visitFile(
59+
file: Path,
60+
attrs: BasicFileAttributes
61+
): FileVisitResult = {
62+
if (semanticdbPattern.matches(file)) {
63+
val docs = TextDocuments.parseFrom(Files.readAllBytes(file))
64+
docs
65+
.getDocumentsList
66+
.asScala
67+
.foreach { doc =>
68+
val sourcepath = sourceroot.resolve(doc.getUri)
69+
val source =
70+
new String(
71+
Files.readAllBytes(sourcepath),
72+
StandardCharsets.UTF_8
73+
)
74+
semanticdbFiles +=
75+
TextDocument.newBuilder(doc).setText(source).build()
76+
}
77+
}
78+
super.visitFile(file, attrs)
79+
}
80+
}
81+
)
82+
}
83+
84+
semanticdbFiles.foreach { doc =>
85+
val document = SemanticdbPrinters.printTextDocument(doc)
86+
val snapshotOutput = output.resolve(doc.getUri)
87+
Files.createDirectories(snapshotOutput.getParent)
88+
Files.write(snapshotOutput, document.getBytes(StandardCharsets.UTF_8))
89+
}
90+
91+
0
92+
}
93+
}
94+
95+
object SnapshotCommand {
96+
implicit val parser = CommandParser.derive(SnapshotCommand())
97+
}

tests/snapshots/src/main/scala/tests/LibrarySnapshotGenerator.scala

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import scala.meta.internal.io.FileIO
1010
import scala.meta.io.AbsolutePath
1111

1212
import com.sourcegraph.lsif_java.DeleteVisitor
13+
import com.sourcegraph.lsif_java.SemanticdbPrinters
1314
import coursier.core.Repository
1415
import coursier.maven.MavenRepository
1516

tests/snapshots/src/main/scala/tests/MinimizedSnapshotGenerator.scala

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@ package tests
22

33
import scala.meta.io.AbsolutePath
44

5+
import com.sourcegraph.lsif_java.SemanticdbPrinters
6+
57
class MinimizedSnapshotGenerator extends SnapshotGenerator {
68
override def run(context: SnapshotContext, handler: SnapshotHandler): Unit = {
79
val sourceroot = AbsolutePath(BuildInfo.sourceroot)
Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
package tests
2+
3+
import java.nio.file.Files
4+
5+
import scala.meta.inputs.Input
6+
7+
import com.sourcegraph.lsif_java.LsifJava
8+
import moped.testkit.FileLayout
9+
import moped.testkit.MopedSuite
10+
11+
class SnapshotCommandSuite extends MopedSuite(LsifJava.app) {
12+
test("snapshot") {
13+
FileLayout.fromString(
14+
"""/main/Sample.java
15+
|package main;
16+
|
17+
|public class Sample {
18+
| public static void main(String[] asdf) {}
19+
|}
20+
|""".stripMargin,
21+
workingDirectory
22+
)
23+
24+
val targetroot = workingDirectory.resolve("target/main")
25+
val sourcepath = workingDirectory.resolve("main/Sample.java")
26+
val code = new String(Files.readAllBytes(sourcepath))
27+
new TestCompiler(targetroot)
28+
.compileSemanticdb(List(Input.VirtualFile("main/Sample.java", code)))
29+
30+
val generatedpath = workingDirectory.resolve("generated")
31+
val exitCode = app().run(
32+
List("snapshot", "--output", generatedpath.toString, targetroot.toString)
33+
)
34+
assertEquals(exitCode, 0, clues(app.capturedOutput))
35+
assertNoDiff(
36+
FileLayout.asString(generatedpath),
37+
"""|/main/Sample.java
38+
|package main;
39+
|
40+
|public class Sample {
41+
|// ^^^^^^ definition main/Sample#
42+
|// ^^^^^^ definition main/Sample#`<init>`().
43+
| public static void main(String[] asdf) {}
44+
|// ^^^^ definition main/Sample#main().
45+
|// ^^^^^^ reference java/lang/String#
46+
|// ^^^^ definition local0
47+
|}
48+
|""".stripMargin
49+
)
50+
}
51+
}

0 commit comments

Comments
 (0)