diff --git a/build.sbt b/build.sbt index c889c9ec..9ec0252a 100644 --- a/build.sbt +++ b/build.sbt @@ -12,7 +12,7 @@ lazy val V = val scipBindings = "0.8.0" val scalaXml = "2.1.0" val moped = "0.2.0" - val gradle = "7.0" + val gradle = "8.10" val scala213 = "2.13.13" val scalameta = "4.9.3" val kotlinVersion = "2.2.0" @@ -432,14 +432,7 @@ lazy val semanticdbKotlincMinimized = project // Setting javaHome to Some() flips // ZincUtil.compilers/JavaTools.directOrFork from direct → fork. javaHome := Some(file(System.getProperty("java.home"))), - Compile / javacOptions ++= - Seq( - "-J--add-exports=jdk.compiler/com.sun.tools.javac.api=ALL-UNNAMED", - "-J--add-exports=jdk.compiler/com.sun.tools.javac.code=ALL-UNNAMED", - "-J--add-exports=jdk.compiler/com.sun.tools.javac.model=ALL-UNNAMED", - "-J--add-exports=jdk.compiler/com.sun.tools.javac.tree=ALL-UNNAMED", - "-J--add-exports=jdk.compiler/com.sun.tools.javac.util=ALL-UNNAMED" - ), + Compile / javacOptions ++= javacModuleOptions, // Attach the assembled kotlinc fat-jar to the compile classpath. // sbt-kotlin-plugin's AnalyzingKotlinCompiler partitions the classpath: // any jar containing META-INF/services/org.jetbrains.kotlin.compiler.plugin* @@ -516,14 +509,7 @@ lazy val minimizedSettings = List[Def.Setting[_]]( // Fork javac so it receives real file paths instead of sbt's `vf://` virtual-file URIs // (see the comment on `semanticdbKotlincMinimized` for the long story). javaHome := Some(file(System.getProperty("java.home"))), - Compile / javacOptions ++= - Seq( - "-J--add-exports=jdk.compiler/com.sun.tools.javac.api=ALL-UNNAMED", - "-J--add-exports=jdk.compiler/com.sun.tools.javac.code=ALL-UNNAMED", - "-J--add-exports=jdk.compiler/com.sun.tools.javac.model=ALL-UNNAMED", - "-J--add-exports=jdk.compiler/com.sun.tools.javac.tree=ALL-UNNAMED", - "-J--add-exports=jdk.compiler/com.sun.tools.javac.util=ALL-UNNAMED" - ), + Compile / javacOptions ++= javacModuleOptions, javacOptions += List( s"-Xplugin:semanticdb", @@ -542,16 +528,11 @@ lazy val minimized = project .disablePlugins(JavaFormatterPlugin) def javacModuleOptions = 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" + "-J--add-exports=jdk.compiler/com.sun.tools.javac.api=ALL-UNNAMED", + "-J--add-exports=jdk.compiler/com.sun.tools.javac.code=ALL-UNNAMED", + "-J--add-exports=jdk.compiler/com.sun.tools.javac.model=ALL-UNNAMED", + "-J--add-exports=jdk.compiler/com.sun.tools.javac.tree=ALL-UNNAMED", + "-J--add-exports=jdk.compiler/com.sun.tools.javac.util=ALL-UNNAMED" ) lazy val unit = project diff --git a/semanticdb-gradle-plugin/src/main/scala/SemanticdbGradlePlugin.scala b/semanticdb-gradle-plugin/src/main/scala/SemanticdbGradlePlugin.scala index 96d7dafe..b9c531e8 100644 --- a/semanticdb-gradle-plugin/src/main/scala/SemanticdbGradlePlugin.scala +++ b/semanticdb-gradle-plugin/src/main/scala/SemanticdbGradlePlugin.scala @@ -11,8 +11,6 @@ import com.sourcegraph.scip_java.BuildInfo import org.gradle.api.DefaultTask import org.gradle.api.Plugin import org.gradle.api.Project -import org.gradle.api.artifacts.Configuration -import org.gradle.api.provider.Property import org.gradle.api.publish.PublishingExtension import org.gradle.api.publish.maven.MavenPublication import org.gradle.api.tasks.SourceSetContainer @@ -23,7 +21,6 @@ class SemanticdbGradlePlugin extends Plugin[Project] { import Logging._ override def apply(project: Project): Unit = { - val gradle = new GradleVersion(project.getGradle().getGradleVersion()) project.afterEvaluate { project => project.getRepositories().add(project.getRepositories().mavenCentral()) project.getRepositories().add(project.getRepositories().mavenLocal()) @@ -106,60 +103,16 @@ class SemanticdbGradlePlugin extends Plugin[Project] { .getTasks() .withType(classOf[JavaCompile]) .configureEach { task => - // If we run on JDK 17, we need to add special flags to the JVM - // to allow access to the compiler. - - // JDK 17 support was only introduced in 7.3 so - // we don't need to do it for earlier versions - // https://docs.gradle.org/current/userguide/compatibility.html - if (!gradle.is3 && !gradle.is2 && !gradle.is5 && !gradle.is6) { - type JavaCompiler = { - type Metadata = { - type LangVersion = { - def asInt(): Int - } - def getLanguageVersion(): LangVersion - } - def getMetadata(): Metadata - } - - type HasCompilerProperty = { - def getJavaCompiler(): Property[JavaCompiler] - } - - val toolchainCompiler = Option( - task - .asInstanceOf[HasCompilerProperty] - .getJavaCompiler() - .getOrNull() - ).map(_.getMetadata().getLanguageVersion().asInt()) - - val host = System - .getProperty("java.version") - .split("\\.") - .headOption - .map(_.toInt) - - toolchainCompiler - .orElse(host) - .foreach { version => - if (version >= 17) { - val newValue = task.getOptions().getForkOptions() - val jvmArgs = - BuildInfo - .javacModuleOptions - .map(_.stripPrefix("-J")) - .asJava - - newValue.getJvmArgs() match { - case null => - newValue.setJvmArgs(jvmArgs) - case other => - newValue.getJvmArgs().addAll(jvmArgs) - - } - } - } + // Add --add-exports JVM args so our compiler plugin can access + // javac internals. Required on JDK 17+ (JEP 403), no-op on 11-16. + val forkOptions = task.getOptions().getForkOptions() + val jvmArgs = + BuildInfo.javacModuleOptions.map(_.stripPrefix("-J")).asJava + forkOptions.getJvmArgs() match { + case null => + forkOptions.setJvmArgs(jvmArgs) + case _ => + forkOptions.getJvmArgs().addAll(jvmArgs) } task.getOptions().setFork(true) @@ -280,28 +233,6 @@ class SemanticdbGradlePlugin extends Plugin[Project] { } -class GradleVersion(ver: String) { - override def toString(): String = s"[GradleVersion: $ver]" - def is7 = ver.startsWith("7.") - def is8 = ver.startsWith("8.") - def is6 = ver.startsWith("6.") - // 6.7 introduced toolchains support https://blog.gradle.org/java-toolchains - // And javaCompiler property - def is6_7_plus = { - ver match { - case s"6.$x.$y" if x.toInt >= 7 => - true - case s"6.$x" if x.toInt >= 7 => - true - case _ => - false - } - } - def is5 = ver.startsWith("5.") - def is3 = ver.startsWith("3.") - def is2 = ver.startsWith("2.") -} - class WriteDependencies extends DefaultTask { import Logging._ @@ -329,8 +260,6 @@ class WriteDependencies extends DefaultTask { path } - val gradle = new GradleVersion(project.getGradle().getGradleVersion()) - // List the project itself as a dependency so that we can assign project name/version to symbols that are defined in this project. // The code below is roughly equivalent to the following with Groovy: // deps += "$publication.groupId $publication.artifactId $publication.version $sourceSets.main.output.classesDirectory" @@ -411,16 +340,10 @@ class WriteDependencies extends DefaultTask { } } - def canBeResolved(conf: Configuration) = - if (gradle.is2) - !conf.isEmpty() - else - conf.isCanBeResolved() - project .getConfigurations() .forEach { conf => - if (canBeResolved(conf)) { + if (conf.isCanBeResolved()) { try { val resolved = conf.getResolvedConfiguration() resolved diff --git a/tests/buildTools/src/test/scala/tests/GradleBuildToolSuite.scala b/tests/buildTools/src/test/scala/tests/GradleBuildToolSuite.scala index dc054744..12350ee2 100644 --- a/tests/buildTools/src/test/scala/tests/GradleBuildToolSuite.scala +++ b/tests/buildTools/src/test/scala/tests/GradleBuildToolSuite.scala @@ -3,9 +3,6 @@ package tests import tests.Tool._ class Gradle_8_BuildToolSuite extends GradleBuildToolSuite(Gradle8) -class Gradle_7_BuildToolSuite extends GradleBuildToolSuite(Gradle7) -class Gradle_6_BuildToolSuite extends GradleBuildToolSuite(Gradle6) -class Gradle_5_BuildToolSuite extends GradleBuildToolSuite(Gradle5) abstract class GradleBuildToolSuite(gradle: Tool.Gradle) extends GradleBuildToolSuiteBase(gradle) { @@ -39,8 +36,7 @@ abstract class GradleBuildToolSuite(gradle: Tool.Gradle) - build/generated/sources/annotationProcessor/java/main/test/ImmutableWorkflowOptions.java.semanticdb - /META-INF/semanticdb/src/main/java/WorkflowOptions.java.semanticdb */ - expectedSemanticdbFiles = 2, - gradleVersions = List(Gradle8, Gradle7, Gradle6) + expectedSemanticdbFiles = 2 ) checkGradleBuild( @@ -71,8 +67,7 @@ abstract class GradleBuildToolSuite(gradle: Tool.Gradle) """.stripMargin, // See comment about immutable annotation processor above, // it explains why we expecte 2 semanticdb files - expectedSemanticdbFiles = 2, - gradleVersions = List(Gradle8, Gradle7, Gradle6) + expectedSemanticdbFiles = 2 ) checkGradleBuild( @@ -100,12 +95,9 @@ abstract class GradleBuildToolSuite(gradle: Tool.Gradle) |public abstract class ExampleClass {} """.stripMargin, expectedSemanticdbFiles = 1, - gradleVersions = List(Gradle8, Gradle7, Gradle6), expectedPackages = "maven:com.sourcegraph:example-library:1.1" ) - // This is the most basic test for Java support - // We run it for an extended list of Gradle versions checkGradleBuild( "basic", """|/build.gradle @@ -152,9 +144,7 @@ abstract class GradleBuildToolSuite(gradle: Tool.Gradle) | } | } |""".stripMargin, - expectedSemanticdbFiles = 2, - // Only add this test on Gradle 5 in the gradle 6 suite - gradleVersions = List(Gradle8, Gradle7, Gradle6, Gradle5) + expectedSemanticdbFiles = 2 ) allJava.foreach { java => @@ -170,8 +160,7 @@ abstract class GradleBuildToolSuite(gradle: Tool.Gradle) |/src/main/java/Example.java |public class Example {} |""".stripMargin, - expectedSemanticdbFiles = 1, - gradleVersions = List(Gradle8, Gradle7, Gradle6) + expectedSemanticdbFiles = 1 ) } @@ -209,8 +198,7 @@ abstract class GradleBuildToolSuite(gradle: Tool.Gradle) |/src/main/java/Example.java |public class Example {} |""".stripMargin, - expectedSemanticdbFiles = 2, - gradleVersions = List(Gradle8, Gradle7, Gradle6) + expectedSemanticdbFiles = 2 ) checkGradleBuild( @@ -225,8 +213,7 @@ abstract class GradleBuildToolSuite(gradle: Tool.Gradle) | |""".stripMargin, expectedSemanticdbFiles = 2, - extraArguments = List("--build-tool", "gradle"), - gradleVersions = List(Gradle8, Gradle7, Gradle6) + extraArguments = List("--build-tool", "gradle") ) checkGradleBuild( @@ -239,8 +226,7 @@ abstract class GradleBuildToolSuite(gradle: Tool.Gradle) |public class ExampleSuite {} |""".stripMargin, expectedSemanticdbFiles = 1, - extraArguments = List("--", "compileJava"), - gradleVersions = List(Gradle8, Gradle7, Gradle6) + extraArguments = List("--", "compileJava") ) checkGradleBuild( @@ -265,8 +251,7 @@ abstract class GradleBuildToolSuite(gradle: Tool.Gradle) |package foo |class ExampleSuite {} |""".stripMargin, - expectedSemanticdbFiles = 4, - gradleVersions = List(Gradle8) + expectedSemanticdbFiles = 4 ) checkGradleBuild( @@ -311,8 +296,7 @@ abstract class GradleBuildToolSuite(gradle: Tool.Gradle) |maven:org.jetbrains.kotlin:kotlin-stdlib:1.6.20 |maven:org.jetbrains:annotations:13.0 |maven:org.slf4j:slf4j-api:1.7.36 - |""".stripMargin, - gradleVersions = List(Gradle8, Gradle7, Gradle6) + |""".stripMargin ) List("11", "17").foreach { java => @@ -333,53 +317,10 @@ abstract class GradleBuildToolSuite(gradle: Tool.Gradle) |package foo |object Example {} |""".stripMargin, - expectedSemanticdbFiles = 1, - gradleVersions = List(Gradle8) + expectedSemanticdbFiles = 1 ) } - /* - * TODO: Fixing this test for Kotlin 2.1 proved to be difficult. - There are some related deprecations in https://www.jetbrains.com/help/kotlin-multiplatform-dev/multiplatform-compatibility-guide.html#kotlin-2-0-0-and-later - but the test doesn't behave as expected. - */ - // List("jvm()" -> 4, "jvm { withJava() }" -> 4).foreach { - // case (jvmSettings, expectedSemanticdbFiles) => - // checkGradleBuild( - // s"kotlin-multiplatform-$jvmSettings", - // s"""|/build.gradle - // |plugins { - // | id 'org.jetbrains.kotlin.multiplatform' version '2.2.0' - // |} - // |repositories { - // | mavenCentral() - // |} - // |kotlin { - // | ${jvmSettings} - // |} - // |/gradle.properties - // |kotlin.mpp.stability.nowarn=true - // |kotlin.jvm.target.validation.mode=ignore - // |/src/jvmMain/java/foo/ExampleJ.java - // |package foo; - // |public class ExampleJ {} // ignored by multiplatform - // |/src/jvmMain/kotlin/foo/Example.kt - // |package foo - // |object Example {} - // |/src/jvmTest/java/foo/ExampleJSuite.java - // |package foo; - // |class ExampleJSuite {} // ignored by multiplatform - // |/src/commonTest/kotlin/foo/ExampleJvmSuite.kt - // |package foo - // |class ExampleJvmSuite {} - // |""".stripMargin, - // expectedSemanticdbFiles = expectedSemanticdbFiles, - // // Older Kotlin gradle plugins don't support Gradle 8: - // // https://youtrack.jetbrains.com/issue/KT-55704/Cannot-use-TaskAction-annotation-on-method-AbstractKotlinCompile.execute-error-while-using-Gradle-8.0-rc-with-KGP-1.5.32 - // gradleVersions = List(Gradle7, Gradle8) - // ) - // } - // Regression test: projects that lazily register custom source sets (e.g. intTest) // with a Java toolchain would fail because the eager `.all {}` API in the plugin // caused the javaCompiler property to be finalized before Gradle finished @@ -409,8 +350,7 @@ abstract class GradleBuildToolSuite(gradle: Tool.Gradle) |/src/intTest/java/ExampleIntTest.java |public class ExampleIntTest {} |""".stripMargin, - expectedSemanticdbFiles = 1, - gradleVersions = List(Gradle8, Gradle7) + expectedSemanticdbFiles = 1 ) } diff --git a/tests/buildTools/src/test/scala/tests/GradleBuildToolSuiteBase.scala b/tests/buildTools/src/test/scala/tests/GradleBuildToolSuiteBase.scala index 516d90b2..0f01ea73 100644 --- a/tests/buildTools/src/test/scala/tests/GradleBuildToolSuiteBase.scala +++ b/tests/buildTools/src/test/scala/tests/GradleBuildToolSuiteBase.scala @@ -30,21 +30,18 @@ abstract class GradleBuildToolSuiteBase(gradle: Tool.Gradle) expectedSemanticdbFiles: Int = 0, expectedPackages: String = "", extraArguments: List[String] = Nil, - gradleVersions: List[Tool.Gradle] = Nil, tools: List[Tool] = Nil ) = { - if (gradleVersions.contains(gradle)) { - val testName = title.withName(title.name + s"-${gradle.name}") + val testName = title.withName(title.name + s"-${gradle.name}") - checkBuild( - testName, - setup, - expectedSemanticdbFiles = expectedSemanticdbFiles, - expectedPackages = expectedPackages, - initCommand = gradleVersion(gradle.version), - extraArguments = extraArguments, - tools = tools :+ gradle - ) - } + checkBuild( + testName, + setup, + expectedSemanticdbFiles = expectedSemanticdbFiles, + expectedPackages = expectedPackages, + initCommand = gradleVersion(gradle.version), + extraArguments = extraArguments, + tools = tools :+ gradle + ) } } diff --git a/tests/buildTools/src/test/scala/tests/Tool.scala b/tests/buildTools/src/test/scala/tests/Tool.scala index 0e4446d0..e360b049 100644 --- a/tests/buildTools/src/test/scala/tests/Tool.scala +++ b/tests/buildTools/src/test/scala/tests/Tool.scala @@ -37,8 +37,5 @@ object Tool { sealed abstract class Gradle(version: String, support: JVMSupport) extends Tool("gradle", version, support) case object Gradle8 extends Gradle("8.10", atMostJava(21)) - case object Gradle7 extends Gradle("7.6.3", atMostJava(17)) - case object Gradle6 extends Gradle("6.8.3", atMostJava(11)) - case object Gradle5 extends Gradle("5.6.4", atMostJava(11)) }