diff --git a/.github/workflows/continuous_integration.yml b/.github/workflows/continuous_integration.yml index 80fb732e..f5ac6440 100644 --- a/.github/workflows/continuous_integration.yml +++ b/.github/workflows/continuous_integration.yml @@ -23,7 +23,7 @@ jobs: uses: actions/setup-java@v4 with: distribution: "temurin" - java-version: 8 + java-version: 11 - name: Setup gradle uses: gradle/actions/setup-gradle@017a9effdb900e5b5b2fddfb590a105619dca3c3 # version 4.4.2 - name: Test diff --git a/base/build.gradle b/base/build.gradle index 475645d4..32c72bd5 100644 --- a/base/build.gradle +++ b/base/build.gradle @@ -13,11 +13,6 @@ repositories { mavenCentral() } -kotlin { - compilerOptions { - jvmTarget.set(JvmTarget.fromTarget(project.findProperty("target"))) - } -} dependencies { api(libs.proguard.core) @@ -45,14 +40,14 @@ jar { // Early access automatic downloads are not yet supported: // https://github.com/gradle/gradle/issues/14814 // But it will work if e.g. Java N-ea is pre-installed -def javaVersionsForTest = 9..23 +def javaVersionsForTest = 12..25 test { useJUnitPlatform() } def testAllJavaVersion = tasks.register("testAllJavaVersions"){ testAllTask -> - dependsOn(test) // the usual test runs on Java 8 + dependsOn(test) // the usual test runs on Java 11 } javaVersionsForTest.each {version -> diff --git a/base/src/test/kotlin/proguard/Java19RecordPatternTest.kt b/base/src/test/kotlin/proguard/Java19RecordPatternTest.kt index 01519bcc..1de7bc15 100644 --- a/base/src/test/kotlin/proguard/Java19RecordPatternTest.kt +++ b/base/src/test/kotlin/proguard/Java19RecordPatternTest.kt @@ -4,10 +4,10 @@ import io.kotest.core.spec.style.FreeSpec import io.kotest.matchers.shouldNotBe import proguard.testutils.ClassPoolBuilder import proguard.testutils.JavaSource -import testutils.RequiresJavaVersion +import testutils.RequiresJavaExtension -@RequiresJavaVersion(19, 19) class Java19RecordPatternTest : FreeSpec({ + extension(RequiresJavaExtension(from = 19, to = 19)) "Given a class with Java record pattern" - { val (programClassPool, _) = ClassPoolBuilder.fromSource( diff --git a/base/src/test/kotlin/proguard/Java20RecordPatternTest.kt b/base/src/test/kotlin/proguard/Java20RecordPatternTest.kt index 4e1750e4..05f43220 100644 --- a/base/src/test/kotlin/proguard/Java20RecordPatternTest.kt +++ b/base/src/test/kotlin/proguard/Java20RecordPatternTest.kt @@ -4,10 +4,10 @@ import io.kotest.core.spec.style.FreeSpec import io.kotest.matchers.shouldNotBe import proguard.testutils.ClassPoolBuilder import proguard.testutils.JavaSource -import testutils.RequiresJavaVersion +import testutils.RequiresJavaExtension -@RequiresJavaVersion(20, 20) class Java20RecordPatternTest : FreeSpec({ + extension(RequiresJavaExtension(from = 20, to = 20)) "Given a class with Java record pattern" - { val (programClassPool, _) = ClassPoolBuilder.fromSource( diff --git a/base/src/test/kotlin/proguard/optimize/peephole/MethodInlinerJava9Test.kt b/base/src/test/kotlin/proguard/optimize/peephole/MethodInlinerJava9Test.kt index e19a9fe4..e131c368 100644 --- a/base/src/test/kotlin/proguard/optimize/peephole/MethodInlinerJava9Test.kt +++ b/base/src/test/kotlin/proguard/optimize/peephole/MethodInlinerJava9Test.kt @@ -16,9 +16,7 @@ import proguard.optimize.info.ProgramClassOptimizationInfoSetter import proguard.optimize.info.ProgramMemberOptimizationInfoSetter import proguard.testutils.ClassPoolBuilder import proguard.testutils.JavaSource -import testutils.RequiresJavaVersion -@RequiresJavaVersion(9) class MethodInlinerJava9Test : FreeSpec({ isolationMode = IsolationMode.InstancePerTest diff --git a/base/src/test/kotlin/proguard/shrink/UsageMarkerTest.kt b/base/src/test/kotlin/proguard/shrink/UsageMarkerTest.kt index df4bf4eb..56ee417b 100644 --- a/base/src/test/kotlin/proguard/shrink/UsageMarkerTest.kt +++ b/base/src/test/kotlin/proguard/shrink/UsageMarkerTest.kt @@ -17,9 +17,10 @@ import proguard.classfile.visitor.MultiClassVisitor import proguard.resources.file.ResourceFilePool import proguard.testutils.ClassPoolBuilder import proguard.testutils.JavaSource -import proguard.testutils.RequiresJavaVersion +import testutils.RequiresJavaExtension import proguard.util.ProcessingFlagSetter import proguard.util.ProcessingFlags.DONT_SHRINK +import testutils.currentJavaVersion class UsageMarkerTest : BehaviorSpec({ Given("A class pool with interfaces only referenced through annotations") { @@ -89,8 +90,8 @@ class UsageMarkerTest : BehaviorSpec({ }) -@RequiresJavaVersion(15) class Java15UsageMarkerTest : BehaviorSpec({ + extension(RequiresJavaExtension(from = 15)) // Regression test for https://github.com/Guardsquare/proguard/issues/501 Given("A class pool containing a sealed interface extending another sealed interface, and final classes implementing both") { val (programClassPool, _) = ClassPoolBuilder.fromSource( @@ -169,7 +170,7 @@ class Java15UsageMarkerTest : BehaviorSpec({ } """.trimIndent() - ), javacArguments = listOf("--enable-preview", "--release", "15"), + ), javacArguments = if (currentJavaVersion in 15..16) listOf("--enable-preview", "--release", "$currentJavaVersion") else emptyList(), ) val animal = programClassPool.getClass("sample/Animal") diff --git a/base/src/test/kotlin/testutils/TestConfig.kt b/base/src/test/kotlin/testutils/TestConfig.kt index c50862fe..09898e58 100644 --- a/base/src/test/kotlin/testutils/TestConfig.kt +++ b/base/src/test/kotlin/testutils/TestConfig.kt @@ -8,32 +8,21 @@ package testutils import io.kotest.core.config.AbstractProjectConfig -import io.kotest.core.extensions.Extension -import io.kotest.core.filter.SpecFilter -import io.kotest.core.filter.SpecFilterResult -import io.kotest.core.filter.SpecFilterResult.Exclude -import io.kotest.core.filter.SpecFilterResult.Include -import kotlin.reflect.KClass -import kotlin.reflect.full.findAnnotation +import io.kotest.core.extensions.SpecExtension +import io.kotest.core.spec.Spec +import proguard.testutils.currentJavaVersion + @Suppress("UNUSED") -object TestConfig : AbstractProjectConfig() { - override fun extensions(): List { - return listOf(RequiresJavaVersionAnnotationFilter()) - } -} +object TestConfig : AbstractProjectConfig() {} -class RequiresJavaVersionAnnotationFilter : SpecFilter { - override fun filter(kclass: KClass<*>): SpecFilterResult = - if (with(kclass.findAnnotation()) { - (this == null || (currentJavaVersion >= this.from && currentJavaVersion <= this.to)) - } - ) { - Include - } else { - Exclude("Required Java version is not in range.") +class RequiresJavaExtension(private val from: Int, private val to: Int = Int.MAX_VALUE) : SpecExtension { + override suspend fun intercept( + spec: Spec, + execute: suspend (Spec) -> Unit, + ) { + if (currentJavaVersion in from..to) { + execute(spec) } + } } - -@Target(AnnotationTarget.CLASS) -annotation class RequiresJavaVersion(val from: Int, val to: Int = Int.MAX_VALUE) diff --git a/build.gradle b/build.gradle index 26d1e2c1..36bee48e 100644 --- a/build.gradle +++ b/build.gradle @@ -1,3 +1,7 @@ +import org.jetbrains.kotlin.gradle.tasks.KotlinCompilationTask +import org.jetbrains.kotlin.gradle.tasks.KotlinCompile +import org.jetbrains.kotlin.gradle.dsl.JvmTarget +import org.jetbrains.kotlin.gradle.dsl.KotlinVersion plugins { id 'distribution' id 'io.github.gradle-nexus.publish-plugin' @@ -108,11 +112,21 @@ allprojects { Project project -> } java { toolchain { - languageVersion.set(JavaLanguageVersion.of(8)) + languageVersion.set(JavaLanguageVersion.of(11)) } withJavadocJar() withSourcesJar() } + tasks.withType(JavaCompile).configureEach { + if (!it.name.contains("Test")) { + options.release = 8 + } + } + tasks.withType(KotlinCompile).configureEach { + if (!it.name.contains("Test")) { + it.compilerOptions.jvmTarget = JvmTarget.JVM_1_8 + } + } publishing { publications { named(project.name) { diff --git a/gradle-plugin/build.gradle b/gradle-plugin/build.gradle index 9540df5b..a016efff 100644 --- a/gradle-plugin/build.gradle +++ b/gradle-plugin/build.gradle @@ -23,12 +23,6 @@ gradlePlugin { } } -kotlin { - compilerOptions { - jvmTarget.set(JvmTarget.fromTarget(project.findProperty("target"))) - } -} - configurations { fatJar.extendsFrom(compile) } diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index a2307647..c0a220dd 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -5,7 +5,7 @@ commons = "2.18.0" gson = "2.11.0" javaSemver = "0.10.2" json = "20231013" -kotest = "5.9.1" +kotest = "6.1.4" kotlin = "2.2.0" log4j = "2.25.3" mockk = "1.13.13" @@ -23,7 +23,6 @@ kotest-runner-jvm = { group = "io.kotest", name = "kotest-runner-junit5-jvm", ve kotest-assertions-jvm = { group = "io.kotest", name = "kotest-assertions-core-jvm", version.ref = "kotest" } kotest-propery-jvm = { group = "io.kotest", name = "kotest-property-jvm", version.ref = "kotest" } kotlin-compile-testing = { module = "dev.zacsweers.kctfork:core", version.ref = "kotlin-compile-testing" } -kotest-framework-datatest = { group = "io.kotest", name = "kotest-framework-datatest", version.ref = "kotest" } kotlin-stdlib = { group = "org.jetbrains.kotlin", name = "kotlin-stdlib", version.ref = "kotlin" } kotlin-reflect = { group = "org.jetbrains.kotlin", name = "kotlin-reflect", version.ref = "kotlin" } log4j-api = { group = "org.apache.logging.log4j", name = "log4j-api", version.ref = "log4j" } @@ -33,7 +32,7 @@ proguard-core = { group = "com.guardsquare", name = "proguard-core", version.ref [bundles] log4j = ["log4j-api","log4j-core"] -kotest = ["kotest-assertions-jvm", "kotest-runner-jvm", "kotest-propery-jvm", "kotest-framework-datatest"] +kotest = ["kotest-assertions-jvm", "kotest-runner-jvm", "kotest-propery-jvm"] [plugins] kotlin-jvm = { id = "org.jetbrains.kotlin.jvm", version.ref = "kotlin" }