From b750397243ef92e82364e8a716c58dc5e9c37ffa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=93lafur=20P=C3=A1ll=20Geirsson?= Date: Tue, 19 Oct 2021 21:52:21 +0200 Subject: [PATCH] Add support for Java 17 Previously, the SemanticDB compiler plugin crashed when compiling code with Java 17 because it was using private APIs. This commit refactors the code to use blessed public APIs so that compiling with Java 17 works successfully. This commit only fixes the issues for the compiler plugin. Running `lsif-java index` on Gradle/Maven projects will still fail on Java 17 projects since we don't automatically configure the requried `--add-exports` flags. --- .jvmopts | 2 +- bin/coursier | Bin 36225 -> 42577 bytes build.sbt | 77 +++++++++++++++--- .../lsif_semanticdb/JavaVersion.java | 18 ++-- project/JavaToolchainPlugin.scala | 28 +++++-- .../semanticdb_javac/GlobalSymbolsCache.java | 10 ++- 6 files changed, 111 insertions(+), 24 deletions(-) diff --git a/.jvmopts b/.jvmopts index 7fb1642e..cc6fa202 100644 --- a/.jvmopts +++ b/.jvmopts @@ -1,4 +1,4 @@ -Xss2m -Xms1G -Xmx4G --Dfile.encoding=UTF-8 \ No newline at end of file +-Dfile.encoding=UTF-8 diff --git a/bin/coursier b/bin/coursier index e1a8faf784fe544dc76cab16ffe48f6952c6f343..a664bdf828b3e753e764cb1b76f5144c8fc71b8a 100755 GIT binary patch delta 34651 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 Cgh8(W delta 28624 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 diff --git a/build.sbt b/build.sbt index 7fab94c5..1bfd888a 100644 --- a/build.sbt +++ b/build.sbt @@ -4,6 +4,7 @@ import java.io.File import java.nio.file.Files import java.util.Properties import scala.collection.mutable.ListBuffer +import scala.util.control.NoStackTrace lazy val V = new { @@ -271,12 +272,9 @@ commands += def minimizedSourceDirectory = file("tests/minimized/src/main/java").getAbsoluteFile -lazy val minimizedSettings = List[Def.Setting[_]]( - autoScalaLibrary := false, - (publish / skip) := true, - (run / fork) := true, - (Compile / unmanagedSourceDirectories) += minimizedSourceDirectory, - (Compile / javacOptions) ++= + +def semanticdbCompileOptions = + Def.setting { List[String]( s"-Arandomtimestamp=${System.nanoTime()}", List( @@ -288,6 +286,13 @@ lazy val minimizedSettings = List[Def.Setting[_]]( s"-targetroot:${(Compile / semanticdbTargetRoot).value}" ).mkString(" ") ) + } +lazy val minimizedSettings = List[Def.Setting[_]]( + autoScalaLibrary := false, + (publish / skip) := true, + (run / fork) := true, + (Compile / unmanagedSourceDirectories) += minimizedSourceDirectory, + (Compile / javacOptions) ++= semanticdbCompileOptions.value ) lazy val minimized = project @@ -302,13 +307,65 @@ lazy val minimized8 = project .dependsOn(agent, plugin) .disablePlugins(JavaFormatterPlugin) +def javaModuleExports = + List( + "-J--add-exports", + "-Jjdk.compiler/com.sun.tools.javac.api=ALL-UNNAMED", + "-J--add-exports", + "-Jjdk.compiler/com.sun.tools.javac.code=ALL-UNNAMED", + "-J--add-exports", + "-Jjdk.compiler/com.sun.tools.javac.model=ALL-UNNAMED", + "-J--add-exports", + "-Jjdk.compiler/com.sun.tools.javac.tree=ALL-UNNAMED", + "-J--add-exports", + "-Jjdk.compiler/com.sun.tools.javac.util=ALL-UNNAMED" + ) + +def compileWithJava17 = + Def.task { + val args = ListBuffer.empty[String] + val javaSources = (minimized8 / Compile / sources) + .value + .map(_.getAbsolutePath) + val javac = (Compile / javaHome) + .value + .get + .toPath + .resolve("bin") + .resolve("javac") + .toString + val compileClasspath = List( + "-classpath", + (Compile / dependencyClasspath) + .value + .map(_.data.getAbsolutePath) + .mkString(java.io.File.pathSeparator) + ) + val outputDirectory = (Compile / classDirectory).value + IO.delete(outputDirectory) + + args += javac + args ++= javaModuleExports + args ++= List("-d", outputDirectory.getAbsolutePath) + args ++= semanticdbCompileOptions.value + args ++= compileClasspath + args ++= javaSources + val exit = scala.sys.process.Process(args.toList).! + if (exit != 0) { + throw new RuntimeException("javac compilation failed") with NoStackTrace + } + } + lazy val minimized17 = project - .in(file("tests/minimized/.j15")) + .in(file("tests/minimized/.j17")) .settings( minimizedSettings, - // Non-zulu release is blocked by https://github.com/coursier/jvm-index/pull/53 - javaToolchainVersion := "zulu:17", - Compile / javaHome := None + Compile / sources := Nil, + javaToolchainJvmIndex := + Some("https://github.com/coursier/jvm-index/blob/master/index.json"), + javaToolchainVersion := "temurin:17", + Compile / compile := + (Compile / compile).dependsOn(compileWithJava17).value ) .dependsOn(agent, plugin) .disablePlugins(JavaFormatterPlugin) diff --git a/lsif-semanticdb/src/main/java/com/sourcegraph/lsif_semanticdb/JavaVersion.java b/lsif-semanticdb/src/main/java/com/sourcegraph/lsif_semanticdb/JavaVersion.java index d07276a6..b125f702 100644 --- a/lsif-semanticdb/src/main/java/com/sourcegraph/lsif_semanticdb/JavaVersion.java +++ b/lsif-semanticdb/src/main/java/com/sourcegraph/lsif_semanticdb/JavaVersion.java @@ -15,14 +15,18 @@ public class JavaVersion { public final boolean isJava8; public final JdkPackage pkg; - private static PathMatcher CLASS_PATTERN = + private static final PathMatcher CLASS_PATTERN = FileSystems.getDefault().getPathMatcher("glob:**.class"); - private static PathMatcher JAR_PATTERN = FileSystems.getDefault().getPathMatcher("glob:**.jar"); + private static final PathMatcher JAR_PATTERN = + FileSystems.getDefault().getPathMatcher("glob:**.jar"); - public static int JAVA8_VERSION = 8; - public static int JAVA11_VERSION = 11; - public static int DEFAULT_JAVA_VERSION = JAVA8_VERSION; - private static int JAVA0_MAJOR_VERSION = 44; + public static final int JAVA8_VERSION = 8; + public static final int JAVA11_VERSION = 11; + public static final int JAVA17_VERSION = 17; + public static final int DEFAULT_JAVA_VERSION = JAVA8_VERSION; + + @SuppressWarnings("FieldCanBeLocal") + private static final int JAVA0_MAJOR_VERSION = 44; public JavaVersion() { this(System.getProperty("java.version")); @@ -40,9 +44,11 @@ private String javaVersion(String version) { else return version; } + @SuppressWarnings("ManualMinMaxCalculation") public static int roundToNearestStableRelease(int version) { if (version <= JAVA8_VERSION) return JAVA8_VERSION; if (version <= JAVA11_VERSION) return JAVA11_VERSION; + if (version <= JAVA17_VERSION) return JAVA17_VERSION; return version; } diff --git a/project/JavaToolchainPlugin.scala b/project/JavaToolchainPlugin.scala index 0b9c47fd..3de13a14 100644 --- a/project/JavaToolchainPlugin.scala +++ b/project/JavaToolchainPlugin.scala @@ -20,6 +20,9 @@ object JavaToolchainPlugin extends AutoPlugin { lazy val javaToolchainVersion = settingKey[String]( "The version of the Java" ) + lazy val javaToolchainJvmIndex = settingKey[Option[String]]( + "The JVM index to use" + ) } import autoImport._ @@ -36,14 +39,21 @@ object JavaToolchainPlugin extends AutoPlugin { (doc / javacOptions) --= List("-target", "1.8"), (doc / javacOptions) --= bootclasspathSettings(javaToolchainVersion.value), (doc / javacOptions) --= List("-g"), - javaHome := Some(getJavaHome(javaToolchainVersion.value)), + javaHome := + Some( + getJavaHome(javaToolchainVersion.value, javaToolchainJvmIndex.value) + ), javacOptions ++= bootclasspathSettings(javaToolchainVersion.value), javaOptions ++= bootclasspathSettings(javaToolchainVersion.value) ) override lazy val projectSettings: Seq[Def.Setting[_]] = List(Compile, Test).flatMap(c => inConfig(c)(configSettings)) ++ - List(fork := true, javaToolchainVersion := "11") + List( + fork := true, + javaToolchainVersion := "11", + javaToolchainJvmIndex := None + ) /** * For Java 8, we need to manually add the Java compiler to the boot @@ -70,14 +80,20 @@ object JavaToolchainPlugin extends AutoPlugin { private val javaHomeCache: util.Map[String, File] = Collections .synchronizedMap(new util.HashMap[String, File]()) - private def getJavaHome(version: String): File = { + private def getJavaHome( + version: String, + jvmIndex: Option[String] = None + ): File = { javaHomeCache.computeIfAbsent( version, (v: String) => { val coursier = Paths.get("bin", "coursier") - new File( - Process(List(coursier.toString, "java-home", "--jvm", v)).!!.trim - ) + val index = jvmIndex + .toList + .flatMap(index => "--jvm-index" :: index :: Nil) + val arguments = + List(coursier.toString, "java-home", "--jvm", v) ++ index + new File(Process(arguments).!!.trim) } ) } diff --git a/semanticdb-javac/src/main/java/com/sourcegraph/semanticdb_javac/GlobalSymbolsCache.java b/semanticdb-javac/src/main/java/com/sourcegraph/semanticdb_javac/GlobalSymbolsCache.java index 2af332e6..2e6985e3 100644 --- a/semanticdb-javac/src/main/java/com/sourcegraph/semanticdb_javac/GlobalSymbolsCache.java +++ b/semanticdb-javac/src/main/java/com/sourcegraph/semanticdb_javac/GlobalSymbolsCache.java @@ -3,6 +3,7 @@ import com.sun.tools.javac.code.Symbol; import javax.lang.model.element.Element; +import javax.lang.model.element.ElementKind; import javax.lang.model.element.ExecutableElement; import java.util.*; @@ -57,7 +58,14 @@ private String uncachedSemanticdbSymbol(Symbol sym, LocalSymbolsCache locals) { } private boolean isLocalVariable(Symbol sym) { - return sym instanceof Symbol.VarSymbol && sym.isLocal(); + switch (sym.getKind()) { + case PARAMETER: + case EXCEPTION_PARAMETER: + case LOCAL_VARIABLE: + return true; + default: + return false; + } } private boolean isAnonymousClass(Symbol sym) {