Skip to content

Commit 52c3c93

Browse files
Generate semantic DBs for Java sources too
1 parent fd3410a commit 52c3c93

File tree

5 files changed

+74
-3
lines changed

5 files changed

+74
-3
lines changed

build.sc

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -263,6 +263,10 @@ class Build(val crossScalaVersion: String)
263263
| def semanticDbPluginModuleName = "semanticdb-scalac"
264264
| def semanticDbPluginVersion = "${Deps.scalametaTrees.dep.version}"
265265
|
266+
| def semanticDbJavacPluginOrganization = "${Deps.semanticDbJavac.dep.module.organization.value}"
267+
| def semanticDbJavacPluginModuleName = "${Deps.semanticDbJavac.dep.module.name.value}"
268+
| def semanticDbJavacPluginVersion = "${Deps.semanticDbJavac.dep.version}"
269+
|
266270
| def localRepoResourcePath = "$localRepoResourcePath"
267271
|
268272
| def jmhVersion = "1.29"

modules/build/src/main/scala/scala/build/Build.scala

Lines changed: 27 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -559,8 +559,10 @@ object Build {
559559
s"-Xplugin:${path.toAbsolutePath}"
560560
}
561561

562+
val generateSemanticDbs = options.scalaOptions.generateSemanticDbs.getOrElse(false)
563+
562564
val semanticDbScalacOptions =
563-
if (options.scalaOptions.generateSemanticDbs.getOrElse(false))
565+
if (generateSemanticDbs)
564566
if (params.scalaVersion.startsWith("2."))
565567
Seq(
566568
"-Yrangepos",
@@ -574,6 +576,29 @@ object Build {
574576
)
575577
else Nil
576578

579+
val semanticDbJavacOptions =
580+
// FIXME Should this be in scalaOptions, now that we use it for javac stuff too?
581+
if (generateSemanticDbs) {
582+
// from https://github.com/scalameta/metals/blob/04405c0401121b372ea1971c361e05108fb36193/metals/src/main/scala/scala/meta/internal/metals/JavaInteractiveSemanticdb.scala#L137-L146
583+
val compilerPackages = Seq(
584+
"com.sun.tools.javac.api",
585+
"com.sun.tools.javac.code",
586+
"com.sun.tools.javac.model",
587+
"com.sun.tools.javac.tree",
588+
"com.sun.tools.javac.util"
589+
)
590+
val exports = compilerPackages.flatMap { pkg =>
591+
Seq("-J--add-exports", s"-Jjdk.compiler/$pkg=ALL-UNNAMED")
592+
}
593+
594+
Seq(
595+
// does the path need to be escaped somehow?
596+
s"-Xplugin:semanticdb -sourceroot:${inputs.workspace} -targetroot:javac-classes-directory"
597+
) ++ exports
598+
}
599+
else
600+
Nil
601+
577602
val sourceRootScalacOptions =
578603
if (params.scalaVersion.startsWith("2.")) Nil
579604
else Seq("-sourceroot", inputs.workspace.toString)
@@ -601,7 +626,7 @@ object Build {
601626
compilerClassPath = artifacts.compilerClassPath
602627
)
603628

604-
val javacOptions = javacReleaseV ++ options.javaOptions.javacOptions
629+
val javacOptions = javacReleaseV ++ semanticDbJavacOptions ++ options.javaOptions.javacOptions
605630

606631
// `test` scope should contains class path to main scope
607632
val mainClassesPath =

modules/build/src/main/scala/scala/build/options/BuildOptions.scala

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -114,8 +114,19 @@ final case class BuildOptions(
114114
scalaOptions.compilerPlugins
115115
}
116116

117+
private def semanticDbJavacPlugins: Either[BuildException, Seq[AnyDependency]] = either {
118+
val generateSemDbs = scalaOptions.generateSemanticDbs.getOrElse(false)
119+
if (generateSemDbs)
120+
Seq(
121+
dep"$semanticDbJavacPluginOrganization:$semanticDbJavacPluginModuleName:$semanticDbJavacPluginVersion"
122+
)
123+
else
124+
Nil
125+
}
126+
117127
def javacPluginDependencies: Either[BuildException, Seq[Positioned[AnyDependency]]] = either {
118-
javaOptions.javacPluginDependencies
128+
value(semanticDbJavacPlugins).map(Positioned.none(_)) ++
129+
javaOptions.javacPluginDependencies
119130
}
120131

121132
def allExtraJars: Seq[Path] =

modules/integration/src/test/scala/scala/cli/integration/CompileTestDefinitions.scala

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -321,4 +321,34 @@ abstract class CompileTestDefinitions(val scalaVersionOpt: Option[String])
321321
)
322322
}
323323
}
324+
325+
test("Javac SemanticDB") {
326+
val inputs = TestInputs(
327+
Seq(
328+
os.rel / "foo" / "Test.java" ->
329+
"""package foo;
330+
|
331+
|public class Test {
332+
| public static void main(String[] args) {
333+
| System.err.println("Hello");
334+
| }
335+
|}
336+
|""".stripMargin
337+
)
338+
)
339+
inputs.fromRoot { root =>
340+
os.proc(TestUtil.cli, "compile", extraOptions, "--semantic-db", ".")
341+
.call(cwd = root)
342+
343+
val files = os.walk(root / ".scala")
344+
val semDbFiles = files
345+
.filter(_.last.endsWith(".semanticdb"))
346+
.filter(!_.segments.exists(_ == "bloop-internal-classes"))
347+
expect(semDbFiles.length == 1)
348+
val semDbFile = semDbFiles.head
349+
expect(
350+
semDbFile.endsWith(os.rel / "META-INF" / "semanticdb" / "foo" / "Test.java.semanticdb")
351+
)
352+
}
353+
}
324354
}

project/deps.sc

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -80,6 +80,7 @@ object Deps {
8080
def scalaPackagerCli = ivy"org.virtuslab::scala-packager-cli:${Versions.scalaPackager}"
8181
def scalaparse = ivy"com.lihaoyi::scalaparse:2.3.3"
8282
def scalaReflect(sv: String) = ivy"org.scala-lang:scala-reflect:$sv"
83+
def semanticDbJavac = ivy"com.sourcegraph:semanticdb-javac:0.7.4"
8384
def semanticDbScalac = ivy"org.scalameta:::semanticdb-scalac:${Versions.scalaMeta}"
8485
def shapeless = ivy"com.chuusai::shapeless:2.3.7"
8586
def slf4jNop = ivy"org.slf4j:slf4j-nop:1.8.0-beta4"

0 commit comments

Comments
 (0)