KT-65684: KAPT: (Re)enable fallback to K1 KAPT and make it default

[KAPT] KT-65684 Set languageVersion=1.9 in KaptToolIntegrationTestGenerated

[KAPT] KT-65684 Re-enable a few now-passing tests in Kapt4IT

[KAPT] KT-65684 Fix the logic setting -Xuse-kapt4 flag in Kapt4IT.forceKapt4()

The change is needed to make sure that all the tests have the flag set,
 otherwise some of them would silently switch to the fallback node.
Also disables a few now failing tests.

[KAPT] KT-65684 Revert "KT-64385 Enable K2 KAPT by default"

This reverts commit 7e9d6e60


Merge-request: KT-MR-14291
Merged-by: Pavel Mikhailovskii <Pavel.Mikhailovskii@jetbrains.com>
This commit is contained in:
Pavel Mikhailovskii
2024-02-09 12:54:28 +00:00
committed by Space Team
parent e532220305
commit 7ab9e03347
40 changed files with 459 additions and 127 deletions
@@ -12,9 +12,9 @@ import org.jetbrains.kotlin.gradle.testbase.*
import org.junit.jupiter.api.AfterEach
import org.junit.jupiter.api.DisplayName
@DisplayName("Kapt3 caching inside Gradle daemon")
@DisplayName("Kapt caching inside Gradle daemon")
@DaemonsGradlePluginTests
open class Kapt3AndGradleDaemon : KGPDaemonsBaseTest() {
class Kapt3AndGradleDaemon : KGPDaemonsBaseTest() {
override val defaultBuildOptions: BuildOptions = super.defaultBuildOptions
.copy(
@@ -22,7 +22,7 @@ open class Kapt3AndGradleDaemon : KGPDaemonsBaseTest() {
verbose = true,
includeCompileClasspath = false
)
).copyEnsuringK1()
)
@DisplayName("Javac should be loaded only once")
@GradleTest
@@ -51,7 +51,7 @@ open class Kapt3AndGradleDaemon : KGPDaemonsBaseTest() {
// which is not compatible with classloaders caching.
@GradleTestVersions(maxVersion = TestVersions.Gradle.G_7_6)
@GradleTest
open fun testAnnotationProcessorClassIsLoadedOnce(gradleVersion: GradleVersion) {
fun testAnnotationProcessorClassIsLoadedOnce(gradleVersion: GradleVersion) {
project(
"javacIsLoadedOnce".withPrefix,
gradleVersion,
@@ -147,10 +147,18 @@ open class Kapt3ClassLoadersCacheIT : Kapt3IT() {
override fun useGeneratedKotlinSource(gradleVersion: GradleVersion) {
}
@Disabled("classloaders cache is leaking file descriptors that prevents cleaning test project")
override fun useGeneratedKotlinSourceK2(gradleVersion: GradleVersion) {
}
@Disabled("classloaders cache is leaking file descriptors that prevents cleaning test project")
override fun testMultipleProcessingPasses(gradleVersion: GradleVersion) {
}
@Disabled("classloaders cache is leaking file descriptors that prevents cleaning test project")
override fun useK2KaptProperty(gradleVersion: GradleVersion) {
}
override fun testAnnotationProcessorAsFqName(gradleVersion: GradleVersion) {
project("annotationProcessorAsFqName".withPrefix, gradleVersion) {
//classloaders caching is not compatible with includeCompileClasspath
@@ -384,13 +392,13 @@ open class Kapt3IT : Kapt3BaseIT() {
@DisplayName("Kapt is working with incremental compilation")
@GradleTest
open fun testSimpleWithIC(gradleVersion: GradleVersion) {
fun testSimpleWithIC(gradleVersion: GradleVersion) {
doTestSimpleWithIC(gradleVersion)
}
@DisplayName("Kapt is working with incremental compilation, when kotlin.incremental.useClasspathSnapshot=true")
@GradleTest
open fun testSimpleWithIC_withClasspathSnapshot(gradleVersion: GradleVersion) {
fun testSimpleWithIC_withClasspathSnapshot(gradleVersion: GradleVersion) {
doTestSimpleWithIC(gradleVersion, useClasspathSnapshot = true)
}
@@ -997,7 +1005,7 @@ open class Kapt3IT : Kapt3BaseIT() {
@DisplayName("Kapt with MPP/Jvm")
@GradleTest
open fun testMPPKaptPresence(gradleVersion: GradleVersion) {
fun testMPPKaptPresence(gradleVersion: GradleVersion) {
project(
"mpp-kapt-presence".withPrefix,
gradleVersion,
@@ -1268,6 +1276,99 @@ open class Kapt3IT : Kapt3BaseIT() {
}
}
@DisplayName("Kapt runs in fallback mode with useK2 = true")
@GradleTest
open fun fallBackModeWithUseK2(gradleVersion: GradleVersion) {
project("simple".withPrefix, gradleVersion) {
buildGradle.appendText(
"""
|tasks.withType(org.jetbrains.kotlin.gradle.tasks.KotlinCompile).configureEach {
| compilerOptions {
| freeCompilerArgs.addAll([
| "-Xuse-fir-ic",
| "-Xuse-fir-lt"
| ])
| }
| kotlinOptions {
| useK2 = true
| }
|}
|
|compileKotlin.kotlinOptions.allWarningsAsErrors = false
""".trimMargin()
)
build("build") {
assertKaptSuccessful()
assertTasksExecuted(":kaptGenerateStubsKotlin", ":kaptKotlin", ":compileKotlin")
assertOutputContains("Falling back to 1.9.")
}
}
}
@DisplayName("Kapt runs in fallback mode with languageVersion = 2.0")
@GradleTest
open fun fallBackModeWithLanguageVersion2_0(gradleVersion: GradleVersion) {
project("simple".withPrefix, gradleVersion) {
buildGradle.appendText(
"""
|tasks.withType(org.jetbrains.kotlin.gradle.tasks.KotlinCompile).configureEach {
| compilerOptions {
| freeCompilerArgs.addAll([
| "-Xuse-fir-ic",
| "-Xuse-fir-lt"
| ])
| }
| kotlinOptions {
| languageVersion = "2.0"
| }
|}
|
|compileKotlin.kotlinOptions.allWarningsAsErrors = false
""".trimMargin()
)
build("build") {
assertKaptSuccessful()
assertTasksExecuted(":kaptGenerateStubsKotlin", ":kaptKotlin", ":compileKotlin")
assertOutputContains("Falling back to 1.9.")
}
}
}
@DisplayName("K2 Kapt can be enabled via Gradle property kapt.use.k2")
@GradleTest
open fun useK2KaptProperty(gradleVersion: GradleVersion) {
project("simple".withPrefix, gradleVersion) {
buildGradle.appendText(
"""
|tasks.withType(org.jetbrains.kotlin.gradle.tasks.KotlinCompile).configureEach {
| compilerOptions {
| freeCompilerArgs.addAll([
| "-Xuse-fir-ic",
| "-Xuse-fir-lt"
| ])
| }
| kotlinOptions {
| languageVersion = "2.0"
| }
|}
|
|compileKotlin.kotlinOptions.allWarningsAsErrors = false
""".trimMargin()
)
build("-Pkapt.use.k2=true", "build") {
assertKaptSuccessful()
assertTasksExecuted(":kaptGenerateStubsKotlin", ":kaptKotlin", ":compileKotlin")
assertOutputDoesNotContain("Falling back to 1.9.")
assertOutputContains("K2 kapt is an experimental feature. Use with caution.")
}
build("-Pkapt.use.k2=true", "cleanCompileKotlin", "compileKotlin") {
assertTasksExecuted(":compileKotlin")
// The warning should not be displayed for the compile task.
assertOutputDoesNotContain("K2 kapt is an experimental feature. Use with caution.")
}
}
}
@DisplayName("Kapt-generated Kotlin sources can be used in Kotlin")
@GradleTest
open fun useGeneratedKotlinSource(gradleVersion: GradleVersion) {
@@ -1279,6 +1380,35 @@ open class Kapt3IT : Kapt3BaseIT() {
}
}
@DisplayName("Kapt-generated Kotlin sources can be used in Kotlin with languageVersion = 2.0")
@GradleTest
open fun useGeneratedKotlinSourceK2(gradleVersion: GradleVersion) {
project("useGeneratedKotlinSource".withPrefix, gradleVersion) {
buildGradle.appendText(
"""
|tasks.withType(org.jetbrains.kotlin.gradle.tasks.KotlinCompile).configureEach {
| compilerOptions {
| freeCompilerArgs.addAll([
| "-Xuse-fir-ic",
| "-Xuse-fir-lt"
| ])
| }
| kotlinOptions {
| languageVersion = "2.0"
| }
|}
|
|compileKotlin.kotlinOptions.allWarningsAsErrors = false
""".trimMargin()
)
build("build") {
assertKaptSuccessful()
assertTasksExecuted(":kaptGenerateStubsKotlin", ":kaptKotlin", ":compileKotlin")
assertOutputContains("Falling back to 1.9.")
}
}
}
@DisplayName("KT-58745: compiler plugin options should be passed to KaptGenerateStubs task")
@GradleTest
fun kaptGenerateStubsConfiguredWithCompilerPluginOptions(gradleVersion: GradleVersion) {
@@ -1,21 +0,0 @@
/*
* Copyright 2010-2024 JetBrains s.r.o. and Kotlin Programming Language contributors.
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
*/
package org.jetbrains.kotlin.gradle
import org.gradle.util.GradleVersion
import org.jetbrains.kotlin.gradle.testbase.BuildOptions
import org.jetbrains.kotlin.gradle.testbase.DaemonsGradlePluginTests
import org.junit.jupiter.api.Disabled
import org.junit.jupiter.api.DisplayName
@DisplayName("Kapt4 caching inside Gradle daemon")
@DaemonsGradlePluginTests
class Kapt4AndGradleDaemon : Kapt3AndGradleDaemon() {
override val defaultBuildOptions: BuildOptions = super.defaultBuildOptions.copyEnsuringK2()
@Disabled("KT-63102 Incremental compilation doesn't work in 2.0")
override fun testAnnotationProcessorClassIsLoadedOnce(gradleVersion: GradleVersion) {}
}
@@ -10,24 +10,29 @@ import org.jetbrains.kotlin.gradle.testbase.*
import org.junit.jupiter.api.Disabled
import org.junit.jupiter.api.DisplayName
import kotlin.io.path.appendText
import kotlin.io.path.name
import kotlin.io.path.walk
@DisplayName("Kapt 4 base checks")
class Kapt4IT : Kapt3IT() {
override val defaultBuildOptions = super.defaultBuildOptions.copyEnsuringK2()
@DisplayName("Kapt doesn't run in fallback mode with languageVersion = 2.0")
@GradleTest
fun noFallBackModeWithLanguageVersion2_0(gradleVersion: GradleVersion) {
project("simple".withPrefix, gradleVersion) {
build("build") {
assertKaptSuccessful()
assertTasksExecuted(":kaptGenerateStubsKotlin", ":kaptKotlin", ":compileKotlin")
assertOutputDoesNotContain("Falling back to 1.9.")
}
}
override fun TestProject.customizeProject() {
forceKapt4()
}
@Disabled("Doesn't make sense in Kapt 4")
override fun useGeneratedKotlinSourceK2(gradleVersion: GradleVersion) {}
@Disabled("Doesn't make sense in Kapt 4")
override fun fallBackModeWithUseK2(gradleVersion: GradleVersion) {}
@Disabled("Doesn't make sense in Kapt 4")
override fun fallBackModeWithLanguageVersion2_0(gradleVersion: GradleVersion) {}
@Disabled("Doesn't make sense in Kapt 4")
override fun useK2KaptProperty(gradleVersion: GradleVersion) {}
@DisplayName("KT-61879: K2 KAPT works with proguarded compiler jars and enum class")
@GradleTest
fun testEnumClass(gradleVersion: GradleVersion) {
@@ -45,15 +50,52 @@ class Kapt4IT : Kapt3IT() {
class Kapt4ClassLoadersCacheIT : Kapt3ClassLoadersCacheIT() {
override val defaultBuildOptions = super.defaultBuildOptions.copyEnsuringK2()
override fun TestProject.customizeProject() {
forceKapt4()
}
@Disabled("Enable when KT-61845 is fixed")
override fun testKt18799(gradleVersion: GradleVersion) {}
@Disabled("KT-63102 Incremental compilation doesn't work in 2.0")
override fun testSimpleWithIC(gradleVersion: GradleVersion) {}
@Disabled("Doesn't make sense in Kapt 4")
override fun useGeneratedKotlinSourceK2(gradleVersion: GradleVersion) {}
@Disabled("KT-63102 Incremental compilation doesn't work in 2.0")
override fun testSimpleWithIC_withClasspathSnapshot(gradleVersion: GradleVersion) {}
@Disabled("Doesn't make sense in Kapt 4")
override fun fallBackModeWithUseK2(gradleVersion: GradleVersion) {}
@Disabled("KT-63102 Incremental compilation doesn't work in 2.0")
override fun testChangeClasspathICRebuild(gradleVersion: GradleVersion) {}
@Disabled("Doesn't make sense in Kapt 4")
override fun fallBackModeWithLanguageVersion2_0(gradleVersion: GradleVersion) {}
}
fun TestProject.forceKapt4() {
projectPath.walk().forEach {
when (it.fileName.name) {
"build.gradle" -> it.appendText(
"""
try {
Class.forName('org.jetbrains.kotlin.gradle.tasks.KotlinCompile')
tasks.withType(org.jetbrains.kotlin.gradle.tasks.KotlinCompile).configureEach {
compilerOptions.freeCompilerArgs.addAll(['-Xuse-kapt4', '-Xsuppress-version-warnings'])
}
} catch(ClassNotFoundException ignore) {
}
""".trimIndent()
)
"build.gradle.kts" -> it.appendText(
"""
try {
Class.forName("org.jetbrains.kotlin.gradle.tasks.KotlinCompile")
tasks.withType(org.jetbrains.kotlin.gradle.tasks.KotlinJvmCompile::class.java).configureEach {
compilerOptions.freeCompilerArgs.addAll(listOf("-Xuse-kapt4", "-Xsuppress-version-warnings"))
}
} catch(ignore: ClassNotFoundException) {
}
""".trimIndent()
)
}
}
}
@@ -3,7 +3,6 @@ package org.jetbrains.kotlin.gradle
import org.gradle.api.logging.LogLevel
import org.gradle.testkit.runner.BuildResult
import org.gradle.util.GradleVersion
import org.jetbrains.kotlin.gradle.dsl.KotlinVersion
import org.jetbrains.kotlin.gradle.testbase.*
import org.junit.jupiter.api.DisplayName
import java.io.File
@@ -30,7 +29,7 @@ open class KaptIncrementalIT : KGPBaseTest() {
override val defaultBuildOptions = super.defaultBuildOptions.copy(
incremental = true,
kaptOptions = BuildOptions.KaptOptions(incrementalKapt = true)
).copyEnsuringK1()
)
protected open fun KGPBaseTest.kaptProject(
gradleVersion: GradleVersion,
@@ -187,10 +186,8 @@ open class KaptIncrementalIT : KGPBaseTest() {
build("assemble") {
assertKapt3FullyExecuted()
if (isIncrementalStubGenerationSupported) {
assertFileInProjectExists("$kapt3IncDataPath/bar/B.class")
assertFileInProjectExists("$kapt3IncDataPath/bar/UseBKt.class")
}
assertFileInProjectExists("$kapt3IncDataPath/bar/B.class")
assertFileInProjectExists("$kapt3IncDataPath/bar/UseBKt.class")
assertFileInProjectExists("$kapt3StubsPath/bar/B.java")
assertFileInProjectExists("$kapt3StubsPath/bar/B.kapt_metadata")
assertFileInProjectExists("$kapt3StubsPath/bar/UseBKt.java")
@@ -285,13 +282,11 @@ open class KaptIncrementalIT : KGPBaseTest() {
assertKapt3FullyExecuted()
val useBKt = javaSourcesDir().resolve("bar/useB.kt")
if (isIncrementalStubGenerationSupported) {
assertCompiledKotlinSources(
listOf(projectPath.relativize(bKt), projectPath.relativize(useBKt)),
getOutputForTask(":kaptGenerateStubsKotlin"),
errorMessageSuffix = " in task 'kaptGenerateStubsKotlin'"
)
}
assertCompiledKotlinSources(
listOf(projectPath.relativize(bKt), projectPath.relativize(useBKt)),
getOutputForTask(":kaptGenerateStubsKotlin"),
errorMessageSuffix = " in task 'kaptGenerateStubsKotlin'"
)
// java removal is detected
assertCompiledKotlinSources(
@@ -348,20 +343,17 @@ open class KaptIncrementalIT : KGPBaseTest() {
buildResult: BuildResult,
sources: List<Path>
) {
if (isIncrementalStubGenerationSupported) {
assertCompiledKotlinSources(
sources,
buildResult.getOutputForTask(":kaptGenerateStubsKotlin"),
errorMessageSuffix = " in task 'kaptGenerateStubsKotlin"
)
assertCompiledKotlinSources(
sources,
buildResult.getOutputForTask(":kaptGenerateStubsKotlin"),
errorMessageSuffix = " in task 'kaptGenerateStubsKotlin"
)
assertCompiledKotlinSources(
sources,
buildResult.getOutputForTask(":compileKotlin"),
errorMessageSuffix = " in task 'compileKotlin'"
)
}
assertCompiledKotlinSources(
sources,
buildResult.getOutputForTask(":compileKotlin"),
errorMessageSuffix = " in task 'compileKotlin'"
)
}
private fun BuildResult.assertKapt3FullyExecuted() {
@@ -398,17 +390,7 @@ open class KaptIncrementalIT : KGPBaseTest() {
val TestProject.kaptGeneratedToPath get() = projectPath.resolve("build/generated/source/kapt")
}
@DisplayName("K2 Kapt incremental compilation")
@OtherGradlePluginTests
class K2KaptIncrementalIT: KaptIncrementalIT() {
override val defaultBuildOptions = super.defaultBuildOptions.copyEnsuringK2()
}
@DisplayName("Kapt incremental compilation with disabled precise compilation outputs backup")
class KaptIncrementalWithoutPreciseBackupIT : KaptIncrementalIT() {
override val defaultBuildOptions = super.defaultBuildOptions.copy(usePreciseOutputsBackup = false, keepIncrementalCompilationCachesInMemory = false)
}
// KT-63102 Incremental compilation doesn't work in 2.0
val TestProject.isIncrementalStubGenerationSupported: Boolean
get() = buildOptions.languageVersion?.startsWith("1") ?: (KotlinVersion.DEFAULT < KotlinVersion.KOTLIN_2_0)
}
@@ -20,7 +20,7 @@ import kotlin.io.path.writeText
import kotlin.test.assertEquals
import kotlin.test.assertTrue
@DisplayName("K1 Kapt incremental tests with aggregating apt")
@DisplayName("Kapt incremental tests with aggregating apt")
open class KaptIncrementalWithAggregatingApt : KaptIncrementalIT() {
override val defaultBuildOptions = super.defaultBuildOptions.copy(
@@ -390,16 +390,8 @@ open class KaptIncrementalWithAggregatingApt : KaptIncrementalIT() {
}
}
@DisplayName("K2 Kapt incremental tests with aggregating apt")
class K2KaptIncrementalWithAggregatingApt: KaptIncrementalWithAggregatingApt() {
override val defaultBuildOptions = super.defaultBuildOptions.copyEnsuringK2()
}
@DisplayName("K1 Kapt incremental tests with aggregating apt with disabled precise compilation outputs backup")
open class KaptIncrementalWithAggregatingAptAndWithoutPreciseBackup : KaptIncrementalWithAggregatingApt() {
@DisplayName("Kapt incremental tests with aggregating apt with disabled precise compilation outputs backup")
class KaptIncrementalWithAggregatingAptAndWithoutPreciseBackup : KaptIncrementalWithAggregatingApt() {
override val defaultBuildOptions = super.defaultBuildOptions.copy(usePreciseOutputsBackup = false, keepIncrementalCompilationCachesInMemory = false)
}
class K2KaptIncrementalWithAggregatingAptAndWithoutPreciseBackup: KaptIncrementalWithAggregatingAptAndWithoutPreciseBackup() {
override val defaultBuildOptions = super.defaultBuildOptions.copyEnsuringK2()
}
@@ -12,7 +12,6 @@ import org.jetbrains.kotlin.gradle.incapt.IncrementalBinaryIsolatingProcessor
import org.jetbrains.kotlin.gradle.incapt.IncrementalProcessor
import org.jetbrains.kotlin.gradle.incapt.IncrementalProcessorReferencingClasspath
import org.jetbrains.kotlin.gradle.testbase.*
import org.junit.jupiter.api.Disabled
import org.junit.jupiter.api.DisplayName
import org.junit.jupiter.api.condition.DisabledOnOs
import org.junit.jupiter.api.condition.OS
@@ -24,7 +23,7 @@ import java.util.zip.ZipOutputStream
import kotlin.io.path.*
import kotlin.test.assertEquals
@DisplayName("K1 Kapt incremental tests with isolating apt")
@DisplayName("Kapt incremental tests with isolating apt")
open class KaptIncrementalWithIsolatingApt : KaptIncrementalIT() {
override val defaultBuildOptions = super.defaultBuildOptions.copy(
@@ -34,7 +33,7 @@ open class KaptIncrementalWithIsolatingApt : KaptIncrementalIT() {
incrementalKapt = true,
includeCompileClasspath = false
)
).copyEnsuringK1()
)
override fun KGPBaseTest.kaptProject(
gradleVersion: GradleVersion,
@@ -319,16 +318,14 @@ open class KaptIncrementalWithIsolatingApt : KaptIncrementalIT() {
}
build(":mylibrary:assembleDebug") {
if (isIncrementalStubGenerationSupported) {
assertEquals(
listOf(
"baseLibrary/build/tmp/kapt3/stubs/debug/error/NonExistentClass.java",
"mylibrary/src/main/java/com/example/lib/ExampleParcel.java",
"baseLibrary/src/main/java/com/example/lib2/basemodule/BaseClassParcel.java",
).map { projectPath.resolve(it).toRealPath().toString() }.toSet(),
getProcessedSources(output)
)
}
assertEquals(
listOf(
"baseLibrary/build/tmp/kapt3/stubs/debug/error/NonExistentClass.java",
"mylibrary/src/main/java/com/example/lib/ExampleParcel.java",
"baseLibrary/src/main/java/com/example/lib2/basemodule/BaseClassParcel.java",
).map { projectPath.resolve(it).toRealPath().toString() }.toSet(),
getProcessedSources(output)
)
}
}
}
@@ -440,21 +437,11 @@ open class KaptIncrementalWithIsolatingApt : KaptIncrementalIT() {
}
}
@DisplayName("K2 Kapt incremental tests with isolating apt")
class K2KaptIncrementalWithIsolatingApt : KaptIncrementalWithIsolatingApt() {
override val defaultBuildOptions = super.defaultBuildOptions.copyEnsuringK2()
}
@DisplayName("K1 Kapt incremental tests with isolating apt with disabled precise compilation outputs backup")
open class KaptIncrementalWithIsolatingAptAndWithoutPreciseBackup : KaptIncrementalWithIsolatingApt() {
@DisplayName("Kapt incremental tests with isolating apt with disabled precise compilation outputs backup")
class KaptIncrementalWithIsolatingAptAndWithoutPreciseBackup : KaptIncrementalWithIsolatingApt() {
override val defaultBuildOptions = super.defaultBuildOptions.copy(usePreciseOutputsBackup = false, keepIncrementalCompilationCachesInMemory = false)
}
@DisplayName("K2 Kapt incremental tests with isolating apt with disabled precise compilation outputs backup")
class K2KaptIncrementalWithIsolatingAptAndWithoutPreciseBackup : KaptIncrementalWithIsolatingAptAndWithoutPreciseBackup() {
override val defaultBuildOptions = super.defaultBuildOptions.copyEnsuringK2()
}
private const val patternApt = "Processing java sources with annotation processors:"
fun getProcessedSources(output: String): Set<String> {
return output.lines().filter { it.contains(patternApt) }.flatMapTo(HashSet()) { logging ->
@@ -5,9 +5,15 @@
package org.jetbrains.kotlin.gradle.android
import org.jetbrains.kotlin.gradle.forceKapt4
import org.jetbrains.kotlin.gradle.testbase.TestProject
import org.junit.jupiter.api.DisplayName
@DisplayName("android with kapt4 tests")
class Kapt4AndroidIT : Kapt3AndroidIT() {
override val defaultBuildOptions = super.defaultBuildOptions.copyEnsuringK2()
override fun TestProject.customizeProject() {
forceKapt4()
}
}
@@ -14,7 +14,7 @@ import kotlin.io.path.deleteRecursively
import kotlin.io.path.writeText
@DisplayName("JVM API validation")
open class KotlinJvmApiTest : KGPBaseTest() {
class KotlinJvmApiTest : KGPBaseTest() {
@DisplayName("Kotlin compilation can be set up using APIs")
@JvmGradlePluginTests
@GradleTest
@@ -51,7 +51,11 @@ open class KotlinJvmApiTest : KGPBaseTest() {
""".trimIndent()
}
build("foo")
val expectedOutput = projectPath.resolve("build/fooOutput/Foo.class")
build("foo") {
assertFileExists(expectedOutput)
}
}
}
@@ -143,6 +147,7 @@ open class KotlinJvmApiTest : KGPBaseTest() {
""".trimIndent()
}
val expectedOutputClass = projectPath.resolve("build/fooOutput/Foo.class")
val expectedOutputStubs = listOf(
projectPath.resolve("build/fooOutputStubs/Foo.java"),
projectPath.resolve("build/fooOutputStubs/Foo.kapt_metadata"),
@@ -150,6 +155,7 @@ open class KotlinJvmApiTest : KGPBaseTest() {
)
build("foo") {
assertFileExists(expectedOutputClass)
expectedOutputStubs.forEach { assertFileExists(it) }
}
}
@@ -25,6 +25,7 @@ import org.gradle.tooling.provider.model.ToolingModelBuilderRegistry
import org.jetbrains.kotlin.gradle.internal.Kapt3GradleSubplugin.Companion.isInfoAsWarnings
import org.jetbrains.kotlin.gradle.internal.Kapt3GradleSubplugin.Companion.isKaptKeepKdocCommentsInStubs
import org.jetbrains.kotlin.gradle.internal.Kapt3GradleSubplugin.Companion.isKaptVerbose
import org.jetbrains.kotlin.gradle.internal.Kapt3GradleSubplugin.Companion.isUseK2
import org.jetbrains.kotlin.gradle.model.builder.KaptModelBuilder
import org.jetbrains.kotlin.gradle.plugin.*
import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinJvmAndroidCompilation
@@ -122,6 +123,10 @@ class Kapt3GradleSubplugin @Inject internal constructor(private val registry: To
return getBooleanOptionValue(BooleanOption.KAPT_KEEP_KDOC_COMMENTS_IN_STUBS)
}
fun Project.isUseK2(): Boolean {
return getBooleanOptionValue(BooleanOption.KAPT_USE_K2)
}
fun Project.classLoadersCacheSize(): Int = findPropertySafe(CLASSLOADERS_CACHE_SIZE)?.toString()?.toInt() ?: 0
fun Project.disableClassloaderCacheForProcessors(): Set<String> {
@@ -213,6 +218,7 @@ class Kapt3GradleSubplugin @Inject internal constructor(private val registry: To
KAPT_INFO_AS_WARNINGS("kapt.info.as.warnings", false),
KAPT_INCLUDE_COMPILE_CLASSPATH("kapt.include.compile.classpath", true),
KAPT_KEEP_KDOC_COMMENTS_IN_STUBS("kapt.keep.kdoc.comments.in.stubs", true),
KAPT_USE_K2("kapt.use.k2", false),
}
}
@@ -532,6 +538,7 @@ internal fun buildKaptSubpluginOptions(
pluginOptions += SubpluginOption("keepKdocCommentsInStubs", "${project.isKaptKeepKdocCommentsInStubs()}")
pluginOptions += SubpluginOption("showProcessorTimings", "${kaptExtension.showProcessorStats}")
pluginOptions += SubpluginOption("detectMemoryLeaks", kaptExtension.detectMemoryLeaks)
pluginOptions += SubpluginOption("useK2", "${project.isUseK2()}")
pluginOptions += SubpluginOption("infoAsWarnings", "${project.isInfoAsWarnings()}")
pluginOptions += FilesSubpluginOption("stubs", kaptStubsDir)
@@ -29,7 +29,6 @@ import org.gradle.workers.WorkerExecutor
import org.jetbrains.kotlin.cli.common.arguments.K2JVMCompilerArguments
import org.jetbrains.kotlin.gradle.dsl.KotlinJvmCompilerOptionsDefault
import org.jetbrains.kotlin.gradle.dsl.KotlinJvmCompilerOptionsHelper
import org.jetbrains.kotlin.gradle.dsl.KotlinVersion
import org.jetbrains.kotlin.gradle.plugin.KotlinCompilerArgumentsProducer.CreateCompilerArgumentsContext
import org.jetbrains.kotlin.gradle.plugin.KotlinCompilerArgumentsProducer.CreateCompilerArgumentsContext.Companion.create
import org.jetbrains.kotlin.gradle.report.BuildReportMode
@@ -67,6 +66,9 @@ abstract class KaptGenerateStubsTask @Inject constructor(
@get:Input
abstract val verbose: Property<Boolean>
@get:Input
abstract val useK2Kapt: Property<Boolean>
/**
* Changes in this additional sources will trigger stubs regeneration,
* but the sources themselves will not be used to find kapt annotations and generate stubs.
@@ -127,6 +129,10 @@ abstract class KaptGenerateStubsTask @Inject constructor(
args.verbose = verbose.get()
args.destinationAsFile = destinationDirectory.get().asFile
if (useK2Kapt.get()) {
args.freeArgs += "-Xuse-kapt4"
}
}
pluginClasspath { args ->
@@ -148,5 +154,5 @@ abstract class KaptGenerateStubsTask @Inject constructor(
}
override fun isIncrementalCompilationEnabled(): Boolean =
super.isIncrementalCompilationEnabled() && compilerOptions.languageVersion.getOrElse(KotlinVersion.DEFAULT) < KotlinVersion.KOTLIN_2_0
super.isIncrementalCompilationEnabled() && !useK2Kapt.get() && ("-Xuse-kapt4" !in compilerOptions.freeCompilerArgs.get())
}
@@ -16,6 +16,7 @@ import org.jetbrains.kotlin.gradle.dsl.KotlinTopLevelExtension
import org.jetbrains.kotlin.gradle.internal.*
import org.jetbrains.kotlin.gradle.internal.Kapt3GradleSubplugin.Companion.KAPT_SUBPLUGIN_ID
import org.jetbrains.kotlin.gradle.internal.Kapt3GradleSubplugin.Companion.isIncludeCompileClasspath
import org.jetbrains.kotlin.gradle.internal.Kapt3GradleSubplugin.Companion.isUseK2
import org.jetbrains.kotlin.gradle.plugin.KaptExtension
import org.jetbrains.kotlin.gradle.plugin.KotlinCompilation
import org.jetbrains.kotlin.gradle.plugin.KotlinCompilationInfo
@@ -49,6 +50,7 @@ internal class KaptGenerateStubsConfig : BaseKotlinCompileConfig<KaptGenerateStu
configureTask { task ->
task.verbose.set(KaptTask.queryKaptVerboseProperty(project))
task.pluginOptions.add(buildOptions(kaptExtension, task))
task.useK2Kapt.value(project.isUseK2()).finalizeValueOnRead()
if (!isIncludeCompileClasspath(kaptExtension)) {
task.onlyIf {
@@ -11,7 +11,7 @@
<properties>
<junit.version>4.13.1</junit.version>
<dagger.version>2.50</dagger.version>
<dagger.version>2.9</dagger.version>
<main.class>coffee.CoffeeApp</main.class>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
@@ -11,7 +11,7 @@
<properties>
<junit.version>4.13.1</junit.version>
<dagger.version>2.50</dagger.version>
<dagger.version>2.9</dagger.version>
<main.class>coffee.CoffeeApp</main.class>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
@@ -11,7 +11,7 @@
<properties>
<junit.version>4.13.1</junit.version>
<dagger.version>2.50</dagger.version>
<dagger.version>2.9</dagger.version>
<main.class>coffee.CoffeeApp</main.class>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>