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
+1 -2
View File
@@ -107,7 +107,6 @@ private fun transformKaptToolArgs(args: List<String>, messageCollector: MessageC
}
KaptCliOption.APT_MODE_OPTION -> aptModePassed = true
KaptCliOption.VERBOSE_MODE_OPTION -> kaptVerboseModePassed = true
KaptCliOption.USE_K2 -> transformed.add("-Xuse-kapt4")
else -> {}
}
@@ -115,7 +114,7 @@ private fun transformKaptToolArgs(args: List<String>, messageCollector: MessageC
}
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.lastIndexOf("-language-version").takeIf { it >= 0 }
?.let { transformed.getOrNull(it + 1)?.startsWith('2') } == true)
@@ -214,13 +214,6 @@ enum class KaptCliOption(
"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"),
INCLUDE_COMPILE_CLASSPATH(
"includeCompileClasspath",
@@ -1,5 +1,4 @@
-language-version 2.0
-Xuse-kapt4
-Kapt-mode=stubsAndApt
-Kapt-stubs=output/stubs
-Kapt-classes=output/classes
@@ -1,7 +1,6 @@
# kapt
-language-version 2.0
-Xsuppress-version-warnings
-Xuse-kapt4
-Kapt-mode=compile
../simple/Test.kt
@@ -12,7 +12,6 @@ ap/Processor.kt
# kapt
-language-version 2.0
-Xuse-kapt4
-Kapt-stubs=output/stubs
-Kapt-classes=output/classes
-Kapt-sources=output/sources
@@ -17,7 +17,6 @@ ap/Processor.kt
# kapt
-language-version 2.0
-Xuse-kapt4
-Kapt-mode=stubsAndApt
-Kapt-stubs=output/stubs
-Kapt-classes=output/classes
@@ -1,7 +1,6 @@
# kapt
-language-version 2.0
-Xsuppress-version-warnings
-Kapt-use-k2=true
-Kapt-mode=compile
../simple/Test.kt
@@ -17,7 +17,6 @@ output/ap/META-INF/services/javax.annotation.processing.Processor
# kapt
-language-version 2.0
-Xuse-kapt4
-Kapt-mode=stubsAndApt
-Kapt-stubs=output/stubs
-Kapt-classes=output/classes
@@ -20,7 +20,6 @@ ap/Processor.kt
# kapt
-language-version 2.0
-Xuse-kapt4
-Kapt-mode=stubsAndApt
-Kapt-stubs=output/stubs
-Kapt-classes=output/classes
@@ -34,7 +33,6 @@ Test.kt
# kotlinc
-language-version 2.0
-Xuse-kapt4
-d output/classes
-cp output/classes:output/ap:%KOTLIN_STDLIB%
Test.kt
@@ -21,7 +21,6 @@ output/ap/META-INF/services/javax.annotation.processing.Processor
# kapt
-language-version 2.0
-Xuse-kapt4
-Kapt-mode=stubsAndApt
-Kapt-stubs=output/stubs
-Kapt-classes=output/classes
@@ -13,7 +13,6 @@ ap/processors.kt
# kapt
-language-version 2.0
-Xuse-kapt4
-Kapt-mode=stubsAndApt
-Kapt-stubs=output/stubs
-Kapt-classes=output/classes
@@ -21,7 +21,6 @@ ap/Processor.kt
# kapt
-language-version 2.0
-Xuse-kapt4
-Kapt-stubs=output/stubs
-Kapt-classes=output/classes
-Kapt-sources=output/sources
@@ -33,7 +32,6 @@ Test.kt
# kapt
-language-version 2.0
-Xuse-kapt4
-Kapt-stubs=output/stubs
-Kapt-classes=output/classes
-Kapt-sources=output/sources
@@ -17,7 +17,6 @@ output/ap/META-INF/services/javax.annotation.processing.Processor
# kapt
-language-version 2.0
-Xuse-kapt4
-Kapt-mode=stubsAndApt
-Kapt-stubs=output/stubs
-Kapt-classes=output/classes
@@ -21,7 +21,6 @@ ap/Processor.kt
# kapt
-language-version 2.0
-Xuse-kapt4
-Kapt-stubs=output/stubs
-Kapt-classes=output/classes
-Kapt-sources=output/sources
@@ -1,3 +1,4 @@
-language-version 1.9
-cp %KOTLIN_STDLIB%
-d output/ap
ap/Processor.kt
@@ -1,3 +1,4 @@
-language-version 1.9
-Kapt-stubs=output/stubs
-Kapt-classes=output/classes
-Kapt-sources=output/sources
@@ -14,11 +14,13 @@ output/javaClasses
output/sources
# kotlinc
-language-version 1.9
-cp %KOTLIN_STDLIB%
-d output/ap
ap/Processor.kt
# kapt
-language-version 1.9
-Kapt-stubs=output/stubs
-Kapt-classes=output/classes
-Kapt-sources=output/sources
@@ -41,7 +43,6 @@ test.Test
# after
Return code: 1
warning: kapt currently doesn't support language version 2.0+. Falling back to 1.9.
error: error: NonExistentClass type occurred
Test.kt:4:8: error: unresolved reference: generated
import generated.Property
@@ -6,11 +6,13 @@ output/javaClasses
output/sources
# kotlinc
-language-version 1.9
-cp %KOTLIN_STDLIB%
-d output/ap
ap/Processor.kt
# kapt
-language-version 1.9
-Kapt-stubs=output/stubs
-Kapt-classes=output/classes
-Kapt-sources=output/sources
@@ -10,11 +10,13 @@ output/javaClasses
output/sources
# kotlinc
-language-version 1.9
-cp %KOTLIN_STDLIB%
-d output/ap
ap/Processor.kt
# kapt
-language-version 1.9
-Kapt-stubs=output/stubs
-Kapt-classes=output/classes
-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
# kotlinc
-language-version 1.9
-cp %KOTLIN_STDLIB%
-d output/ap
ap/Processor.kt
@@ -15,6 +16,7 @@ ap/META-INF/services/javax.annotation.processing.Processor
output/ap/META-INF/services/javax.annotation.processing.Processor
# kapt
-language-version 1.9
-Kapt-stubs=output/stubs
-Kapt-classes=output/classes
-Kapt-sources=output/sources
@@ -10,6 +10,7 @@ output/sources
output/kotlin-sources
# kotlinc
-language-version 1.9
-cp %KOTLIN_STDLIB%
-d output/ap
ap/Processor.kt
@@ -19,6 +20,7 @@ ap/Processor.kt
output/ap/META-INF/services/javax.annotation.processing.Processor
# kapt
-language-version 1.9
-Kapt-stubs=output/stubs
-Kapt-classes=output/classes
-Kapt-sources=output/sources
@@ -13,11 +13,13 @@ output/classes
output/sources
# kotlinc
-language-version 1.9
-cp %KOTLIN_STDLIB%
-d output/ap
ap/Processor.kt
# kapt
-language-version 1.9
-Kapt-stubs=output/stubs
-Kapt-classes=output/classes
-Kapt-sources=output/sources
@@ -10,6 +10,7 @@ output/javaClasses
output/sources
# kotlinc
-language-version 1.9
-cp %KOTLIN_STDLIB%
-d output/ap
ap/Processor.kt
@@ -19,6 +20,7 @@ ap/Processor.kt
output/ap/META-INF/services/javax.annotation.processing.Processor
# kapt
-language-version 1.9
-Kapt-stubs=output/stubs
-Kapt-classes=output/classes
-Kapt-sources=output/sources
@@ -6,11 +6,13 @@ output/javaClasses
output/sources
# kotlinc
-language-version 1.9
-cp %KOTLIN_STDLIB%
-d output/ap
ap/processors.kt
# kapt
-language-version 1.9
-Kapt-stubs=output/stubs
-Kapt-classes=output/classes
-Kapt-sources=output/sources
@@ -14,11 +14,13 @@ output/javaClasses
output/sources
# kotlinc
-language-version 1.9
-cp %KOTLIN_STDLIB%
-d output/ap
ap/Processor.kt
# kapt
-language-version 1.9
-Kapt-stubs=output/stubs
-Kapt-classes=output/classes
-Kapt-sources=output/sources
@@ -29,6 +31,7 @@ ap/Processor.kt
Test.kt
# kapt
-language-version 1.9
-Kapt-stubs=output/stubs
-Kapt-classes=output/classes
-Kapt-sources=output/sources
@@ -40,6 +43,7 @@ Test.kt
Test.kt
# kotlinc
-language-version 1.9
-d output/classes
-cp output/ap:%KOTLIN_STDLIB%
output/sources
@@ -6,6 +6,7 @@ output/javaClasses
output/sources
# kotlinc
-language-version 1.9
-cp %KOTLIN_STDLIB%
-d output/ap
ap/Processor.kt
@@ -15,6 +16,7 @@ ap/META-INF/services/javax.annotation.processing.Processor
output/ap/META-INF/services/javax.annotation.processing.Processor
# kapt
-language-version 1.9
-Kapt-stubs=output/stubs
-Kapt-classes=output/classes
-Kapt-sources=output/sources
@@ -14,11 +14,13 @@ output/javaClasses
output/sources
# kotlinc
-language-version 1.9
-cp %KOTLIN_STDLIB%
-d output/ap
ap/Processor.kt
# kapt
-language-version 1.9
-Kapt-stubs=output/stubs
-Kapt-classes=output/classes
-Kapt-sources=output/sources
@@ -48,12 +48,6 @@ public class KaptToolIntegrationTestGenerated extends AbstractKaptToolIntegratio
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
@TestMetadata("kotlinFileGeneration")
public void testKotlinFileGeneration() throws Exception {
@@ -123,7 +123,6 @@ class Kapt3CommandLineProcessor : CommandLineProcessor {
STRICT_MODE_OPTION -> setFlag(KaptFlag.STRICT, value)
STRIP_METADATA_OPTION -> setFlag(KaptFlag.STRIP_METADATA, 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)
DUMP_PROCESSOR_STATS -> processorsStatsReportFile = File(value)
@@ -5,6 +5,7 @@
package org.jetbrains.kotlin.kapt4
import com.intellij.openapi.extensions.ExtensionPoint
import com.intellij.openapi.util.Disposer
import com.intellij.psi.PsiFile
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.standalone.KtAlwaysAccessibleLifetimeTokenProvider
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.asJava.classes.KtLightClassForFacade
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.config.*
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.kapt3.EfficientProcessorLoader
import org.jetbrains.kotlin.kapt3.KAPT_OPTIONS
@@ -75,10 +78,23 @@ private class Kapt4AnalysisHandlerExtension : FirAnalysisHandlerExtension() {
buildKtModuleProviderByCompilerConfiguration(updatedConfiguration)
registerProjectService(KtLifetimeTokenProvider::class.java, KtAlwaysAccessibleLifetimeTokenProvider())
registerProjectService(KtCompilerPluginsProvider::class.java, StandaloneCompilerPluginsProvider())
}
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 {
projectBaseDir = projectBaseDir ?: module.project.basePath?.let(::File)
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()
}
}