@@ -6,6 +6,8 @@ import java.nio.file._
66import scala .collection .mutable .ListBuffer
77import scala .util .Properties
88
9+ import com .sourcegraph .io .DeleteVisitor
10+ import com .sourcegraph .lsif_java .BuildInfo
911import com .sourcegraph .lsif_java .Embedded
1012import com .sourcegraph .lsif_java .commands .IndexCommand
1113import os .CommandResult
@@ -78,9 +80,20 @@ class GradleBuildTool(index: IndexCommand) extends BuildTool("Gradle", index) {
7880 buildCommand +=
7981 s " -Porg.gradle.java.installations.paths= ${toolchains.paths()}"
8082 }
81- buildCommand ++= index.finalBuildCommand(List (" clean" , " compileTestJava" ))
83+ buildCommand ++=
84+ index.finalBuildCommand(
85+ List [Option [String ]](
86+ Some (" clean" ),
87+ Some (" compileTestJava" ),
88+ if (toolchains.isScalaEnabled)
89+ Some (" compileTestScala" )
90+ else
91+ None
92+ ).flatten
93+ )
8294 buildCommand += lsifJavaDependencies
8395
96+ Files .walkFileTree(targetroot, new DeleteVisitor ())
8497 val result = index.process(buildCommand, env = Map (" TERM" -> " dumb" ))
8598 printDebugLogs(toolchains.tmp)
8699 Embedded
@@ -112,6 +125,11 @@ class GradleBuildTool(index: IndexCommand) extends BuildTool("Gradle", index) {
112125
113126 val agentpath = Embedded .agentJar(tmp)
114127 val pluginpath = Embedded .semanticdbJar(tmp)
128+ def handleExceptionGroovySyntax (): String =
129+ if (index.verbose)
130+ " e.printStackTrace()"
131+ else
132+ " "
115133 val dependenciesPath = targetroot.resolve(" dependencies.txt" )
116134 Files .deleteIfExists(dependenciesPath)
117135 val script =
@@ -137,6 +155,22 @@ class GradleBuildTool(index: IndexCommand) extends BuildTool("Gradle", index) {
137155 | // By enabling the SemanticDB Java agent on the Zinc daemon process, we manage
138156 | // to configure Zinc to use the semanticdb-javac compiler plugin for Java compilation.
139157 | tasks.withType(ScalaCompile) {
158+ |
159+ | if (scalaCompileOptions.additionalParameters == null) scalaCompileOptions.additionalParameters = []
160+ | try {
161+ | def scalaVersion = lsifJavaScalaVersion(project, configurations)
162+ | def semanticdbVersion = lsifJavaSemanticdbScalacVersions(scalaVersion)
163+ | def semanticdbScalacDependency ="org.scalameta:semanticdb-scalac_ $$ scalaVersion: $$ semanticdbVersion"
164+ | def semanticdbScalac = project.configurations.detachedConfiguration(dependencies.create(semanticdbScalacDependency)).files[0]
165+ | scalaCompileOptions.additionalParameters << '-Xplugin:' + semanticdbScalac
166+ | scalaCompileOptions.additionalParameters << '-P:semanticdb:sourceroot: $sourceroot'
167+ | scalaCompileOptions.additionalParameters << '-P:semanticdb:targetroot: $targetroot'
168+ | scalaCompileOptions.additionalParameters << '-P:semanticdb:exclude:(src/play/twirl|src/play/routes)' // Ignore autogenerated Playframework files
169+ | scalaCompileOptions.additionalParameters << '-P:semanticdb:failures:warning'
170+ | scalaCompileOptions.additionalParameters << '-Xplugin-require:semanticdb'
171+ | } catch (Exception e) {
172+ | ${handleExceptionGroovySyntax()}
173+ | }
140174 | scalaCompileOptions.forkOptions.with {
141175 | jvmArgs << '-javaagent: $agentpath'
142176 | jvmArgs << '-Dsemanticdb.pluginpath= $pluginpath'
@@ -180,11 +214,43 @@ class GradleBuildTool(index: IndexCommand) extends BuildTool("Gradle", index) {
180214 | }
181215 | }
182216 |}
183- """ .stripMargin
217+ |def lsifJavaSemanticdbScalacVersions(scalaVersion) {
218+ | ${semanticdbScalacGroovySyntax()}[scalaVersion]
219+ |}
220+ |def lsifJavaScalaVersion(project, configurations) {
221+ | for (config in configurations) {
222+ | if (config.name == "zinc") continue
223+ | if (config.canBeResolved) {
224+ | def artifacts = config.incoming.artifactView { view ->
225+ | view.lenient = true
226+ | }.artifacts
227+ | for (artifact in artifacts) {
228+ | def id = artifact.id.componentIdentifier
229+ | if (id instanceof org.gradle.api.artifacts.component.ModuleComponentIdentifier
230+ | && id.group == "org.scala-lang"
231+ | && id.module == "scala-library") {
232+ | return id.version
233+ | }
234+ | }
235+ | }
236+ | }
237+ | return null
238+ |}
239+ | """ .stripMargin
184240 Files .write(
185241 tmp.resolve(" init-script.gradle" ),
186242 script.getBytes(StandardCharsets .UTF_8 )
187243 )
188244 }
189245
246+ def semanticdbScalacGroovySyntax (): String =
247+ BuildInfo
248+ .semanticdbScalacVersions
249+ .removed(
250+ " 2.12.3"
251+ ) // Not supported because the last semanticdb-scalac_2.12.3 release doesn't support the option -P:semanticdb:targetroot:PATH.
252+ .map { case (key, value) =>
253+ s " ' $key':' $value' "
254+ }.mkString(" [" , " , " , " ]" )
255+
190256}
0 commit comments