KT-64385 Enable K2 KAPT by default

Also adds support for front-end compiler plugins in Kapt
This commit is contained in:
strangepleasures
2024-01-15 10:22:32 +00:00
committed by Space Team
parent 8156c91c47
commit 7e9d6e601d
58 changed files with 218 additions and 476 deletions
@@ -78,7 +78,6 @@ fun copyK2JVMCompilerArguments(from: K2JVMCompilerArguments, to: K2JVMCompilerAr
to.typeEnhancementImprovementsInStrictMode = from.typeEnhancementImprovementsInStrictMode to.typeEnhancementImprovementsInStrictMode = from.typeEnhancementImprovementsInStrictMode
to.useFastJarFileSystem = from.useFastJarFileSystem to.useFastJarFileSystem = from.useFastJarFileSystem
to.useJavac = from.useJavac to.useJavac = from.useJavac
to.useKapt4 = from.useKapt4
to.useOldBackend = from.useOldBackend to.useOldBackend = from.useOldBackend
to.useOldClassFilesReading = from.useOldClassFilesReading to.useOldClassFilesReading = from.useOldClassFilesReading
to.useOldInlineClassesManglingScheme = from.useOldInlineClassesManglingScheme to.useOldInlineClassesManglingScheme = from.useOldInlineClassesManglingScheme
@@ -845,16 +845,6 @@ This option is deprecated and will be deleted in future versions."""
field = value field = value
} }
@Argument(
value = "-Xuse-kapt4",
description = "Enable the experimental KAPT 4."
)
var useKapt4 = false
set(value) {
checkFrozen()
field = value
}
override fun configureAnalysisFlags(collector: MessageCollector, languageVersion: LanguageVersion): MutableMap<AnalysisFlag<*>, Any> { override fun configureAnalysisFlags(collector: MessageCollector, languageVersion: LanguageVersion): MutableMap<AnalysisFlag<*>, Any> {
val result = super.configureAnalysisFlags(collector, languageVersion) val result = super.configureAnalysisFlags(collector, languageVersion)
result[JvmAnalysisFlags.strictMetadataVersionSemantics] = strictMetadataVersionSemantics result[JvmAnalysisFlags.strictMetadataVersionSemantics] = strictMetadataVersionSemantics
@@ -8,7 +8,6 @@ package org.jetbrains.kotlin.cli.common
import com.intellij.ide.highlighter.JavaFileType import com.intellij.ide.highlighter.JavaFileType
import org.jetbrains.kotlin.cli.common.arguments.CommonCompilerArguments import org.jetbrains.kotlin.cli.common.arguments.CommonCompilerArguments
import org.jetbrains.kotlin.cli.common.arguments.CommonToolArguments import org.jetbrains.kotlin.cli.common.arguments.CommonToolArguments
import org.jetbrains.kotlin.cli.common.arguments.K2JVMCompilerArguments
import org.jetbrains.kotlin.cli.common.arguments.ManualLanguageFeatureSetting import org.jetbrains.kotlin.cli.common.arguments.ManualLanguageFeatureSetting
import org.jetbrains.kotlin.cli.common.messages.CompilerMessageSeverity import org.jetbrains.kotlin.cli.common.messages.CompilerMessageSeverity
import org.jetbrains.kotlin.cli.common.messages.MessageCollector import org.jetbrains.kotlin.cli.common.messages.MessageCollector
@@ -48,7 +47,6 @@ fun CompilerConfiguration.setupCommonArguments(
} }
} }
switchToFallbackModeIfNecessary(arguments, messageCollector)
setupLanguageVersionSettings(arguments) setupLanguageVersionSettings(arguments)
val usesK2 = arguments.useK2 || languageVersionSettings.languageVersion.usesK2 val usesK2 = arguments.useK2 || languageVersionSettings.languageVersion.usesK2
@@ -57,34 +55,6 @@ fun CompilerConfiguration.setupCommonArguments(
buildHmppModuleStructure(arguments)?.let { put(CommonConfigurationKeys.HMPP_MODULE_STRUCTURE, it) } buildHmppModuleStructure(arguments)?.let { put(CommonConfigurationKeys.HMPP_MODULE_STRUCTURE, it) }
} }
private fun switchToFallbackModeIfNecessary(arguments: CommonCompilerArguments, messageCollector: MessageCollector) {
fun warn(message: String) {
if (!arguments.suppressVersionWarnings) messageCollector.report(CompilerMessageSeverity.STRONG_WARNING, message)
}
if (arguments !is K2JVMCompilerArguments) return
val isK2 =
arguments.useK2 || (arguments.languageVersion?.startsWith('2') ?: (LanguageVersion.LATEST_STABLE >= LanguageVersion.KOTLIN_2_0))
val isKaptUsed = arguments.pluginOptions?.any { it.startsWith("plugin:org.jetbrains.kotlin.kapt3") } == true
when {
isK2 && isKaptUsed && !arguments.useKapt4 -> {
warn("Kapt currently doesn't support language version 2.0+. Falling back to 1.9.")
arguments.languageVersion = LanguageVersion.KOTLIN_1_9.versionString
if (arguments.apiVersion?.startsWith("2") == true) {
arguments.apiVersion = ApiVersion.KOTLIN_1_9.versionString
}
arguments.useK2 = false
arguments.skipMetadataVersionCheck = true
arguments.skipPrereleaseCheck = true
arguments.allowUnstableDependencies = true
}
arguments.useKapt4 -> warn(
if (isK2) "K2 kapt is an experimental feature. Use with caution."
else "-Xuse-kapt4 flag can be only used with language version 2.0+."
)
}
}
fun CompilerConfiguration.setupLanguageVersionSettings(arguments: CommonCompilerArguments) { fun CompilerConfiguration.setupLanguageVersionSettings(arguments: CommonCompilerArguments) {
languageVersionSettings = arguments.toLanguageVersionSettings(getNotNull(CLIConfigurationKeys.MESSAGE_COLLECTOR_KEY)) languageVersionSettings = arguments.toLanguageVersionSettings(getNotNull(CLIConfigurationKeys.MESSAGE_COLLECTOR_KEY))
} }
-1
View File
@@ -142,7 +142,6 @@ where advanced options include:
See KT-45671 for more details. See KT-45671 for more details.
-Xuse-fast-jar-file-system Use the fast implementation of Jar FS. This may speed up compilation time, but it is experimental. -Xuse-fast-jar-file-system Use the fast implementation of Jar FS. This may speed up compilation time, but it is experimental.
-Xuse-javac Use javac for Java source and class file analysis. -Xuse-javac Use javac for Java source and class file analysis.
-Xuse-kapt4 Enable the experimental KAPT 4.
-Xuse-old-backend Use the old JVM backend. -Xuse-old-backend Use the old JVM backend.
-Xuse-old-class-files-reading Use the old implementation for reading class files. This may slow down the compilation and cause problems with Groovy interop. -Xuse-old-class-files-reading Use the old implementation for reading class files. This may slow down the compilation and cause problems with Groovy interop.
This can be used in the event of problems with the new implementation. This can be used in the event of problems with the new implementation.
@@ -12,9 +12,9 @@ import org.jetbrains.kotlin.gradle.testbase.*
import org.junit.jupiter.api.AfterEach import org.junit.jupiter.api.AfterEach
import org.junit.jupiter.api.DisplayName import org.junit.jupiter.api.DisplayName
@DisplayName("Kapt caching inside Gradle daemon") @DisplayName("Kapt3 caching inside Gradle daemon")
@DaemonsGradlePluginTests @DaemonsGradlePluginTests
class Kapt3AndGradleDaemon : KGPDaemonsBaseTest() { open class Kapt3AndGradleDaemon : KGPDaemonsBaseTest() {
override val defaultBuildOptions: BuildOptions = super.defaultBuildOptions override val defaultBuildOptions: BuildOptions = super.defaultBuildOptions
.copy( .copy(
@@ -22,7 +22,7 @@ class Kapt3AndGradleDaemon : KGPDaemonsBaseTest() {
verbose = true, verbose = true,
includeCompileClasspath = false includeCompileClasspath = false
) )
) ).copyEnsuringK1()
@DisplayName("Javac should be loaded only once") @DisplayName("Javac should be loaded only once")
@GradleTest @GradleTest
@@ -51,7 +51,7 @@ class Kapt3AndGradleDaemon : KGPDaemonsBaseTest() {
// which is not compatible with classloaders caching. // which is not compatible with classloaders caching.
@GradleTestVersions(maxVersion = TestVersions.Gradle.G_7_6) @GradleTestVersions(maxVersion = TestVersions.Gradle.G_7_6)
@GradleTest @GradleTest
fun testAnnotationProcessorClassIsLoadedOnce(gradleVersion: GradleVersion) { open fun testAnnotationProcessorClassIsLoadedOnce(gradleVersion: GradleVersion) {
project( project(
"javacIsLoadedOnce".withPrefix, "javacIsLoadedOnce".withPrefix,
gradleVersion, gradleVersion,
@@ -145,18 +145,10 @@ open class Kapt3ClassLoadersCacheIT : Kapt3IT() {
override fun useGeneratedKotlinSource(gradleVersion: GradleVersion) { 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") @Disabled("classloaders cache is leaking file descriptors that prevents cleaning test project")
override fun testMultipleProcessingPasses(gradleVersion: GradleVersion) { 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) { override fun testAnnotationProcessorAsFqName(gradleVersion: GradleVersion) {
project("annotationProcessorAsFqName".withPrefix, gradleVersion) { project("annotationProcessorAsFqName".withPrefix, gradleVersion) {
//classloaders caching is not compatible with includeCompileClasspath //classloaders caching is not compatible with includeCompileClasspath
@@ -1258,99 +1250,6 @@ 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") @DisplayName("Kapt-generated Kotlin sources can be used in Kotlin")
@GradleTest @GradleTest
open fun useGeneratedKotlinSource(gradleVersion: GradleVersion) { open fun useGeneratedKotlinSource(gradleVersion: GradleVersion) {
@@ -1362,35 +1261,6 @@ 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") @DisplayName("KT-58745: compiler plugin options should be passed to KaptGenerateStubs task")
@GradleTest @GradleTest
fun kaptGenerateStubsConfiguredWithCompilerPluginOptions(gradleVersion: GradleVersion) { fun kaptGenerateStubsConfiguredWithCompilerPluginOptions(gradleVersion: GradleVersion) {
@@ -0,0 +1,21 @@
/*
* 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,29 +10,24 @@ import org.jetbrains.kotlin.gradle.testbase.*
import org.junit.jupiter.api.Disabled import org.junit.jupiter.api.Disabled
import org.junit.jupiter.api.DisplayName import org.junit.jupiter.api.DisplayName
import kotlin.io.path.appendText import kotlin.io.path.appendText
import kotlin.io.path.name
import kotlin.io.path.walk
@DisplayName("Kapt 4 base checks") @DisplayName("Kapt 4 base checks")
class Kapt4IT : Kapt3IT() { class Kapt4IT : Kapt3IT() {
override val defaultBuildOptions = super.defaultBuildOptions.copyEnsuringK2() override val defaultBuildOptions = super.defaultBuildOptions.copyEnsuringK2()
override fun TestProject.customizeProject() { @DisplayName("Kapt doesn't run in fallback mode with languageVersion = 2.0")
forceKapt4() @GradleTest
fun noFallBackModeWithLanguageVersion2_0(gradleVersion: GradleVersion) {
project("simple".withPrefix, gradleVersion) {
build("build") {
assertKaptSuccessful()
assertTasksExecuted(":kaptGenerateStubsKotlin", ":kaptKotlin", ":compileKotlin")
assertOutputDoesNotContain("Falling back to 1.9.")
}
}
} }
@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") @DisplayName("KT-61879: K2 KAPT works with proguarded compiler jars and enum class")
@GradleTest @GradleTest
fun testEnumClass(gradleVersion: GradleVersion) { fun testEnumClass(gradleVersion: GradleVersion) {
@@ -50,57 +45,15 @@ class Kapt4IT : Kapt3IT() {
class Kapt4ClassLoadersCacheIT : Kapt3ClassLoadersCacheIT() { class Kapt4ClassLoadersCacheIT : Kapt3ClassLoadersCacheIT() {
override val defaultBuildOptions = super.defaultBuildOptions.copyEnsuringK2() override val defaultBuildOptions = super.defaultBuildOptions.copyEnsuringK2()
override fun TestProject.customizeProject() {
forceKapt4()
}
@Disabled("Enable when KT-61845 is fixed") @Disabled("Enable when KT-61845 is fixed")
override fun testKt18799(gradleVersion: GradleVersion) {} override fun testKt18799(gradleVersion: GradleVersion) {}
@Disabled("Doesn't make sense in Kapt 4") @Disabled("KT-63102 Incremental compilation doesn't work in 2.0")
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 work in 2.0. Neither with Kapt 3 nor with Kapt 4")
override fun testMPPKaptPresence(gradleVersion: GradleVersion) {}
@Disabled("Incremental compilation doesn't work in 2.0")
override fun testSimpleWithIC(gradleVersion: GradleVersion) {} override fun testSimpleWithIC(gradleVersion: GradleVersion) {}
@Disabled("Incremental compilation doesn't work in 2.0") @Disabled("KT-63102 Incremental compilation doesn't work in 2.0")
override fun testSimpleWithIC_withClasspathSnapshot(gradleVersion: GradleVersion) {} override fun testSimpleWithIC_withClasspathSnapshot(gradleVersion: GradleVersion) {}
}
@Disabled("KT-63102 Incremental compilation doesn't work in 2.0")
fun TestProject.forceKapt4() { override fun testChangeClasspathICRebuild(gradleVersion: GradleVersion) {}
projectPath.walk().forEach {
when (it.fileName.name) {
"build.gradle" -> it.appendText(
"""
pluginManager.withPlugin('kotlin') {
tasks.withType(org.jetbrains.kotlin.gradle.tasks.KotlinCompile).configureEach {
compilerOptions.freeCompilerArgs.addAll(['-Xuse-kapt4', '-Xsuppress-version-warnings'])
}
}
""".trimIndent()
)
"build.gradle.kts" -> it.appendText(
"""
pluginManager.withPlugin("kotlin") {
tasks.withType(org.jetbrains.kotlin.gradle.tasks.KotlinJvmCompile::class.java).configureEach {
compilerOptions.freeCompilerArgs.addAll(listOf("-Xuse-kapt4", "-Xsuppress-version-warnings"))
}
}
""".trimIndent()
)
}
}
} }
@@ -3,6 +3,7 @@ package org.jetbrains.kotlin.gradle
import org.gradle.api.logging.LogLevel import org.gradle.api.logging.LogLevel
import org.gradle.testkit.runner.BuildResult import org.gradle.testkit.runner.BuildResult
import org.gradle.util.GradleVersion import org.gradle.util.GradleVersion
import org.jetbrains.kotlin.gradle.dsl.KotlinVersion
import org.jetbrains.kotlin.gradle.testbase.* import org.jetbrains.kotlin.gradle.testbase.*
import org.junit.jupiter.api.DisplayName import org.junit.jupiter.api.DisplayName
import java.io.File import java.io.File
@@ -29,7 +30,7 @@ open class KaptIncrementalIT : KGPBaseTest() {
override val defaultBuildOptions = super.defaultBuildOptions.copy( override val defaultBuildOptions = super.defaultBuildOptions.copy(
incremental = true, incremental = true,
kaptOptions = BuildOptions.KaptOptions(incrementalKapt = true) kaptOptions = BuildOptions.KaptOptions(incrementalKapt = true)
) ).copyEnsuringK1()
protected open fun KGPBaseTest.kaptProject( protected open fun KGPBaseTest.kaptProject(
gradleVersion: GradleVersion, gradleVersion: GradleVersion,
@@ -186,8 +187,10 @@ open class KaptIncrementalIT : KGPBaseTest() {
build("assemble") { build("assemble") {
assertKapt3FullyExecuted() assertKapt3FullyExecuted()
assertFileInProjectExists("$kapt3IncDataPath/bar/B.class") if (isIncrementalStubGenerationSupported) {
assertFileInProjectExists("$kapt3IncDataPath/bar/UseBKt.class") assertFileInProjectExists("$kapt3IncDataPath/bar/B.class")
assertFileInProjectExists("$kapt3IncDataPath/bar/UseBKt.class")
}
assertFileInProjectExists("$kapt3StubsPath/bar/B.java") assertFileInProjectExists("$kapt3StubsPath/bar/B.java")
assertFileInProjectExists("$kapt3StubsPath/bar/B.kapt_metadata") assertFileInProjectExists("$kapt3StubsPath/bar/B.kapt_metadata")
assertFileInProjectExists("$kapt3StubsPath/bar/UseBKt.java") assertFileInProjectExists("$kapt3StubsPath/bar/UseBKt.java")
@@ -282,11 +285,13 @@ open class KaptIncrementalIT : KGPBaseTest() {
assertKapt3FullyExecuted() assertKapt3FullyExecuted()
val useBKt = javaSourcesDir().resolve("bar/useB.kt") val useBKt = javaSourcesDir().resolve("bar/useB.kt")
assertCompiledKotlinSources( if (isIncrementalStubGenerationSupported) {
listOf(projectPath.relativize(bKt), projectPath.relativize(useBKt)), assertCompiledKotlinSources(
getOutputForTask(":kaptGenerateStubsKotlin"), listOf(projectPath.relativize(bKt), projectPath.relativize(useBKt)),
errorMessageSuffix = " in task 'kaptGenerateStubsKotlin'" getOutputForTask(":kaptGenerateStubsKotlin"),
) errorMessageSuffix = " in task 'kaptGenerateStubsKotlin'"
)
}
// java removal is detected // java removal is detected
assertCompiledKotlinSources( assertCompiledKotlinSources(
@@ -343,17 +348,20 @@ open class KaptIncrementalIT : KGPBaseTest() {
buildResult: BuildResult, buildResult: BuildResult,
sources: List<Path> sources: List<Path>
) { ) {
assertCompiledKotlinSources( if (isIncrementalStubGenerationSupported) {
sources, assertCompiledKotlinSources(
buildResult.getOutputForTask(":kaptGenerateStubsKotlin"), sources,
errorMessageSuffix = " in task 'kaptGenerateStubsKotlin" buildResult.getOutputForTask(":kaptGenerateStubsKotlin"),
) errorMessageSuffix = " in task 'kaptGenerateStubsKotlin"
)
assertCompiledKotlinSources(
sources, assertCompiledKotlinSources(
buildResult.getOutputForTask(":compileKotlin"), sources,
errorMessageSuffix = " in task 'compileKotlin'" buildResult.getOutputForTask(":compileKotlin"),
) errorMessageSuffix = " in task 'compileKotlin'"
)
}
} }
private fun BuildResult.assertKapt3FullyExecuted() { private fun BuildResult.assertKapt3FullyExecuted() {
@@ -390,7 +398,17 @@ open class KaptIncrementalIT : KGPBaseTest() {
val TestProject.kaptGeneratedToPath get() = projectPath.resolve("build/generated/source/kapt") 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") @DisplayName("Kapt incremental compilation with disabled precise compilation outputs backup")
class KaptIncrementalWithoutPreciseBackupIT : KaptIncrementalIT() { class KaptIncrementalWithoutPreciseBackupIT : KaptIncrementalIT() {
override val defaultBuildOptions = super.defaultBuildOptions.copy(usePreciseOutputsBackup = false, keepIncrementalCompilationCachesInMemory = false) 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.assertEquals
import kotlin.test.assertTrue import kotlin.test.assertTrue
@DisplayName("Kapt incremental tests with aggregating apt") @DisplayName("K1 Kapt incremental tests with aggregating apt")
open class KaptIncrementalWithAggregatingApt : KaptIncrementalIT() { open class KaptIncrementalWithAggregatingApt : KaptIncrementalIT() {
override val defaultBuildOptions = super.defaultBuildOptions.copy( override val defaultBuildOptions = super.defaultBuildOptions.copy(
@@ -390,8 +390,16 @@ open class KaptIncrementalWithAggregatingApt : KaptIncrementalIT() {
} }
} }
@DisplayName("K2 Kapt incremental tests with aggregating apt")
class K2KaptIncrementalWithAggregatingApt: KaptIncrementalWithAggregatingApt() {
override val defaultBuildOptions = super.defaultBuildOptions.copyEnsuringK2()
}
@DisplayName("Kapt incremental tests with aggregating apt with disabled precise compilation outputs backup") @DisplayName("K1 Kapt incremental tests with aggregating apt with disabled precise compilation outputs backup")
class KaptIncrementalWithAggregatingAptAndWithoutPreciseBackup : KaptIncrementalWithAggregatingApt() { open class KaptIncrementalWithAggregatingAptAndWithoutPreciseBackup : KaptIncrementalWithAggregatingApt() {
override val defaultBuildOptions = super.defaultBuildOptions.copy(usePreciseOutputsBackup = false, keepIncrementalCompilationCachesInMemory = false) override val defaultBuildOptions = super.defaultBuildOptions.copy(usePreciseOutputsBackup = false, keepIncrementalCompilationCachesInMemory = false)
} }
class K2KaptIncrementalWithAggregatingAptAndWithoutPreciseBackup: KaptIncrementalWithAggregatingAptAndWithoutPreciseBackup() {
override val defaultBuildOptions = super.defaultBuildOptions.copyEnsuringK2()
}
@@ -12,6 +12,7 @@ import org.jetbrains.kotlin.gradle.incapt.IncrementalBinaryIsolatingProcessor
import org.jetbrains.kotlin.gradle.incapt.IncrementalProcessor import org.jetbrains.kotlin.gradle.incapt.IncrementalProcessor
import org.jetbrains.kotlin.gradle.incapt.IncrementalProcessorReferencingClasspath import org.jetbrains.kotlin.gradle.incapt.IncrementalProcessorReferencingClasspath
import org.jetbrains.kotlin.gradle.testbase.* import org.jetbrains.kotlin.gradle.testbase.*
import org.junit.jupiter.api.Disabled
import org.junit.jupiter.api.DisplayName import org.junit.jupiter.api.DisplayName
import org.junit.jupiter.api.condition.DisabledOnOs import org.junit.jupiter.api.condition.DisabledOnOs
import org.junit.jupiter.api.condition.OS import org.junit.jupiter.api.condition.OS
@@ -23,7 +24,7 @@ import java.util.zip.ZipOutputStream
import kotlin.io.path.* import kotlin.io.path.*
import kotlin.test.assertEquals import kotlin.test.assertEquals
@DisplayName("Kapt incremental tests with isolating apt") @DisplayName("K1 Kapt incremental tests with isolating apt")
open class KaptIncrementalWithIsolatingApt : KaptIncrementalIT() { open class KaptIncrementalWithIsolatingApt : KaptIncrementalIT() {
override val defaultBuildOptions = super.defaultBuildOptions.copy( override val defaultBuildOptions = super.defaultBuildOptions.copy(
@@ -33,7 +34,7 @@ open class KaptIncrementalWithIsolatingApt : KaptIncrementalIT() {
incrementalKapt = true, incrementalKapt = true,
includeCompileClasspath = false includeCompileClasspath = false
) )
) ).copyEnsuringK1()
override fun KGPBaseTest.kaptProject( override fun KGPBaseTest.kaptProject(
gradleVersion: GradleVersion, gradleVersion: GradleVersion,
@@ -318,14 +319,16 @@ open class KaptIncrementalWithIsolatingApt : KaptIncrementalIT() {
} }
build(":mylibrary:assembleDebug") { build(":mylibrary:assembleDebug") {
assertEquals( if (isIncrementalStubGenerationSupported) {
listOf( assertEquals(
"baseLibrary/build/tmp/kapt3/stubs/debug/error/NonExistentClass.java", listOf(
"mylibrary/src/main/java/com/example/lib/ExampleParcel.java", "baseLibrary/build/tmp/kapt3/stubs/debug/error/NonExistentClass.java",
"baseLibrary/src/main/java/com/example/lib2/basemodule/BaseClassParcel.java", "mylibrary/src/main/java/com/example/lib/ExampleParcel.java",
).map { projectPath.resolve(it).toRealPath().toString() }.toSet(), "baseLibrary/src/main/java/com/example/lib2/basemodule/BaseClassParcel.java",
getProcessedSources(output) ).map { projectPath.resolve(it).toRealPath().toString() }.toSet(),
) getProcessedSources(output)
)
}
} }
} }
} }
@@ -437,11 +440,21 @@ open class KaptIncrementalWithIsolatingApt : KaptIncrementalIT() {
} }
} }
@DisplayName("Kapt incremental tests with isolating apt with disabled precise compilation outputs backup") @DisplayName("K2 Kapt incremental tests with isolating apt")
class KaptIncrementalWithIsolatingAptAndWithoutPreciseBackup : KaptIncrementalWithIsolatingApt() { 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() {
override val defaultBuildOptions = super.defaultBuildOptions.copy(usePreciseOutputsBackup = false, keepIncrementalCompilationCachesInMemory = false) 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:" private const val patternApt = "Processing java sources with annotation processors:"
fun getProcessedSources(output: String): Set<String> { fun getProcessedSources(output: String): Set<String> {
return output.lines().filter { it.contains(patternApt) }.flatMapTo(HashSet()) { logging -> return output.lines().filter { it.contains(patternApt) }.flatMapTo(HashSet()) { logging ->
@@ -135,7 +135,7 @@ open class Kapt3AndroidExternalIT : Kapt3BaseIT() {
@DisplayName("kapt works with databinding") @DisplayName("kapt works with databinding")
@GradleAndroidTest @GradleAndroidTest
fun testDatabinding( open fun testDatabinding(
gradleVersion: GradleVersion, gradleVersion: GradleVersion,
agpVersion: String, agpVersion: String,
jdkVersion: JdkVersions.ProvidedJdk, jdkVersion: JdkVersions.ProvidedJdk,
@@ -213,7 +213,7 @@ open class Kapt3AndroidExternalIT : Kapt3BaseIT() {
@DisplayName("KT-61622: common sources are attached in MPP + Android project") @DisplayName("KT-61622: common sources are attached in MPP + Android project")
@GradleAndroidTest @GradleAndroidTest
fun testMppAndroidKapt( open fun testMppAndroidKapt(
gradleVersion: GradleVersion, gradleVersion: GradleVersion,
agpVersion: String, agpVersion: String,
jdkVersion: JdkVersions.ProvidedJdk, jdkVersion: JdkVersions.ProvidedJdk,
@@ -78,7 +78,7 @@ open class Kapt3AndroidIncrementalIT : Kapt3BaseIT() {
@DisplayName("incremental compilation works with dagger") @DisplayName("incremental compilation works with dagger")
@GradleAndroidTest @GradleAndroidTest
fun testAndroidDaggerIC( open fun testAndroidDaggerIC(
gradleVersion: GradleVersion, gradleVersion: GradleVersion,
agpVersion: String, agpVersion: String,
jdkVersion: JdkVersions.ProvidedJdk, jdkVersion: JdkVersions.ProvidedJdk,
@@ -160,7 +160,7 @@ open class Kapt3AndroidIncrementalIT : Kapt3BaseIT() {
@DisplayName("inter-project IC works with kapt") @DisplayName("inter-project IC works with kapt")
@GradleAndroidTest @GradleAndroidTest
fun testInterProjectIC( open fun testInterProjectIC(
gradleVersion: GradleVersion, gradleVersion: GradleVersion,
agpVersion: String, agpVersion: String,
jdkVersion: JdkVersions.ProvidedJdk, jdkVersion: JdkVersions.ProvidedJdk,
@@ -5,16 +5,19 @@
package org.jetbrains.kotlin.gradle.android package org.jetbrains.kotlin.gradle.android
import org.jetbrains.kotlin.config.LanguageVersion import org.gradle.util.GradleVersion
import org.jetbrains.kotlin.gradle.forceKapt4 import org.jetbrains.kotlin.gradle.testbase.JdkVersions
import org.jetbrains.kotlin.gradle.testbase.TestProject import org.junit.jupiter.api.Disabled
import org.junit.jupiter.api.DisplayName import org.junit.jupiter.api.DisplayName
@DisplayName("android with kapt4 external dependencies tests") @DisplayName("android with kapt4 external dependencies tests")
class Kapt4AndroidExternalIT : Kapt3AndroidExternalIT() { class Kapt4AndroidExternalIT : Kapt3AndroidExternalIT() {
override val defaultBuildOptions = super.defaultBuildOptions.copyEnsuringK2() override val defaultBuildOptions = super.defaultBuildOptions.copyEnsuringK2()
override fun TestProject.customizeProject() { @Disabled("KT-62345")
forceKapt4() override fun testMppAndroidKapt(
} gradleVersion: GradleVersion,
agpVersion: String,
jdkVersion: JdkVersions.ProvidedJdk,
) {}
} }
@@ -5,15 +5,9 @@
package org.jetbrains.kotlin.gradle.android 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 import org.junit.jupiter.api.DisplayName
@DisplayName("android with kapt4 tests") @DisplayName("android with kapt4 tests")
class Kapt4AndroidIT : Kapt3AndroidIT() { class Kapt4AndroidIT : Kapt3AndroidIT() {
override val defaultBuildOptions = super.defaultBuildOptions.copyEnsuringK2() override val defaultBuildOptions = super.defaultBuildOptions.copyEnsuringK2()
override fun TestProject.customizeProject() {
forceKapt4()
}
} }
@@ -5,16 +5,21 @@
package org.jetbrains.kotlin.gradle.android package org.jetbrains.kotlin.gradle.android
import org.jetbrains.kotlin.gradle.forceKapt4 import org.gradle.util.GradleVersion
import org.jetbrains.kotlin.gradle.testbase.TestProject import org.jetbrains.kotlin.gradle.testbase.JdkVersions
import org.junit.jupiter.api.Disabled
import org.junit.jupiter.api.DisplayName import org.junit.jupiter.api.DisplayName
@DisplayName("android with kapt4 incremental build tests") @DisplayName("android with kapt4 incremental build tests")
class Kapt4AndroidIncrementalIT : Kapt3AndroidIncrementalIT() { class Kapt4AndroidIncrementalIT : Kapt3AndroidIncrementalIT() {
override val defaultBuildOptions = super.defaultBuildOptions.copyEnsuringK2() override val defaultBuildOptions = super.defaultBuildOptions.copyEnsuringK2()
override fun TestProject.customizeProject() { @Disabled("KT-63102 Incremental compilation doesn't work in 2.0")
forceKapt4() override fun testAndroidDaggerIC(gradleVersion: GradleVersion, agpVersion: String, jdkVersion: JdkVersions.ProvidedJdk) {
}
@Disabled("KT-63102 Incremental compilation doesn't work in 2.0")
override fun testInterProjectIC(gradleVersion: GradleVersion, agpVersion: String, jdkVersion: JdkVersions.ProvidedJdk) {
} }
} }
@@ -22,7 +27,11 @@ class Kapt4AndroidIncrementalIT : Kapt3AndroidIncrementalIT() {
class Kapt4AndroidIncrementalWithoutPreciseBackupIT : Kapt3AndroidIncrementalWithoutPreciseBackupIT() { class Kapt4AndroidIncrementalWithoutPreciseBackupIT : Kapt3AndroidIncrementalWithoutPreciseBackupIT() {
override val defaultBuildOptions = super.defaultBuildOptions.copyEnsuringK2() override val defaultBuildOptions = super.defaultBuildOptions.copyEnsuringK2()
override fun TestProject.customizeProject() { @Disabled("KT-63102 Incremental compilation doesn't work in 2.0")
forceKapt4() override fun testAndroidDaggerIC(gradleVersion: GradleVersion, agpVersion: String, jdkVersion: JdkVersions.ProvidedJdk) {
}
@Disabled("KT-63102 Incremental compilation doesn't work in 2.0")
override fun testInterProjectIC(gradleVersion: GradleVersion, agpVersion: String, jdkVersion: JdkVersions.ProvidedJdk) {
} }
} }
@@ -14,7 +14,7 @@ import kotlin.io.path.deleteRecursively
import kotlin.io.path.writeText import kotlin.io.path.writeText
@DisplayName("JVM API validation") @DisplayName("JVM API validation")
class KotlinJvmApiTest : KGPBaseTest() { open class KotlinJvmApiTest : KGPBaseTest() {
@DisplayName("Kotlin compilation can be set up using APIs") @DisplayName("Kotlin compilation can be set up using APIs")
@JvmGradlePluginTests @JvmGradlePluginTests
@GradleTest @GradleTest
@@ -51,11 +51,7 @@ class KotlinJvmApiTest : KGPBaseTest() {
""".trimIndent() """.trimIndent()
} }
val expectedOutput = projectPath.resolve("build/fooOutput/Foo.class") build("foo")
build("foo") {
assertFileExists(expectedOutput)
}
} }
} }
@@ -147,7 +143,6 @@ class KotlinJvmApiTest : KGPBaseTest() {
""".trimIndent() """.trimIndent()
} }
val expectedOutputClass = projectPath.resolve("build/fooOutput/Foo.class")
val expectedOutputStubs = listOf( val expectedOutputStubs = listOf(
projectPath.resolve("build/fooOutputStubs/Foo.java"), projectPath.resolve("build/fooOutputStubs/Foo.java"),
projectPath.resolve("build/fooOutputStubs/Foo.kapt_metadata"), projectPath.resolve("build/fooOutputStubs/Foo.kapt_metadata"),
@@ -155,7 +150,6 @@ class KotlinJvmApiTest : KGPBaseTest() {
) )
build("foo") { build("foo") {
assertFileExists(expectedOutputClass)
expectedOutputStubs.forEach { assertFileExists(it) } expectedOutputStubs.forEach { assertFileExists(it) }
} }
} }
@@ -25,7 +25,6 @@ import org.gradle.tooling.provider.model.ToolingModelBuilderRegistry
import org.jetbrains.kotlin.gradle.internal.Kapt3GradleSubplugin.Companion.isInfoAsWarnings 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.isKaptKeepKdocCommentsInStubs
import org.jetbrains.kotlin.gradle.internal.Kapt3GradleSubplugin.Companion.isKaptVerbose 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.model.builder.KaptModelBuilder
import org.jetbrains.kotlin.gradle.plugin.* import org.jetbrains.kotlin.gradle.plugin.*
import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinJvmAndroidCompilation import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinJvmAndroidCompilation
@@ -123,10 +122,6 @@ class Kapt3GradleSubplugin @Inject internal constructor(private val registry: To
return getBooleanOptionValue(BooleanOption.KAPT_KEEP_KDOC_COMMENTS_IN_STUBS) 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.classLoadersCacheSize(): Int = findPropertySafe(CLASSLOADERS_CACHE_SIZE)?.toString()?.toInt() ?: 0
fun Project.disableClassloaderCacheForProcessors(): Set<String> { fun Project.disableClassloaderCacheForProcessors(): Set<String> {
@@ -218,7 +213,6 @@ class Kapt3GradleSubplugin @Inject internal constructor(private val registry: To
KAPT_INFO_AS_WARNINGS("kapt.info.as.warnings", false), KAPT_INFO_AS_WARNINGS("kapt.info.as.warnings", false),
KAPT_INCLUDE_COMPILE_CLASSPATH("kapt.include.compile.classpath", true), KAPT_INCLUDE_COMPILE_CLASSPATH("kapt.include.compile.classpath", true),
KAPT_KEEP_KDOC_COMMENTS_IN_STUBS("kapt.keep.kdoc.comments.in.stubs", true), KAPT_KEEP_KDOC_COMMENTS_IN_STUBS("kapt.keep.kdoc.comments.in.stubs", true),
KAPT_USE_K2("kapt.use.k2", false),
} }
} }
@@ -538,7 +532,6 @@ internal fun buildKaptSubpluginOptions(
pluginOptions += SubpluginOption("keepKdocCommentsInStubs", "${project.isKaptKeepKdocCommentsInStubs()}") pluginOptions += SubpluginOption("keepKdocCommentsInStubs", "${project.isKaptKeepKdocCommentsInStubs()}")
pluginOptions += SubpluginOption("showProcessorTimings", "${kaptExtension.showProcessorStats}") pluginOptions += SubpluginOption("showProcessorTimings", "${kaptExtension.showProcessorStats}")
pluginOptions += SubpluginOption("detectMemoryLeaks", kaptExtension.detectMemoryLeaks) pluginOptions += SubpluginOption("detectMemoryLeaks", kaptExtension.detectMemoryLeaks)
pluginOptions += SubpluginOption("useK2", "${project.isUseK2()}")
pluginOptions += SubpluginOption("infoAsWarnings", "${project.isInfoAsWarnings()}") pluginOptions += SubpluginOption("infoAsWarnings", "${project.isInfoAsWarnings()}")
pluginOptions += FilesSubpluginOption("stubs", kaptStubsDir) pluginOptions += FilesSubpluginOption("stubs", kaptStubsDir)
@@ -29,6 +29,7 @@ import org.gradle.workers.WorkerExecutor
import org.jetbrains.kotlin.cli.common.arguments.K2JVMCompilerArguments import org.jetbrains.kotlin.cli.common.arguments.K2JVMCompilerArguments
import org.jetbrains.kotlin.gradle.dsl.KotlinJvmCompilerOptionsDefault import org.jetbrains.kotlin.gradle.dsl.KotlinJvmCompilerOptionsDefault
import org.jetbrains.kotlin.gradle.dsl.KotlinJvmCompilerOptionsHelper 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
import org.jetbrains.kotlin.gradle.plugin.KotlinCompilerArgumentsProducer.CreateCompilerArgumentsContext.Companion.create import org.jetbrains.kotlin.gradle.plugin.KotlinCompilerArgumentsProducer.CreateCompilerArgumentsContext.Companion.create
import org.jetbrains.kotlin.gradle.report.BuildReportMode import org.jetbrains.kotlin.gradle.report.BuildReportMode
@@ -66,9 +67,6 @@ abstract class KaptGenerateStubsTask @Inject constructor(
@get:Input @get:Input
abstract val verbose: Property<Boolean> abstract val verbose: Property<Boolean>
@get:Input
abstract val useK2Kapt: Property<Boolean>
/** /**
* Changes in this additional sources will trigger stubs regeneration, * Changes in this additional sources will trigger stubs regeneration,
* but the sources themselves will not be used to find kapt annotations and generate stubs. * but the sources themselves will not be used to find kapt annotations and generate stubs.
@@ -129,10 +127,6 @@ abstract class KaptGenerateStubsTask @Inject constructor(
args.verbose = verbose.get() args.verbose = verbose.get()
args.destinationAsFile = destinationDirectory.get().asFile args.destinationAsFile = destinationDirectory.get().asFile
if (useK2Kapt.get()) {
args.freeArgs += "-Xuse-kapt4"
}
} }
pluginClasspath { args -> pluginClasspath { args ->
@@ -154,5 +148,5 @@ abstract class KaptGenerateStubsTask @Inject constructor(
} }
override fun isIncrementalCompilationEnabled(): Boolean = override fun isIncrementalCompilationEnabled(): Boolean =
super.isIncrementalCompilationEnabled() && !useK2Kapt.get() && ("-Xuse-kapt4" !in compilerOptions.freeCompilerArgs.get()) super.isIncrementalCompilationEnabled() && compilerOptions.languageVersion.getOrElse(KotlinVersion.DEFAULT) < KotlinVersion.KOTLIN_2_0
} }
@@ -16,7 +16,6 @@ import org.jetbrains.kotlin.gradle.dsl.KotlinTopLevelExtension
import org.jetbrains.kotlin.gradle.internal.* 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.KAPT_SUBPLUGIN_ID
import org.jetbrains.kotlin.gradle.internal.Kapt3GradleSubplugin.Companion.isIncludeCompileClasspath 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.KaptExtension
import org.jetbrains.kotlin.gradle.plugin.KotlinCompilation import org.jetbrains.kotlin.gradle.plugin.KotlinCompilation
import org.jetbrains.kotlin.gradle.plugin.KotlinCompilationInfo import org.jetbrains.kotlin.gradle.plugin.KotlinCompilationInfo
@@ -50,7 +49,6 @@ internal class KaptGenerateStubsConfig : BaseKotlinCompileConfig<KaptGenerateStu
configureTask { task -> configureTask { task ->
task.verbose.set(KaptTask.queryKaptVerboseProperty(project)) task.verbose.set(KaptTask.queryKaptVerboseProperty(project))
task.pluginOptions.add(buildOptions(kaptExtension, task)) task.pluginOptions.add(buildOptions(kaptExtension, task))
task.useK2Kapt.value(project.isUseK2()).finalizeValueOnRead()
if (!isIncludeCompileClasspath(kaptExtension)) { if (!isIncludeCompileClasspath(kaptExtension)) {
task.onlyIf { task.onlyIf {
@@ -11,7 +11,7 @@
<properties> <properties>
<junit.version>4.13.1</junit.version> <junit.version>4.13.1</junit.version>
<dagger.version>2.9</dagger.version> <dagger.version>2.50</dagger.version>
<main.class>coffee.CoffeeApp</main.class> <main.class>coffee.CoffeeApp</main.class>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties> </properties>
@@ -11,7 +11,7 @@
<properties> <properties>
<junit.version>4.13.1</junit.version> <junit.version>4.13.1</junit.version>
<dagger.version>2.9</dagger.version> <dagger.version>2.50</dagger.version>
<main.class>coffee.CoffeeApp</main.class> <main.class>coffee.CoffeeApp</main.class>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties> </properties>
@@ -11,7 +11,7 @@
<properties> <properties>
<junit.version>4.13.1</junit.version> <junit.version>4.13.1</junit.version>
<dagger.version>2.9</dagger.version> <dagger.version>2.50</dagger.version>
<main.class>coffee.CoffeeApp</main.class> <main.class>coffee.CoffeeApp</main.class>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties> </properties>
+1 -2
View File
@@ -107,7 +107,6 @@ private fun transformKaptToolArgs(args: List<String>, messageCollector: MessageC
} }
KaptCliOption.APT_MODE_OPTION -> aptModePassed = true KaptCliOption.APT_MODE_OPTION -> aptModePassed = true
KaptCliOption.VERBOSE_MODE_OPTION -> kaptVerboseModePassed = true KaptCliOption.VERBOSE_MODE_OPTION -> kaptVerboseModePassed = true
KaptCliOption.USE_K2 -> transformed.add("-Xuse-kapt4")
else -> {} else -> {}
} }
@@ -115,7 +114,7 @@ private fun transformKaptToolArgs(args: List<String>, messageCollector: MessageC
} }
if (!aptModePassed) { if (!aptModePassed) {
val isK2 = "-Xuse-kapt4" in transformed && ("-Xuse-k2" in transformed || val isK2 = ("-Xuse-k2" in transformed ||
transformed.any { it.startsWith("-language-version=2") } || transformed.any { it.startsWith("-language-version=2") } ||
transformed.lastIndexOf("-language-version").takeIf { it >= 0 } transformed.lastIndexOf("-language-version").takeIf { it >= 0 }
?.let { transformed.getOrNull(it + 1)?.startsWith('2') } == true) ?.let { transformed.getOrNull(it + 1)?.startsWith('2') } == true)
@@ -214,13 +214,6 @@ enum class KaptCliOption(
"Keep KDoc comments in stubs" "Keep KDoc comments in stubs"
), ),
USE_K2(
"useK2",
"true | false",
"Use K2",
cliToolOption = CliToolOption("-Kapt-use-k2", FLAG)
),
DETECT_MEMORY_LEAKS_OPTION("detectMemoryLeaks", "true | false", "Detect memory leaks in annotation processors"), DETECT_MEMORY_LEAKS_OPTION("detectMemoryLeaks", "true | false", "Detect memory leaks in annotation processors"),
INCLUDE_COMPILE_CLASSPATH( INCLUDE_COMPILE_CLASSPATH(
"includeCompileClasspath", "includeCompileClasspath",
@@ -1,5 +1,4 @@
-language-version 2.0 -language-version 2.0
-Xuse-kapt4
-Kapt-mode=stubsAndApt -Kapt-mode=stubsAndApt
-Kapt-stubs=output/stubs -Kapt-stubs=output/stubs
-Kapt-classes=output/classes -Kapt-classes=output/classes
@@ -1,7 +1,6 @@
# kapt # kapt
-language-version 2.0 -language-version 2.0
-Xsuppress-version-warnings -Xsuppress-version-warnings
-Xuse-kapt4
-Kapt-mode=compile -Kapt-mode=compile
../simple/Test.kt ../simple/Test.kt
@@ -12,7 +12,6 @@ ap/Processor.kt
# kapt # kapt
-language-version 2.0 -language-version 2.0
-Xuse-kapt4
-Kapt-stubs=output/stubs -Kapt-stubs=output/stubs
-Kapt-classes=output/classes -Kapt-classes=output/classes
-Kapt-sources=output/sources -Kapt-sources=output/sources
@@ -17,7 +17,6 @@ ap/Processor.kt
# kapt # kapt
-language-version 2.0 -language-version 2.0
-Xuse-kapt4
-Kapt-mode=stubsAndApt -Kapt-mode=stubsAndApt
-Kapt-stubs=output/stubs -Kapt-stubs=output/stubs
-Kapt-classes=output/classes -Kapt-classes=output/classes
@@ -1,7 +1,6 @@
# kapt # kapt
-language-version 2.0 -language-version 2.0
-Xsuppress-version-warnings -Xsuppress-version-warnings
-Kapt-use-k2=true
-Kapt-mode=compile -Kapt-mode=compile
../simple/Test.kt ../simple/Test.kt
@@ -17,7 +17,6 @@ output/ap/META-INF/services/javax.annotation.processing.Processor
# kapt # kapt
-language-version 2.0 -language-version 2.0
-Xuse-kapt4
-Kapt-mode=stubsAndApt -Kapt-mode=stubsAndApt
-Kapt-stubs=output/stubs -Kapt-stubs=output/stubs
-Kapt-classes=output/classes -Kapt-classes=output/classes
@@ -20,7 +20,6 @@ ap/Processor.kt
# kapt # kapt
-language-version 2.0 -language-version 2.0
-Xuse-kapt4
-Kapt-mode=stubsAndApt -Kapt-mode=stubsAndApt
-Kapt-stubs=output/stubs -Kapt-stubs=output/stubs
-Kapt-classes=output/classes -Kapt-classes=output/classes
@@ -34,7 +33,6 @@ Test.kt
# kotlinc # kotlinc
-language-version 2.0 -language-version 2.0
-Xuse-kapt4
-d output/classes -d output/classes
-cp output/classes:output/ap:%KOTLIN_STDLIB% -cp output/classes:output/ap:%KOTLIN_STDLIB%
Test.kt Test.kt
@@ -21,7 +21,6 @@ output/ap/META-INF/services/javax.annotation.processing.Processor
# kapt # kapt
-language-version 2.0 -language-version 2.0
-Xuse-kapt4
-Kapt-mode=stubsAndApt -Kapt-mode=stubsAndApt
-Kapt-stubs=output/stubs -Kapt-stubs=output/stubs
-Kapt-classes=output/classes -Kapt-classes=output/classes
@@ -13,7 +13,6 @@ ap/processors.kt
# kapt # kapt
-language-version 2.0 -language-version 2.0
-Xuse-kapt4
-Kapt-mode=stubsAndApt -Kapt-mode=stubsAndApt
-Kapt-stubs=output/stubs -Kapt-stubs=output/stubs
-Kapt-classes=output/classes -Kapt-classes=output/classes
@@ -21,7 +21,6 @@ ap/Processor.kt
# kapt # kapt
-language-version 2.0 -language-version 2.0
-Xuse-kapt4
-Kapt-stubs=output/stubs -Kapt-stubs=output/stubs
-Kapt-classes=output/classes -Kapt-classes=output/classes
-Kapt-sources=output/sources -Kapt-sources=output/sources
@@ -33,7 +32,6 @@ Test.kt
# kapt # kapt
-language-version 2.0 -language-version 2.0
-Xuse-kapt4
-Kapt-stubs=output/stubs -Kapt-stubs=output/stubs
-Kapt-classes=output/classes -Kapt-classes=output/classes
-Kapt-sources=output/sources -Kapt-sources=output/sources
@@ -17,7 +17,6 @@ output/ap/META-INF/services/javax.annotation.processing.Processor
# kapt # kapt
-language-version 2.0 -language-version 2.0
-Xuse-kapt4
-Kapt-mode=stubsAndApt -Kapt-mode=stubsAndApt
-Kapt-stubs=output/stubs -Kapt-stubs=output/stubs
-Kapt-classes=output/classes -Kapt-classes=output/classes
@@ -21,7 +21,6 @@ ap/Processor.kt
# kapt # kapt
-language-version 2.0 -language-version 2.0
-Xuse-kapt4
-Kapt-stubs=output/stubs -Kapt-stubs=output/stubs
-Kapt-classes=output/classes -Kapt-classes=output/classes
-Kapt-sources=output/sources -Kapt-sources=output/sources
@@ -1,3 +1,4 @@
-language-version 1.9
-cp %KOTLIN_STDLIB% -cp %KOTLIN_STDLIB%
-d output/ap -d output/ap
ap/Processor.kt ap/Processor.kt
@@ -1,3 +1,4 @@
-language-version 1.9
-Kapt-stubs=output/stubs -Kapt-stubs=output/stubs
-Kapt-classes=output/classes -Kapt-classes=output/classes
-Kapt-sources=output/sources -Kapt-sources=output/sources
@@ -14,11 +14,13 @@ output/javaClasses
output/sources output/sources
# kotlinc # kotlinc
-language-version 1.9
-cp %KOTLIN_STDLIB% -cp %KOTLIN_STDLIB%
-d output/ap -d output/ap
ap/Processor.kt ap/Processor.kt
# kapt # kapt
-language-version 1.9
-Kapt-stubs=output/stubs -Kapt-stubs=output/stubs
-Kapt-classes=output/classes -Kapt-classes=output/classes
-Kapt-sources=output/sources -Kapt-sources=output/sources
@@ -41,7 +43,6 @@ test.Test
# after # after
Return code: 1 Return code: 1
warning: kapt currently doesn't support language version 2.0+. Falling back to 1.9.
error: error: NonExistentClass type occurred error: error: NonExistentClass type occurred
Test.kt:4:8: error: unresolved reference: generated Test.kt:4:8: error: unresolved reference: generated
import generated.Property import generated.Property
@@ -6,11 +6,13 @@ output/javaClasses
output/sources output/sources
# kotlinc # kotlinc
-language-version 1.9
-cp %KOTLIN_STDLIB% -cp %KOTLIN_STDLIB%
-d output/ap -d output/ap
ap/Processor.kt ap/Processor.kt
# kapt # kapt
-language-version 1.9
-Kapt-stubs=output/stubs -Kapt-stubs=output/stubs
-Kapt-classes=output/classes -Kapt-classes=output/classes
-Kapt-sources=output/sources -Kapt-sources=output/sources
@@ -10,11 +10,13 @@ output/javaClasses
output/sources output/sources
# kotlinc # kotlinc
-language-version 1.9
-cp %KOTLIN_STDLIB% -cp %KOTLIN_STDLIB%
-d output/ap -d output/ap
ap/Processor.kt ap/Processor.kt
# kapt # kapt
-language-version 1.9
-Kapt-stubs=output/stubs -Kapt-stubs=output/stubs
-Kapt-classes=output/classes -Kapt-classes=output/classes
-Kapt-sources=output/sources -Kapt-sources=output/sources
@@ -1,19 +0,0 @@
package test
import apt.Anno
import generated.Test as TestGenerated
@Anno
class Test {
@field:Anno
val property: String = ""
@Anno
fun function() {
}
}
fun main() {
println("Generated class: " + TestGenerated::class.java.name)
}
@@ -1,34 +0,0 @@
package apt
import javax.annotation.processing.*
import javax.lang.model.SourceVersion
import javax.lang.model.element.TypeElement
import javax.tools.Diagnostic.Kind.*
import javax.tools.StandardLocation
annotation class Anno
class SampleApt : AbstractProcessor() {
override fun process(annotations: Set<TypeElement>, roundEnv: RoundEnvironment): Boolean {
val writeKotlinFiles = processingEnv.options["kapt.test.writeKotlinFiles"] == "true"
for (element in roundEnv.getElementsAnnotatedWith(Anno::class.java)) {
val generatedSimpleName = element.simpleName.toString().capitalize()
val file = when (writeKotlinFiles) {
true -> processingEnv.filer.createResource(StandardLocation.SOURCE_OUTPUT, "generated", "$generatedSimpleName.kt")
false -> processingEnv.filer.createSourceFile("generated.$generatedSimpleName")
}
file.openWriter().use {
it.write("package generated;\npublic class $generatedSimpleName {}")
}
}
return true
}
override fun getSupportedOptions() = setOf("kapt.test.writeKotlinFiles")
override fun getSupportedSourceVersion() = SourceVersion.RELEASE_8
override fun getSupportedAnnotationTypes() = setOf("apt.Anno")
}
@@ -1,69 +0,0 @@
# mkdir
output/stubs
output/classes
output/javaClasses
output/sources
output/stubsAlt
output/classesAlt
output/javaClassesAlt
output/sourcesAlt
# kotlinc
-language-version 2.0
-cp %KOTLIN_STDLIB%
-d output/ap.jar
ap/Processor.kt
# copy
ap/META-INF/services/javax.annotation.processing.Processor
output/ap/META-INF/services/javax.annotation.processing.Processor
# kapt
-Xuse-k2
-Kapt-stubs=output/stubs
-Kapt-classes=output/classes
-Kapt-sources=output/sources
-Kapt-classpath=output/ap
-d output/classes
-cp output/ap.jar:%KOTLIN_STDLIB%
Test.kt
# javac
-cp output/ap.jar
-d output/javaClasses
-proc:none
output/sources/generated/Function.java
output/sources/generated/Property.java
output/sources/generated/Test.java
# kapt
-language-version 2.0
-Kapt-stubs=output/stubsAlt
-Kapt-classes=output/classesAlt
-Kapt-sources=output/sourcesAlt
-Kapt-classpath=output/ap
-d output/classesAlt
-cp output/ap.jar:%KOTLIN_STDLIB%
Test.kt
# output
warning: kapt currently doesn't support language version 2.0+. Falling back to 1.9.
# java
-cp output/classes:output/javaClasses:output/ap.jar:%KOTLIN_STDLIB%
test.TestKt
# javac
-cp output/ap.jar
-d output/javaClassesAlt
-proc:none
output/sourcesAlt/generated/Function.java
output/sourcesAlt/generated/Property.java
output/sourcesAlt/generated/Test.java
# java
-cp output/classes:output/javaClassesAlt:output/ap.jar:%KOTLIN_STDLIB%
test.TestKt
# after
Generated class: generated.Test
@@ -6,6 +6,7 @@ output/sources
output/kotlin-sources output/kotlin-sources
# kotlinc # kotlinc
-language-version 1.9
-cp %KOTLIN_STDLIB% -cp %KOTLIN_STDLIB%
-d output/ap -d output/ap
ap/Processor.kt ap/Processor.kt
@@ -15,6 +16,7 @@ ap/META-INF/services/javax.annotation.processing.Processor
output/ap/META-INF/services/javax.annotation.processing.Processor output/ap/META-INF/services/javax.annotation.processing.Processor
# kapt # kapt
-language-version 1.9
-Kapt-stubs=output/stubs -Kapt-stubs=output/stubs
-Kapt-classes=output/classes -Kapt-classes=output/classes
-Kapt-sources=output/sources -Kapt-sources=output/sources
@@ -10,6 +10,7 @@ output/sources
output/kotlin-sources output/kotlin-sources
# kotlinc # kotlinc
-language-version 1.9
-cp %KOTLIN_STDLIB% -cp %KOTLIN_STDLIB%
-d output/ap -d output/ap
ap/Processor.kt ap/Processor.kt
@@ -19,6 +20,7 @@ ap/Processor.kt
output/ap/META-INF/services/javax.annotation.processing.Processor output/ap/META-INF/services/javax.annotation.processing.Processor
# kapt # kapt
-language-version 1.9
-Kapt-stubs=output/stubs -Kapt-stubs=output/stubs
-Kapt-classes=output/classes -Kapt-classes=output/classes
-Kapt-sources=output/sources -Kapt-sources=output/sources
@@ -13,11 +13,13 @@ output/classes
output/sources output/sources
# kotlinc # kotlinc
-language-version 1.9
-cp %KOTLIN_STDLIB% -cp %KOTLIN_STDLIB%
-d output/ap -d output/ap
ap/Processor.kt ap/Processor.kt
# kapt # kapt
-language-version 1.9
-Kapt-stubs=output/stubs -Kapt-stubs=output/stubs
-Kapt-classes=output/classes -Kapt-classes=output/classes
-Kapt-sources=output/sources -Kapt-sources=output/sources
@@ -10,6 +10,7 @@ output/javaClasses
output/sources output/sources
# kotlinc # kotlinc
-language-version 1.9
-cp %KOTLIN_STDLIB% -cp %KOTLIN_STDLIB%
-d output/ap -d output/ap
ap/Processor.kt ap/Processor.kt
@@ -19,6 +20,7 @@ ap/Processor.kt
output/ap/META-INF/services/javax.annotation.processing.Processor output/ap/META-INF/services/javax.annotation.processing.Processor
# kapt # kapt
-language-version 1.9
-Kapt-stubs=output/stubs -Kapt-stubs=output/stubs
-Kapt-classes=output/classes -Kapt-classes=output/classes
-Kapt-sources=output/sources -Kapt-sources=output/sources
@@ -6,11 +6,13 @@ output/javaClasses
output/sources output/sources
# kotlinc # kotlinc
-language-version 1.9
-cp %KOTLIN_STDLIB% -cp %KOTLIN_STDLIB%
-d output/ap -d output/ap
ap/processors.kt ap/processors.kt
# kapt # kapt
-language-version 1.9
-Kapt-stubs=output/stubs -Kapt-stubs=output/stubs
-Kapt-classes=output/classes -Kapt-classes=output/classes
-Kapt-sources=output/sources -Kapt-sources=output/sources
@@ -14,11 +14,13 @@ output/javaClasses
output/sources output/sources
# kotlinc # kotlinc
-language-version 1.9
-cp %KOTLIN_STDLIB% -cp %KOTLIN_STDLIB%
-d output/ap -d output/ap
ap/Processor.kt ap/Processor.kt
# kapt # kapt
-language-version 1.9
-Kapt-stubs=output/stubs -Kapt-stubs=output/stubs
-Kapt-classes=output/classes -Kapt-classes=output/classes
-Kapt-sources=output/sources -Kapt-sources=output/sources
@@ -29,6 +31,7 @@ ap/Processor.kt
Test.kt Test.kt
# kapt # kapt
-language-version 1.9
-Kapt-stubs=output/stubs -Kapt-stubs=output/stubs
-Kapt-classes=output/classes -Kapt-classes=output/classes
-Kapt-sources=output/sources -Kapt-sources=output/sources
@@ -40,6 +43,7 @@ Test.kt
Test.kt Test.kt
# kotlinc # kotlinc
-language-version 1.9
-d output/classes -d output/classes
-cp output/ap:%KOTLIN_STDLIB% -cp output/ap:%KOTLIN_STDLIB%
output/sources output/sources
@@ -6,6 +6,7 @@ output/javaClasses
output/sources output/sources
# kotlinc # kotlinc
-language-version 1.9
-cp %KOTLIN_STDLIB% -cp %KOTLIN_STDLIB%
-d output/ap -d output/ap
ap/Processor.kt ap/Processor.kt
@@ -15,6 +16,7 @@ ap/META-INF/services/javax.annotation.processing.Processor
output/ap/META-INF/services/javax.annotation.processing.Processor output/ap/META-INF/services/javax.annotation.processing.Processor
# kapt # kapt
-language-version 1.9
-Kapt-stubs=output/stubs -Kapt-stubs=output/stubs
-Kapt-classes=output/classes -Kapt-classes=output/classes
-Kapt-sources=output/sources -Kapt-sources=output/sources
@@ -14,11 +14,13 @@ output/javaClasses
output/sources output/sources
# kotlinc # kotlinc
-language-version 1.9
-cp %KOTLIN_STDLIB% -cp %KOTLIN_STDLIB%
-d output/ap -d output/ap
ap/Processor.kt ap/Processor.kt
# kapt # kapt
-language-version 1.9
-Kapt-stubs=output/stubs -Kapt-stubs=output/stubs
-Kapt-classes=output/classes -Kapt-classes=output/classes
-Kapt-sources=output/sources -Kapt-sources=output/sources
@@ -48,12 +48,6 @@ public class KaptToolIntegrationTestGenerated extends AbstractKaptToolIntegratio
runTest("plugins/kapt3/kapt3-cli/testData/integration/defaultPackage/"); runTest("plugins/kapt3/kapt3-cli/testData/integration/defaultPackage/");
} }
@Test
@TestMetadata("fallback")
public void testFallback() throws Exception {
runTest("plugins/kapt3/kapt3-cli/testData/integration/fallback/");
}
@Test @Test
@TestMetadata("kotlinFileGeneration") @TestMetadata("kotlinFileGeneration")
public void testKotlinFileGeneration() throws Exception { public void testKotlinFileGeneration() throws Exception {
@@ -123,7 +123,6 @@ class Kapt3CommandLineProcessor : CommandLineProcessor {
STRICT_MODE_OPTION -> setFlag(KaptFlag.STRICT, value) STRICT_MODE_OPTION -> setFlag(KaptFlag.STRICT, value)
STRIP_METADATA_OPTION -> setFlag(KaptFlag.STRIP_METADATA, value) STRIP_METADATA_OPTION -> setFlag(KaptFlag.STRIP_METADATA, value)
KEEP_KDOC_COMMENTS_IN_STUBS -> setFlag(KaptFlag.KEEP_KDOC_COMMENTS_IN_STUBS, value) KEEP_KDOC_COMMENTS_IN_STUBS -> setFlag(KaptFlag.KEEP_KDOC_COMMENTS_IN_STUBS, value)
USE_K2 -> {}
SHOW_PROCESSOR_STATS -> setFlag(KaptFlag.SHOW_PROCESSOR_STATS, value) SHOW_PROCESSOR_STATS -> setFlag(KaptFlag.SHOW_PROCESSOR_STATS, value)
DUMP_PROCESSOR_STATS -> processorsStatsReportFile = File(value) DUMP_PROCESSOR_STATS -> processorsStatsReportFile = File(value)
@@ -5,6 +5,7 @@
package org.jetbrains.kotlin.kapt4 package org.jetbrains.kotlin.kapt4
import com.intellij.openapi.extensions.ExtensionPoint
import com.intellij.openapi.util.Disposer import com.intellij.openapi.util.Disposer
import com.intellij.psi.PsiFile import com.intellij.psi.PsiFile
import com.intellij.psi.PsiJavaFile import com.intellij.psi.PsiJavaFile
@@ -12,6 +13,7 @@ import org.jetbrains.kotlin.analysis.api.KtAnalysisApiInternals
import org.jetbrains.kotlin.analysis.api.lifetime.KtLifetimeTokenProvider import org.jetbrains.kotlin.analysis.api.lifetime.KtLifetimeTokenProvider
import org.jetbrains.kotlin.analysis.api.standalone.KtAlwaysAccessibleLifetimeTokenProvider import org.jetbrains.kotlin.analysis.api.standalone.KtAlwaysAccessibleLifetimeTokenProvider
import org.jetbrains.kotlin.analysis.api.standalone.buildStandaloneAnalysisAPISession import org.jetbrains.kotlin.analysis.api.standalone.buildStandaloneAnalysisAPISession
import org.jetbrains.kotlin.analysis.project.structure.KtCompilerPluginsProvider
import org.jetbrains.kotlin.analysis.project.structure.KtSourceModule import org.jetbrains.kotlin.analysis.project.structure.KtSourceModule
import org.jetbrains.kotlin.asJava.classes.KtLightClassForFacade import org.jetbrains.kotlin.asJava.classes.KtLightClassForFacade
import org.jetbrains.kotlin.cli.common.CLIConfigurationKeys import org.jetbrains.kotlin.cli.common.CLIConfigurationKeys
@@ -22,6 +24,7 @@ import org.jetbrains.kotlin.cli.jvm.config.JvmClasspathRoot
import org.jetbrains.kotlin.compiler.plugin.CompilerPluginRegistrar import org.jetbrains.kotlin.compiler.plugin.CompilerPluginRegistrar
import org.jetbrains.kotlin.config.* import org.jetbrains.kotlin.config.*
import org.jetbrains.kotlin.config.CommonConfigurationKeys.USE_FIR import org.jetbrains.kotlin.config.CommonConfigurationKeys.USE_FIR
import org.jetbrains.kotlin.extensions.ProjectExtensionDescriptor
import org.jetbrains.kotlin.fir.extensions.FirAnalysisHandlerExtension import org.jetbrains.kotlin.fir.extensions.FirAnalysisHandlerExtension
import org.jetbrains.kotlin.kapt3.EfficientProcessorLoader import org.jetbrains.kotlin.kapt3.EfficientProcessorLoader
import org.jetbrains.kotlin.kapt3.KAPT_OPTIONS import org.jetbrains.kotlin.kapt3.KAPT_OPTIONS
@@ -75,10 +78,23 @@ private class Kapt4AnalysisHandlerExtension : FirAnalysisHandlerExtension() {
buildKtModuleProviderByCompilerConfiguration(updatedConfiguration) buildKtModuleProviderByCompilerConfiguration(updatedConfiguration)
registerProjectService(KtLifetimeTokenProvider::class.java, KtAlwaysAccessibleLifetimeTokenProvider()) registerProjectService(KtLifetimeTokenProvider::class.java, KtAlwaysAccessibleLifetimeTokenProvider())
registerProjectService(KtCompilerPluginsProvider::class.java, StandaloneCompilerPluginsProvider())
} }
val (module, files) = standaloneAnalysisAPISession.modulesWithFiles.entries.single() val (module, files) = standaloneAnalysisAPISession.modulesWithFiles.entries.single()
val extensionStorage = CompilerPluginRegistrar.ExtensionStorage()
for (registrar in configuration.getList(CompilerPluginRegistrar.COMPILER_PLUGIN_REGISTRARS)) {
with(registrar) { extensionStorage.registerExtensions(configuration) }
}
for ((extensionPoint, extensions) in extensionStorage.registeredExtensions) {
for (extension in extensions) {
@Suppress("TestOnlyProblems")
module.project.extensionArea.getExtensionPointIfRegistered<Any>(extensionPoint.extensionPointName.name)
?.registerExtension(extension, module.project)
}
}
optionsBuilder.apply { optionsBuilder.apply {
projectBaseDir = projectBaseDir ?: module.project.basePath?.let(::File) projectBaseDir = projectBaseDir ?: module.project.basePath?.let(::File)
val contentRoots = configuration[CLIConfigurationKeys.CONTENT_ROOTS] ?: emptyList() val contentRoots = configuration[CLIConfigurationKeys.CONTENT_ROOTS] ?: emptyList()
@@ -0,0 +1,27 @@
/*
* Copyright 2010-2023 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.kapt4
import org.jetbrains.kotlin.analysis.project.structure.KtCompilerPluginsProvider
import org.jetbrains.kotlin.analysis.project.structure.KtSourceModule
import org.jetbrains.kotlin.extensions.ProjectExtensionDescriptor
import org.jetbrains.kotlin.extensions.internal.InternalNonStableExtensionPoints
import org.jetbrains.kotlin.resolve.extensions.AssignResolutionAltererExtension
internal class StandaloneCompilerPluginsProvider : KtCompilerPluginsProvider() {
override fun <T : Any> getRegisteredExtensions(module: KtSourceModule, extensionType: ProjectExtensionDescriptor<T>): List<T> {
return extensionType.getInstances(module.project)
}
@OptIn(InternalNonStableExtensionPoints::class)
override fun isPluginOfTypeRegistered(module: KtSourceModule, pluginType: CompilerPluginType): Boolean {
val extension = when (pluginType) {
CompilerPluginType.ASSIGNMENT -> AssignResolutionAltererExtension
else -> return false
}
return extension.getInstances(module.project).isNotEmpty()
}
}