From d93358df6fc5d1035317e70fef2a415574709bcf Mon Sep 17 00:00:00 2001 From: Noah Santschi-Cooney Date: Fri, 25 Mar 2022 17:23:13 +0000 Subject: [PATCH 1/7] symbolic link ${jdk-home}/lib to forwarding toolchain directory for Kotlin --- .../lsif_java/buildtools/GradleJavaCompiler.scala | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/lsif-java/src/main/scala/com/sourcegraph/lsif_java/buildtools/GradleJavaCompiler.scala b/lsif-java/src/main/scala/com/sourcegraph/lsif_java/buildtools/GradleJavaCompiler.scala index 89dab4ef..0f87de69 100644 --- a/lsif-java/src/main/scala/com/sourcegraph/lsif_java/buildtools/GradleJavaCompiler.scala +++ b/lsif-java/src/main/scala/com/sourcegraph/lsif_java/buildtools/GradleJavaCompiler.scala @@ -70,8 +70,8 @@ case class GradleJavaCompiler(languageVersion: String, javacPath: Path) { val javaCommand = ListBuffer[String]( javaBinary.toString, s"-javaagent:$agent", - s"-Dsemanticdb.javacopts=${javacopts}", - s"-Dsemanticdb.pluginpath=${pluginPath}", + s"-Dsemanticdb.javacopts=$javacopts", + s"-Dsemanticdb.pluginpath=$pluginPath", s"-Dsemanticdb.targetroot=${targetroot}", s"-Dsemanticdb.sourceroot=${index.workingDirectory}" ) @@ -98,6 +98,11 @@ case class GradleJavaCompiler(languageVersion: String, javacPath: Path) { ) .toFile .setExecutable(true) + // for compileKotlin when using jvm toolchains + Files.createSymbolicLink( + dir.resolve("lib"), + javacPath.getParent.getParent.resolve("lib") + ) } } object GradleJavaCompiler { From 6d3b2d2e8b739ccf3ce900b3bde1287cc63fc6b6 Mon Sep 17 00:00:00 2001 From: Noah Santschi-Cooney Date: Mon, 28 Mar 2022 14:25:19 +0100 Subject: [PATCH 2/7] switch from symbolic link to copying --- .../lsif_java/buildtools/GradleJavaCompiler.scala | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/lsif-java/src/main/scala/com/sourcegraph/lsif_java/buildtools/GradleJavaCompiler.scala b/lsif-java/src/main/scala/com/sourcegraph/lsif_java/buildtools/GradleJavaCompiler.scala index 0f87de69..fa439dc7 100644 --- a/lsif-java/src/main/scala/com/sourcegraph/lsif_java/buildtools/GradleJavaCompiler.scala +++ b/lsif-java/src/main/scala/com/sourcegraph/lsif_java/buildtools/GradleJavaCompiler.scala @@ -72,7 +72,7 @@ case class GradleJavaCompiler(languageVersion: String, javacPath: Path) { s"-javaagent:$agent", s"-Dsemanticdb.javacopts=$javacopts", s"-Dsemanticdb.pluginpath=$pluginPath", - s"-Dsemanticdb.targetroot=${targetroot}", + s"-Dsemanticdb.targetroot=$targetroot", s"-Dsemanticdb.sourceroot=${index.workingDirectory}" ) if (index.verbose) { @@ -99,10 +99,15 @@ case class GradleJavaCompiler(languageVersion: String, javacPath: Path) { .toFile .setExecutable(true) // for compileKotlin when using jvm toolchains - Files.createSymbolicLink( - dir.resolve("lib"), - javacPath.getParent.getParent.resolve("lib") - ) + val libPath = dir.resolve("lib") + Files + .walk(javacPath.getParent.getParent.resolve("lib")) + .forEach(source => { + val destination = libPath.resolve( + javacPath.getParent.getParent.resolve("lib").relativize(source) + ) + Files.copy(source, destination) + }) } } object GradleJavaCompiler { From d820aa7e9f7df7cf67d016ba3af2e5377b3ca761 Mon Sep 17 00:00:00 2001 From: Noah Santschi-Cooney Date: Mon, 28 Mar 2022 17:32:01 +0100 Subject: [PATCH 3/7] handle JDK 8 + add tests --- .jvmopts | 1 + .../buildtools/GradleJavaCompiler.scala | 27 ++++++++++++++----- .../scala/tests/GradleBuildToolSuite.scala | 23 +++++++++++++++- 3 files changed, 43 insertions(+), 8 deletions(-) diff --git a/.jvmopts b/.jvmopts index cc6fa202..170af8ae 100644 --- a/.jvmopts +++ b/.jvmopts @@ -2,3 +2,4 @@ -Xms1G -Xmx4G -Dfile.encoding=UTF-8 +-Dsbt.server.autostart=true diff --git a/lsif-java/src/main/scala/com/sourcegraph/lsif_java/buildtools/GradleJavaCompiler.scala b/lsif-java/src/main/scala/com/sourcegraph/lsif_java/buildtools/GradleJavaCompiler.scala index fa439dc7..2c0605ff 100644 --- a/lsif-java/src/main/scala/com/sourcegraph/lsif_java/buildtools/GradleJavaCompiler.scala +++ b/lsif-java/src/main/scala/com/sourcegraph/lsif_java/buildtools/GradleJavaCompiler.scala @@ -98,16 +98,29 @@ case class GradleJavaCompiler(languageVersion: String, javacPath: Path) { ) .toFile .setExecutable(true) - // for compileKotlin when using jvm toolchains + + // for compileKotlin when using jvm toolchains. + // JDK 9+ have jrt-fs.jar in $JDK_HOME/lib val libPath = dir.resolve("lib") + val javacLibPath = javacPath.getParent.getParent.resolve("lib") Files - .walk(javacPath.getParent.getParent.resolve("lib")) + .walk(javacLibPath) .forEach(source => { - val destination = libPath.resolve( - javacPath.getParent.getParent.resolve("lib").relativize(source) - ) + val destination = libPath.resolve(javacLibPath.relativize(source)) Files.copy(source, destination) }) + + // JDK 8 has rt.jar in $JDK_HOME/jre/lib + if (languageVersion == "8") { + val jrePath = dir.resolve("jre") + val javacJrePath = javacPath.getParent.getParent.resolve("jre") + Files + .walk(javacJrePath) + .forEach(source => { + val destination = jrePath.resolve(javacJrePath.relativize(source)) + Files.copy(source, destination) + }) + } } } object GradleJavaCompiler { @@ -121,9 +134,9 @@ object GradleJavaCompiler { /** * Parses a single space-separated line into a GradleJavaCompiler instance. * - * Example input: "8 /path/javac" + * Example input: "8 /javacLibPath/javac" * - * Example output: `Some(GradleJavaCompiler("8", * /path/javac))` + * Example output: `Some(GradleJavaCompiler("8", * /javacLibPath/javac))` */ def fromLine(line: String): Option[GradleJavaCompiler] = line.split(' ') match { diff --git a/tests/buildTools/src/test/scala/tests/GradleBuildToolSuite.scala b/tests/buildTools/src/test/scala/tests/GradleBuildToolSuite.scala index fe4b8fc8..a4fd4ce7 100644 --- a/tests/buildTools/src/test/scala/tests/GradleBuildToolSuite.scala +++ b/tests/buildTools/src/test/scala/tests/GradleBuildToolSuite.scala @@ -287,6 +287,28 @@ class GradleBuildToolSuite extends BaseBuildToolSuite { 4 ) + List("8", "11").foreach { version => + checkBuild( + "kotlin-jvm-toolchains", + s"""|/build.gradle + |plugins { + | id 'java' + | id 'org.jetbrains.kotlin.jvm' version '1.5.31' + |} + |java { + | toolchain { + | languageVersion = JavaLanguageVersion.of($version) + | } + |} + |repositories { mavenCentral() } + |/src/main/kotlin/foo/Example.kt + |package foo + |object Example {} + |""".stripMargin, + 1 + ) + } + List("jvm()" -> 2, "jvm { withJava() }" -> 4).foreach { case (jvmSettings, expectedSemanticdbFiles) => checkBuild( @@ -326,5 +348,4 @@ class GradleBuildToolSuite extends BaseBuildToolSuite { expectedSemanticdbFiles ) } - } From 0c071a9ff44987094661325f747df3c1e752188f Mon Sep 17 00:00:00 2001 From: Noah Santschi-Cooney Date: Mon, 28 Mar 2022 22:29:25 +0100 Subject: [PATCH 4/7] copy with CopyVisitor --- .jvmopts | 1 - .../com/sourcegraph/io/CopyVisitor.scala | 45 +++++++++++++++++++ .../buildtools/GradleJavaCompiler.scala | 37 ++++++++------- 3 files changed, 65 insertions(+), 18 deletions(-) create mode 100644 lsif-java/src/main/scala/com/sourcegraph/io/CopyVisitor.scala diff --git a/.jvmopts b/.jvmopts index 170af8ae..cc6fa202 100644 --- a/.jvmopts +++ b/.jvmopts @@ -2,4 +2,3 @@ -Xms1G -Xmx4G -Dfile.encoding=UTF-8 --Dsbt.server.autostart=true diff --git a/lsif-java/src/main/scala/com/sourcegraph/io/CopyVisitor.scala b/lsif-java/src/main/scala/com/sourcegraph/io/CopyVisitor.scala new file mode 100644 index 00000000..88b12bde --- /dev/null +++ b/lsif-java/src/main/scala/com/sourcegraph/io/CopyVisitor.scala @@ -0,0 +1,45 @@ +package com.sourcegraph.io + +import java.io.IOException +import java.nio.file.FileAlreadyExistsException +import java.nio.file.FileVisitResult +import java.nio.file.Files +import java.nio.file.NoSuchFileException +import java.nio.file.Path +import java.nio.file.SimpleFileVisitor +import java.nio.file.attribute.BasicFileAttributes + +class CopyVisitor(source: Path, destination: Path) + extends SimpleFileVisitor[Path] { + override def preVisitDirectory( + t: Path, + basicFileAttributes: BasicFileAttributes + ): FileVisitResult = { + try { + Files.createDirectory(destination.resolve(source.relativize(t))) + } catch { + case _: NoSuchFileException => + return super.preVisitDirectory(t, basicFileAttributes) + case _: FileAlreadyExistsException => + return super.preVisitDirectory(t, basicFileAttributes) + } + super.preVisitDirectory(t, basicFileAttributes) + } + + override def visitFile( + t: Path, + basicFileAttributes: BasicFileAttributes + ): FileVisitResult = { + val destPath = destination.resolve(source.relativize(t)) + try { + Files.copy(t, destPath) + } catch { + case _: NoSuchFileException => + return super.visitFile(t, basicFileAttributes) + } + super.visitFile(t, basicFileAttributes) + } + + override def visitFileFailed(t: Path, e: IOException): FileVisitResult = + FileVisitResult.CONTINUE +} diff --git a/lsif-java/src/main/scala/com/sourcegraph/lsif_java/buildtools/GradleJavaCompiler.scala b/lsif-java/src/main/scala/com/sourcegraph/lsif_java/buildtools/GradleJavaCompiler.scala index 2c0605ff..0e2b1f5a 100644 --- a/lsif-java/src/main/scala/com/sourcegraph/lsif_java/buildtools/GradleJavaCompiler.scala +++ b/lsif-java/src/main/scala/com/sourcegraph/lsif_java/buildtools/GradleJavaCompiler.scala @@ -8,6 +8,7 @@ import java.nio.file.StandardCopyOption import scala.collection.mutable.ListBuffer +import com.sourcegraph.io.CopyVisitor import com.sourcegraph.lsif_java.Embedded import com.sourcegraph.lsif_java.commands.IndexCommand @@ -99,27 +100,29 @@ case class GradleJavaCompiler(languageVersion: String, javacPath: Path) { .toFile .setExecutable(true) - // for compileKotlin when using jvm toolchains. - // JDK 9+ have jrt-fs.jar in $JDK_HOME/lib + // For compile{Test}Kotlin when using jvm toolchains, we need to have access + // to JDK internals found in /lib in JDK 9+, + // as well as /jre/lib in JDK <=8, else we get + // "no class roots are found in the JDK path" from the compile{Test}Kotlin tasks. + // https://docs.oracle.com/en/java/javase/12/migrate/index.html#JSMIG-GUID-A78CC891-701D-4549-AA4E-B8DD90228B4B val libPath = dir.resolve("lib") + Files.createDirectory(libPath) val javacLibPath = javacPath.getParent.getParent.resolve("lib") - Files - .walk(javacLibPath) - .forEach(source => { - val destination = libPath.resolve(javacLibPath.relativize(source)) - Files.copy(source, destination) - }) + Files.walkFileTree(javacLibPath, new CopyVisitor(javacLibPath, libPath)) - // JDK 8 has rt.jar in $JDK_HOME/jre/lib if (languageVersion == "8") { - val jrePath = dir.resolve("jre") - val javacJrePath = javacPath.getParent.getParent.resolve("jre") - Files - .walk(javacJrePath) - .forEach(source => { - val destination = jrePath.resolve(javacJrePath.relativize(source)) - Files.copy(source, destination) - }) + val jreLibPath = dir.resolve("jre").resolve("lib") + Files.createDirectories(jreLibPath.getParent) + val javacJreLibPath = javacPath + .getParent + .getParent + .resolve("jre") + .resolve("lib") + + Files.walkFileTree( + javacJreLibPath, + new CopyVisitor(javacJreLibPath, jreLibPath) + ) } } } From f11080f312ccb9e10fe7fb44be3ba38da3459210 Mon Sep 17 00:00:00 2001 From: Noah Santschi-Cooney Date: Mon, 28 Mar 2022 23:09:47 +0100 Subject: [PATCH 5/7] away with CopyVisitor, back to lambda --- .../com/sourcegraph/io/CopyVisitor.scala | 45 ------------------- .../buildtools/GradleJavaCompiler.scala | 26 ++++++++--- .../scala/tests/GradleBuildToolSuite.scala | 2 +- 3 files changed, 20 insertions(+), 53 deletions(-) delete mode 100644 lsif-java/src/main/scala/com/sourcegraph/io/CopyVisitor.scala diff --git a/lsif-java/src/main/scala/com/sourcegraph/io/CopyVisitor.scala b/lsif-java/src/main/scala/com/sourcegraph/io/CopyVisitor.scala deleted file mode 100644 index 88b12bde..00000000 --- a/lsif-java/src/main/scala/com/sourcegraph/io/CopyVisitor.scala +++ /dev/null @@ -1,45 +0,0 @@ -package com.sourcegraph.io - -import java.io.IOException -import java.nio.file.FileAlreadyExistsException -import java.nio.file.FileVisitResult -import java.nio.file.Files -import java.nio.file.NoSuchFileException -import java.nio.file.Path -import java.nio.file.SimpleFileVisitor -import java.nio.file.attribute.BasicFileAttributes - -class CopyVisitor(source: Path, destination: Path) - extends SimpleFileVisitor[Path] { - override def preVisitDirectory( - t: Path, - basicFileAttributes: BasicFileAttributes - ): FileVisitResult = { - try { - Files.createDirectory(destination.resolve(source.relativize(t))) - } catch { - case _: NoSuchFileException => - return super.preVisitDirectory(t, basicFileAttributes) - case _: FileAlreadyExistsException => - return super.preVisitDirectory(t, basicFileAttributes) - } - super.preVisitDirectory(t, basicFileAttributes) - } - - override def visitFile( - t: Path, - basicFileAttributes: BasicFileAttributes - ): FileVisitResult = { - val destPath = destination.resolve(source.relativize(t)) - try { - Files.copy(t, destPath) - } catch { - case _: NoSuchFileException => - return super.visitFile(t, basicFileAttributes) - } - super.visitFile(t, basicFileAttributes) - } - - override def visitFileFailed(t: Path, e: IOException): FileVisitResult = - FileVisitResult.CONTINUE -} diff --git a/lsif-java/src/main/scala/com/sourcegraph/lsif_java/buildtools/GradleJavaCompiler.scala b/lsif-java/src/main/scala/com/sourcegraph/lsif_java/buildtools/GradleJavaCompiler.scala index 0e2b1f5a..611ccf17 100644 --- a/lsif-java/src/main/scala/com/sourcegraph/lsif_java/buildtools/GradleJavaCompiler.scala +++ b/lsif-java/src/main/scala/com/sourcegraph/lsif_java/buildtools/GradleJavaCompiler.scala @@ -2,13 +2,13 @@ package com.sourcegraph.lsif_java.buildtools import java.nio.charset.StandardCharsets import java.nio.file.Files +import java.nio.file.NoSuchFileException import java.nio.file.Path import java.nio.file.Paths import java.nio.file.StandardCopyOption import scala.collection.mutable.ListBuffer -import com.sourcegraph.io.CopyVisitor import com.sourcegraph.lsif_java.Embedded import com.sourcegraph.lsif_java.commands.IndexCommand @@ -105,10 +105,25 @@ case class GradleJavaCompiler(languageVersion: String, javacPath: Path) { // as well as /jre/lib in JDK <=8, else we get // "no class roots are found in the JDK path" from the compile{Test}Kotlin tasks. // https://docs.oracle.com/en/java/javase/12/migrate/index.html#JSMIG-GUID-A78CC891-701D-4549-AA4E-B8DD90228B4B + + val copyFiles = + (source: Path, destination: Path) => { + Files + .walk(source) + .forEach(t => { + val destPath = destination.resolve(source.relativize(t)) + try { + Files.copy(t, destPath) + } catch { + case _: NoSuchFileException => + return + } + }) + } + val libPath = dir.resolve("lib") - Files.createDirectory(libPath) val javacLibPath = javacPath.getParent.getParent.resolve("lib") - Files.walkFileTree(javacLibPath, new CopyVisitor(javacLibPath, libPath)) + copyFiles(javacLibPath, libPath) if (languageVersion == "8") { val jreLibPath = dir.resolve("jre").resolve("lib") @@ -119,10 +134,7 @@ case class GradleJavaCompiler(languageVersion: String, javacPath: Path) { .resolve("jre") .resolve("lib") - Files.walkFileTree( - javacJreLibPath, - new CopyVisitor(javacJreLibPath, jreLibPath) - ) + copyFiles(javacJreLibPath, jreLibPath) } } } diff --git a/tests/buildTools/src/test/scala/tests/GradleBuildToolSuite.scala b/tests/buildTools/src/test/scala/tests/GradleBuildToolSuite.scala index a4fd4ce7..6e3c7b9c 100644 --- a/tests/buildTools/src/test/scala/tests/GradleBuildToolSuite.scala +++ b/tests/buildTools/src/test/scala/tests/GradleBuildToolSuite.scala @@ -289,7 +289,7 @@ class GradleBuildToolSuite extends BaseBuildToolSuite { List("8", "11").foreach { version => checkBuild( - "kotlin-jvm-toolchains", + s"kotlin-jvm-toolchains-jdk-$version", s"""|/build.gradle |plugins { | id 'java' From 00b2425caa2cd28017ab6a5048eb166eaba1f1a9 Mon Sep 17 00:00:00 2001 From: Noah S-C Date: Mon, 28 Mar 2022 23:15:30 +0100 Subject: [PATCH 6/7] Update lsif-java/src/main/scala/com/sourcegraph/lsif_java/buildtools/GradleJavaCompiler.scala Co-authored-by: Varun Gandhi --- .../lsif_java/buildtools/GradleJavaCompiler.scala | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/lsif-java/src/main/scala/com/sourcegraph/lsif_java/buildtools/GradleJavaCompiler.scala b/lsif-java/src/main/scala/com/sourcegraph/lsif_java/buildtools/GradleJavaCompiler.scala index 611ccf17..9cc28fd4 100644 --- a/lsif-java/src/main/scala/com/sourcegraph/lsif_java/buildtools/GradleJavaCompiler.scala +++ b/lsif-java/src/main/scala/com/sourcegraph/lsif_java/buildtools/GradleJavaCompiler.scala @@ -100,12 +100,6 @@ case class GradleJavaCompiler(languageVersion: String, javacPath: Path) { .toFile .setExecutable(true) - // For compile{Test}Kotlin when using jvm toolchains, we need to have access - // to JDK internals found in /lib in JDK 9+, - // as well as /jre/lib in JDK <=8, else we get - // "no class roots are found in the JDK path" from the compile{Test}Kotlin tasks. - // https://docs.oracle.com/en/java/javase/12/migrate/index.html#JSMIG-GUID-A78CC891-701D-4549-AA4E-B8DD90228B4B - val copyFiles = (source: Path, destination: Path) => { Files @@ -121,6 +115,11 @@ case class GradleJavaCompiler(languageVersion: String, javacPath: Path) { }) } + // For compile{Test}Kotlin when using jvm toolchains, we need to have access + // to JDK internals found in /lib in JDK 9+, + // as well as /jre/lib in JDK <=8, else we get + // "no class roots are found in the JDK path" from the compile{Test}Kotlin tasks. + // https://docs.oracle.com/en/java/javase/12/migrate/index.html#JSMIG-GUID-A78CC891-701D-4549-AA4E-B8DD90228B4B val libPath = dir.resolve("lib") val javacLibPath = javacPath.getParent.getParent.resolve("lib") copyFiles(javacLibPath, libPath) From acfc4ac094e8208fe3f35f4647b91d21f0e0a9f8 Mon Sep 17 00:00:00 2001 From: Noah Santschi-Cooney Date: Mon, 28 Mar 2022 23:21:11 +0100 Subject: [PATCH 7/7] extract java_home resolving --- .../lsif_java/buildtools/GradleJavaCompiler.scala | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/lsif-java/src/main/scala/com/sourcegraph/lsif_java/buildtools/GradleJavaCompiler.scala b/lsif-java/src/main/scala/com/sourcegraph/lsif_java/buildtools/GradleJavaCompiler.scala index 9cc28fd4..5e1f5a8a 100644 --- a/lsif-java/src/main/scala/com/sourcegraph/lsif_java/buildtools/GradleJavaCompiler.scala +++ b/lsif-java/src/main/scala/com/sourcegraph/lsif_java/buildtools/GradleJavaCompiler.scala @@ -120,18 +120,15 @@ case class GradleJavaCompiler(languageVersion: String, javacPath: Path) { // as well as /jre/lib in JDK <=8, else we get // "no class roots are found in the JDK path" from the compile{Test}Kotlin tasks. // https://docs.oracle.com/en/java/javase/12/migrate/index.html#JSMIG-GUID-A78CC891-701D-4549-AA4E-B8DD90228B4B + val javaHome = javacPath.getParent.getParent val libPath = dir.resolve("lib") - val javacLibPath = javacPath.getParent.getParent.resolve("lib") + val javacLibPath = javaHome.resolve("lib") copyFiles(javacLibPath, libPath) if (languageVersion == "8") { val jreLibPath = dir.resolve("jre").resolve("lib") Files.createDirectories(jreLibPath.getParent) - val javacJreLibPath = javacPath - .getParent - .getParent - .resolve("jre") - .resolve("lib") + val javacJreLibPath = javaHome.resolve("jre").resolve("lib") copyFiles(javacJreLibPath, jreLibPath) }