Skip to content

Commit 28c0442

Browse files
committed
Drop support for Gradle < 8; use Runtime.version().feature()
1 parent 1ef5efe commit 28c0442

4 files changed

Lines changed: 56 additions & 170 deletions

File tree

semanticdb-gradle-plugin/src/main/scala/SemanticdbGradlePlugin.scala

Lines changed: 35 additions & 83 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,6 @@ import com.sourcegraph.scip_java.BuildInfo
1111
import org.gradle.api.DefaultTask
1212
import org.gradle.api.Plugin
1313
import org.gradle.api.Project
14-
import org.gradle.api.artifacts.Configuration
1514
import org.gradle.api.provider.Property
1615
import org.gradle.api.publish.PublishingExtension
1716
import org.gradle.api.publish.maven.MavenPublication
@@ -23,7 +22,6 @@ class SemanticdbGradlePlugin extends Plugin[Project] {
2322
import Logging._
2423

2524
override def apply(project: Project): Unit = {
26-
val gradle = new GradleVersion(project.getGradle().getGradleVersion())
2725
project.afterEvaluate { project =>
2826
project.getRepositories().add(project.getRepositories().mavenCentral())
2927
project.getRepositories().add(project.getRepositories().mavenLocal())
@@ -106,60 +104,44 @@ class SemanticdbGradlePlugin extends Plugin[Project] {
106104
.getTasks()
107105
.withType(classOf[JavaCompile])
108106
.configureEach { task =>
109-
// If we run on JDK 17, we need to add special flags to the JVM
110-
// to allow access to the compiler.
111-
112-
// JDK 17 support was only introduced in 7.3 so
113-
// we don't need to do it for earlier versions
114-
// https://docs.gradle.org/current/userguide/compatibility.html
115-
if (!gradle.is3 && !gradle.is2 && !gradle.is5 && !gradle.is6) {
116-
type JavaCompiler = {
117-
type Metadata = {
118-
type LangVersion = {
119-
def asInt(): Int
120-
}
121-
def getLanguageVersion(): LangVersion
107+
// On JDK 17+ we need --add-exports flags to allow our compiler
108+
// plugin to access javac internals.
109+
type JavaCompiler = {
110+
type Metadata = {
111+
type LangVersion = {
112+
def asInt(): Int
122113
}
123-
def getMetadata(): Metadata
114+
def getLanguageVersion(): LangVersion
124115
}
116+
def getMetadata(): Metadata
117+
}
125118

126-
type HasCompilerProperty = {
127-
def getJavaCompiler(): Property[JavaCompiler]
128-
}
119+
type HasCompilerProperty = {
120+
def getJavaCompiler(): Property[JavaCompiler]
121+
}
129122

130-
val toolchainCompiler = Option(
131-
task
132-
.asInstanceOf[HasCompilerProperty]
133-
.getJavaCompiler()
134-
.getOrNull()
135-
).map(_.getMetadata().getLanguageVersion().asInt())
136-
137-
val host = System
138-
.getProperty("java.version")
139-
.split("\\.")
140-
.headOption
141-
.map(_.toInt)
142-
143-
toolchainCompiler
144-
.orElse(host)
145-
.foreach { version =>
146-
if (version >= 17) {
147-
val newValue = task.getOptions().getForkOptions()
148-
val jvmArgs =
149-
BuildInfo
150-
.javacModuleOptions
151-
.map(_.stripPrefix("-J"))
152-
.asJava
153-
154-
newValue.getJvmArgs() match {
155-
case null =>
156-
newValue.setJvmArgs(jvmArgs)
157-
case other =>
158-
newValue.getJvmArgs().addAll(jvmArgs)
159-
160-
}
161-
}
162-
}
123+
val toolchainCompiler = Option(
124+
task
125+
.asInstanceOf[HasCompilerProperty]
126+
.getJavaCompiler()
127+
.getOrNull()
128+
).map(_.getMetadata().getLanguageVersion().asInt())
129+
130+
val effectiveJavaVersion = toolchainCompiler.getOrElse(
131+
Runtime.version().feature()
132+
)
133+
134+
if (effectiveJavaVersion >= 17) {
135+
val forkOptions = task.getOptions().getForkOptions()
136+
val jvmArgs =
137+
BuildInfo.javacModuleOptions.map(_.stripPrefix("-J")).asJava
138+
139+
forkOptions.getJvmArgs() match {
140+
case null =>
141+
forkOptions.setJvmArgs(jvmArgs)
142+
case _ =>
143+
forkOptions.getJvmArgs().addAll(jvmArgs)
144+
}
163145
}
164146

165147
task.getOptions().setFork(true)
@@ -280,28 +262,6 @@ class SemanticdbGradlePlugin extends Plugin[Project] {
280262

281263
}
282264

283-
class GradleVersion(ver: String) {
284-
override def toString(): String = s"[GradleVersion: $ver]"
285-
def is7 = ver.startsWith("7.")
286-
def is8 = ver.startsWith("8.")
287-
def is6 = ver.startsWith("6.")
288-
// 6.7 introduced toolchains support https://blog.gradle.org/java-toolchains
289-
// And javaCompiler property
290-
def is6_7_plus = {
291-
ver match {
292-
case s"6.$x.$y" if x.toInt >= 7 =>
293-
true
294-
case s"6.$x" if x.toInt >= 7 =>
295-
true
296-
case _ =>
297-
false
298-
}
299-
}
300-
def is5 = ver.startsWith("5.")
301-
def is3 = ver.startsWith("3.")
302-
def is2 = ver.startsWith("2.")
303-
}
304-
305265
class WriteDependencies extends DefaultTask {
306266
import Logging._
307267

@@ -329,8 +289,6 @@ class WriteDependencies extends DefaultTask {
329289
path
330290
}
331291

332-
val gradle = new GradleVersion(project.getGradle().getGradleVersion())
333-
334292
// List the project itself as a dependency so that we can assign project name/version to symbols that are defined in this project.
335293
// The code below is roughly equivalent to the following with Groovy:
336294
// deps += "$publication.groupId $publication.artifactId $publication.version $sourceSets.main.output.classesDirectory"
@@ -411,16 +369,10 @@ class WriteDependencies extends DefaultTask {
411369
}
412370
}
413371

414-
def canBeResolved(conf: Configuration) =
415-
if (gradle.is2)
416-
!conf.isEmpty()
417-
else
418-
conf.isCanBeResolved()
419-
420372
project
421373
.getConfigurations()
422374
.forEach { conf =>
423-
if (canBeResolved(conf)) {
375+
if (conf.isCanBeResolved()) {
424376
try {
425377
val resolved = conf.getResolvedConfiguration()
426378
resolved

tests/buildTools/src/test/scala/tests/GradleBuildToolSuite.scala

Lines changed: 11 additions & 71 deletions
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,6 @@ package tests
33
import tests.Tool._
44

55
class Gradle_8_BuildToolSuite extends GradleBuildToolSuite(Gradle8)
6-
class Gradle_7_BuildToolSuite extends GradleBuildToolSuite(Gradle7)
7-
class Gradle_6_BuildToolSuite extends GradleBuildToolSuite(Gradle6)
8-
class Gradle_5_BuildToolSuite extends GradleBuildToolSuite(Gradle5)
96

107
abstract class GradleBuildToolSuite(gradle: Tool.Gradle)
118
extends GradleBuildToolSuiteBase(gradle) {
@@ -39,8 +36,7 @@ abstract class GradleBuildToolSuite(gradle: Tool.Gradle)
3936
- build/generated/sources/annotationProcessor/java/main/test/ImmutableWorkflowOptions.java.semanticdb
4037
- /META-INF/semanticdb/src/main/java/WorkflowOptions.java.semanticdb
4138
*/
42-
expectedSemanticdbFiles = 2,
43-
gradleVersions = List(Gradle8, Gradle7, Gradle6)
39+
expectedSemanticdbFiles = 2
4440
)
4541

4642
checkGradleBuild(
@@ -71,8 +67,7 @@ abstract class GradleBuildToolSuite(gradle: Tool.Gradle)
7167
""".stripMargin,
7268
// See comment about immutable annotation processor above,
7369
// it explains why we expecte 2 semanticdb files
74-
expectedSemanticdbFiles = 2,
75-
gradleVersions = List(Gradle8, Gradle7, Gradle6)
70+
expectedSemanticdbFiles = 2
7671
)
7772

7873
checkGradleBuild(
@@ -100,12 +95,9 @@ abstract class GradleBuildToolSuite(gradle: Tool.Gradle)
10095
|public abstract class ExampleClass {}
10196
""".stripMargin,
10297
expectedSemanticdbFiles = 1,
103-
gradleVersions = List(Gradle8, Gradle7, Gradle6),
10498
expectedPackages = "maven:com.sourcegraph:example-library:1.1"
10599
)
106100

107-
// This is the most basic test for Java support
108-
// We run it for an extended list of Gradle versions
109101
checkGradleBuild(
110102
"basic",
111103
"""|/build.gradle
@@ -152,9 +144,7 @@ abstract class GradleBuildToolSuite(gradle: Tool.Gradle)
152144
| }
153145
| }
154146
|""".stripMargin,
155-
expectedSemanticdbFiles = 2,
156-
// Only add this test on Gradle 5 in the gradle 6 suite
157-
gradleVersions = List(Gradle8, Gradle7, Gradle6, Gradle5)
147+
expectedSemanticdbFiles = 2
158148
)
159149

160150
allJava.foreach { java =>
@@ -170,8 +160,7 @@ abstract class GradleBuildToolSuite(gradle: Tool.Gradle)
170160
|/src/main/java/Example.java
171161
|public class Example {}
172162
|""".stripMargin,
173-
expectedSemanticdbFiles = 1,
174-
gradleVersions = List(Gradle8, Gradle7, Gradle6)
163+
expectedSemanticdbFiles = 1
175164
)
176165
}
177166

@@ -209,8 +198,7 @@ abstract class GradleBuildToolSuite(gradle: Tool.Gradle)
209198
|/src/main/java/Example.java
210199
|public class Example {}
211200
|""".stripMargin,
212-
expectedSemanticdbFiles = 2,
213-
gradleVersions = List(Gradle8, Gradle7, Gradle6)
201+
expectedSemanticdbFiles = 2
214202
)
215203

216204
checkGradleBuild(
@@ -225,8 +213,7 @@ abstract class GradleBuildToolSuite(gradle: Tool.Gradle)
225213
|<hello/>
226214
|""".stripMargin,
227215
expectedSemanticdbFiles = 2,
228-
extraArguments = List("--build-tool", "gradle"),
229-
gradleVersions = List(Gradle8, Gradle7, Gradle6)
216+
extraArguments = List("--build-tool", "gradle")
230217
)
231218

232219
checkGradleBuild(
@@ -239,8 +226,7 @@ abstract class GradleBuildToolSuite(gradle: Tool.Gradle)
239226
|public class ExampleSuite {}
240227
|""".stripMargin,
241228
expectedSemanticdbFiles = 1,
242-
extraArguments = List("--", "compileJava"),
243-
gradleVersions = List(Gradle8, Gradle7, Gradle6)
229+
extraArguments = List("--", "compileJava")
244230
)
245231

246232
checkGradleBuild(
@@ -265,8 +251,7 @@ abstract class GradleBuildToolSuite(gradle: Tool.Gradle)
265251
|package foo
266252
|class ExampleSuite {}
267253
|""".stripMargin,
268-
expectedSemanticdbFiles = 4,
269-
gradleVersions = List(Gradle8)
254+
expectedSemanticdbFiles = 4
270255
)
271256

272257
checkGradleBuild(
@@ -311,8 +296,7 @@ abstract class GradleBuildToolSuite(gradle: Tool.Gradle)
311296
|maven:org.jetbrains.kotlin:kotlin-stdlib:1.6.20
312297
|maven:org.jetbrains:annotations:13.0
313298
|maven:org.slf4j:slf4j-api:1.7.36
314-
|""".stripMargin,
315-
gradleVersions = List(Gradle8, Gradle7, Gradle6)
299+
|""".stripMargin
316300
)
317301

318302
List("11", "17").foreach { java =>
@@ -333,53 +317,10 @@ abstract class GradleBuildToolSuite(gradle: Tool.Gradle)
333317
|package foo
334318
|object Example {}
335319
|""".stripMargin,
336-
expectedSemanticdbFiles = 1,
337-
gradleVersions = List(Gradle8)
320+
expectedSemanticdbFiles = 1
338321
)
339322
}
340323

341-
/*
342-
* TODO: Fixing this test for Kotlin 2.1 proved to be difficult.
343-
There are some related deprecations in https://www.jetbrains.com/help/kotlin-multiplatform-dev/multiplatform-compatibility-guide.html#kotlin-2-0-0-and-later
344-
but the test doesn't behave as expected.
345-
*/
346-
// List("jvm()" -> 4, "jvm { withJava() }" -> 4).foreach {
347-
// case (jvmSettings, expectedSemanticdbFiles) =>
348-
// checkGradleBuild(
349-
// s"kotlin-multiplatform-$jvmSettings",
350-
// s"""|/build.gradle
351-
// |plugins {
352-
// | id 'org.jetbrains.kotlin.multiplatform' version '2.2.0'
353-
// |}
354-
// |repositories {
355-
// | mavenCentral()
356-
// |}
357-
// |kotlin {
358-
// | ${jvmSettings}
359-
// |}
360-
// |/gradle.properties
361-
// |kotlin.mpp.stability.nowarn=true
362-
// |kotlin.jvm.target.validation.mode=ignore
363-
// |/src/jvmMain/java/foo/ExampleJ.java
364-
// |package foo;
365-
// |public class ExampleJ {} // ignored by multiplatform
366-
// |/src/jvmMain/kotlin/foo/Example.kt
367-
// |package foo
368-
// |object Example {}
369-
// |/src/jvmTest/java/foo/ExampleJSuite.java
370-
// |package foo;
371-
// |class ExampleJSuite {} // ignored by multiplatform
372-
// |/src/commonTest/kotlin/foo/ExampleJvmSuite.kt
373-
// |package foo
374-
// |class ExampleJvmSuite {}
375-
// |""".stripMargin,
376-
// expectedSemanticdbFiles = expectedSemanticdbFiles,
377-
// // Older Kotlin gradle plugins don't support Gradle 8:
378-
// // 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
379-
// gradleVersions = List(Gradle7, Gradle8)
380-
// )
381-
// }
382-
383324
// Regression test: projects that lazily register custom source sets (e.g. intTest)
384325
// with a Java toolchain would fail because the eager `.all {}` API in the plugin
385326
// caused the javaCompiler property to be finalized before Gradle finished
@@ -409,8 +350,7 @@ abstract class GradleBuildToolSuite(gradle: Tool.Gradle)
409350
|/src/intTest/java/ExampleIntTest.java
410351
|public class ExampleIntTest {}
411352
|""".stripMargin,
412-
expectedSemanticdbFiles = 1,
413-
gradleVersions = List(Gradle8, Gradle7)
353+
expectedSemanticdbFiles = 1
414354
)
415355

416356
}

tests/buildTools/src/test/scala/tests/GradleBuildToolSuiteBase.scala

Lines changed: 10 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -30,21 +30,18 @@ abstract class GradleBuildToolSuiteBase(gradle: Tool.Gradle)
3030
expectedSemanticdbFiles: Int = 0,
3131
expectedPackages: String = "",
3232
extraArguments: List[String] = Nil,
33-
gradleVersions: List[Tool.Gradle] = Nil,
3433
tools: List[Tool] = Nil
3534
) = {
36-
if (gradleVersions.contains(gradle)) {
37-
val testName = title.withName(title.name + s"-${gradle.name}")
35+
val testName = title.withName(title.name + s"-${gradle.name}")
3836

39-
checkBuild(
40-
testName,
41-
setup,
42-
expectedSemanticdbFiles = expectedSemanticdbFiles,
43-
expectedPackages = expectedPackages,
44-
initCommand = gradleVersion(gradle.version),
45-
extraArguments = extraArguments,
46-
tools = tools :+ gradle
47-
)
48-
}
37+
checkBuild(
38+
testName,
39+
setup,
40+
expectedSemanticdbFiles = expectedSemanticdbFiles,
41+
expectedPackages = expectedPackages,
42+
initCommand = gradleVersion(gradle.version),
43+
extraArguments = extraArguments,
44+
tools = tools :+ gradle
45+
)
4946
}
5047
}

tests/buildTools/src/test/scala/tests/Tool.scala

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -37,8 +37,5 @@ object Tool {
3737
sealed abstract class Gradle(version: String, support: JVMSupport)
3838
extends Tool("gradle", version, support)
3939
case object Gradle8 extends Gradle("8.10", atMostJava(21))
40-
case object Gradle7 extends Gradle("7.6.3", atMostJava(17))
41-
case object Gradle6 extends Gradle("6.8.3", atMostJava(11))
42-
case object Gradle5 extends Gradle("5.6.4", atMostJava(11))
4340

4441
}

0 commit comments

Comments
 (0)