K2 KAPT: Do not run FIR compiler plugins in KAPT mode
#KT-70651 Fixed
diff --git a/compiler/cli/src/org/jetbrains/kotlin/cli/common/FirSessionConstructionUtils.kt b/compiler/cli/src/org/jetbrains/kotlin/cli/common/FirSessionConstructionUtils.kt
index 021db48..d18f452 100644
--- a/compiler/cli/src/org/jetbrains/kotlin/cli/common/FirSessionConstructionUtils.kt
+++ b/compiler/cli/src/org/jetbrains/kotlin/cli/common/FirSessionConstructionUtils.kt
@@ -61,6 +61,7 @@
isScript: (F) -> Boolean,
fileBelongsToModule: (F, String) -> Boolean,
createProviderAndScopeForIncrementalCompilation: (List<F>) -> IncrementalCompilationContext?,
+ kaptMode: Boolean = false
): List<SessionWithSources<F>> {
val javaSourcesScope = projectEnvironment.getSearchScopeForProjectJavaSources()
val predefinedJavaComponents = FirSharableJavaComponents(firCachesFactoryForCliMode)
@@ -83,6 +84,7 @@
configuration.languageVersionSettings,
predefinedJavaComponents = predefinedJavaComponents,
registerExtraComponents = {},
+ kaptMode
)
},
) { moduleFiles, moduleData, sessionProvider, sessionConfigurator ->
@@ -116,6 +118,7 @@
needRegisterJavaElementFinder = true,
registerExtraComponents = {},
sessionConfigurator,
+ kaptMode
)
}
}
diff --git a/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/compiler/FirKotlinToJvmBytecodeCompiler.kt b/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/compiler/FirKotlinToJvmBytecodeCompiler.kt
index 161699a..c1ebcdb 100644
--- a/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/compiler/FirKotlinToJvmBytecodeCompiler.kt
+++ b/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/compiler/FirKotlinToJvmBytecodeCompiler.kt
@@ -86,6 +86,7 @@
allSources: List<KtFile>,
buildFile: File?,
module: Module,
+ kaptMode: Boolean
): FirResult {
val targetIds = compilerConfiguration.get(JVMConfigurationKeys.MODULES)?.map(::TargetId)
val incrementalComponents = compilerConfiguration.get(JVMConfigurationKeys.INCREMENTAL_COMPILATION_COMPONENTS)
@@ -105,7 +106,7 @@
irGenerationExtensions = IrGenerationExtension.getInstances(project)
)
val diagnosticsReporter = createPendingReporter(messageCollector)
- return context.runFrontend(allSources, diagnosticsReporter, module.getModuleName(), module.getFriendPaths(), true)!!
+ return context.runFrontend(allSources, diagnosticsReporter, module.getModuleName(), module.getFriendPaths(), true, kaptMode)!!
}
fun compileModulesUsingFrontendIRAndPsi(
@@ -200,6 +201,7 @@
rootModuleName: String,
friendPaths: List<String>,
ignoreErrors: Boolean = false,
+ kaptMode: Boolean = false
): FirResult? {
val performanceManager = configuration.get(CLIConfigurationKeys.PERF_MANAGER)
performanceManager?.notifyAnalysisStarted()
@@ -232,7 +234,8 @@
isCommonSource = { it.isCommonSource == true },
isScript = { it.isScript() },
fileBelongsToModule = { file, moduleName -> file.hmppModuleName == moduleName },
- createProviderAndScopeForIncrementalCompilation = { providerAndScopeForIncrementalCompilation }
+ createProviderAndScopeForIncrementalCompilation = { providerAndScopeForIncrementalCompilation },
+ kaptMode
)
val outputs = sessionsWithSources.map { (session, sources) ->
diff --git a/compiler/fir/entrypoint/src/org/jetbrains/kotlin/fir/session/ComponentsContainers.kt b/compiler/fir/entrypoint/src/org/jetbrains/kotlin/fir/session/ComponentsContainers.kt
index 250cc37..3275e4e 100644
--- a/compiler/fir/entrypoint/src/org/jetbrains/kotlin/fir/session/ComponentsContainers.kt
+++ b/compiler/fir/entrypoint/src/org/jetbrains/kotlin/fir/session/ComponentsContainers.kt
@@ -96,8 +96,8 @@
}
@OptIn(SessionConfiguration::class)
-fun FirSession.registerCommonComponentsAfterExtensionsAreConfigured() {
- register(FirFunctionTypeKindService::class, FirFunctionTypeKindServiceImpl(this))
+fun FirSession.registerCommonComponentsAfterExtensionsAreConfigured(kaptMode: Boolean = false) {
+ register(FirFunctionTypeKindService::class, FirFunctionTypeKindServiceImpl(this, kaptMode))
register(FirProvidedDeclarationsForMetadataService::class, FirProvidedDeclarationsForMetadataService.create(this))
}
diff --git a/compiler/fir/entrypoint/src/org/jetbrains/kotlin/fir/session/FirAbstractSessionFactory.kt b/compiler/fir/entrypoint/src/org/jetbrains/kotlin/fir/session/FirAbstractSessionFactory.kt
index 2693673..7895f18 100644
--- a/compiler/fir/entrypoint/src/org/jetbrains/kotlin/fir/session/FirAbstractSessionFactory.kt
+++ b/compiler/fir/entrypoint/src/org/jetbrains/kotlin/fir/session/FirAbstractSessionFactory.kt
@@ -37,7 +37,8 @@
extensionRegistrars: List<FirExtensionRegistrar>,
registerExtraComponents: ((FirSession) -> Unit),
createKotlinScopeProvider: () -> FirKotlinScopeProvider,
- createProviders: (FirSession, FirModuleData, FirKotlinScopeProvider, FirExtensionSyntheticFunctionInterfaceProvider?) -> List<FirSymbolProvider>
+ createProviders: (FirSession, FirModuleData, FirKotlinScopeProvider, FirExtensionSyntheticFunctionInterfaceProvider?) -> List<FirSymbolProvider>,
+ kaptMode: Boolean = false,
): FirSession {
return FirCliSession(sessionProvider, FirSession.Kind.Library).apply session@{
moduleDataProvider.allModuleData.forEach {
@@ -59,11 +60,13 @@
builtinsModuleData.bindSession(this)
FirSessionConfigurator(this).apply {
- for (extensionRegistrar in extensionRegistrars) {
- registerExtensions(extensionRegistrar.configure())
+ if (!kaptMode) {
+ for (extensionRegistrar in extensionRegistrars) {
+ registerExtensions(extensionRegistrar.configure())
+ }
}
}.configure()
- registerCommonComponentsAfterExtensionsAreConfigured()
+ registerCommonComponentsAfterExtensionsAreConfigured(kaptMode)
val syntheticFunctionInterfaceProvider =
FirExtensionSyntheticFunctionInterfaceProvider.createIfNeeded(this, builtinsModuleData, kotlinScopeProvider)
@@ -91,7 +94,8 @@
FirSession, FirKotlinScopeProvider, FirSymbolProvider,
FirSwitchableExtensionDeclarationsSymbolProvider?,
dependencies: List<FirSymbolProvider>,
- ) -> List<FirSymbolProvider>
+ ) -> List<FirSymbolProvider>,
+ kaptMode: Boolean = false
): FirSession {
return FirCliSession(sessionProvider, FirSession.Kind.Source).apply session@{
moduleData.bindSession(this@session)
@@ -112,12 +116,14 @@
registerCommonCheckers()
registerExtraCheckers?.invoke(this)
- for (extensionRegistrar in extensionRegistrars) {
- registerExtensions(extensionRegistrar.configure())
+ if (!kaptMode) {
+ for (extensionRegistrar in extensionRegistrars) {
+ registerExtensions(extensionRegistrar.configure())
+ }
}
init()
}.configure()
- registerCommonComponentsAfterExtensionsAreConfigured()
+ registerCommonComponentsAfterExtensionsAreConfigured(kaptMode)
val dependencyProviders = computeDependencyProviderList(moduleData)
val generatedSymbolsProvider = FirSwitchableExtensionDeclarationsSymbolProvider.createIfNeeded(this)
diff --git a/compiler/fir/entrypoint/src/org/jetbrains/kotlin/fir/session/FirJvmSessionFactory.kt b/compiler/fir/entrypoint/src/org/jetbrains/kotlin/fir/session/FirJvmSessionFactory.kt
index b597b2e..e7de646 100644
--- a/compiler/fir/entrypoint/src/org/jetbrains/kotlin/fir/session/FirJvmSessionFactory.kt
+++ b/compiler/fir/entrypoint/src/org/jetbrains/kotlin/fir/session/FirJvmSessionFactory.kt
@@ -45,6 +45,7 @@
languageVersionSettings: LanguageVersionSettings,
predefinedJavaComponents: FirSharableJavaComponents?,
registerExtraComponents: ((FirSession) -> Unit),
+ kaptMode: Boolean = false,
): FirSession {
val kotlinClassFinder = projectEnvironment.getKotlinClassFinder(scope)
return createLibrarySession(
@@ -82,7 +83,8 @@
packagePartProvider
)
)
- }
+ },
+ kaptMode
)
}
@@ -103,6 +105,7 @@
needRegisterJavaElementFinder: Boolean,
registerExtraComponents: ((FirSession) -> Unit),
init: FirSessionConfigurator.() -> Unit,
+ kaptMode: Boolean = false
): FirSession {
return createModuleBasedSession(
moduleData,
@@ -144,7 +147,8 @@
*dependencies.toTypedArray(),
incrementalCompilationSymbolProviders?.optionalAnnotationClassesProviderForBinariesFromIncrementalCompilation,
)
- }
+ },
+ kaptMode
).also {
if (needRegisterJavaElementFinder) {
projectEnvironment.registerAsJavaElementFinder(it)
diff --git a/compiler/fir/providers/src/org/jetbrains/kotlin/fir/types/FirFunctionTypeKindServiceImpl.kt b/compiler/fir/providers/src/org/jetbrains/kotlin/fir/types/FirFunctionTypeKindServiceImpl.kt
index c4e9844..8b9c580 100644
--- a/compiler/fir/providers/src/org/jetbrains/kotlin/fir/types/FirFunctionTypeKindServiceImpl.kt
+++ b/compiler/fir/providers/src/org/jetbrains/kotlin/fir/types/FirFunctionTypeKindServiceImpl.kt
@@ -18,7 +18,7 @@
import org.jetbrains.kotlin.fir.symbols.impl.FirFunctionSymbol
import org.jetbrains.kotlin.name.ClassId
-class FirFunctionTypeKindServiceImpl(private val session: FirSession) : FirFunctionTypeKindService() {
+class FirFunctionTypeKindServiceImpl(private val session: FirSession, kaptMode: Boolean) : FirFunctionTypeKindService() {
private val nonReflectKindsFromExtensions = mutableListOf<FunctionTypeKind>()
override val extractor: FunctionTypeKindExtractor = run {
@@ -38,8 +38,10 @@
}
}
- for (extension in session.extensionService.functionTypeKindExtensions) {
- with(extension) { registrar.registerKinds() }
+ if (!kaptMode) {
+ for (extension in session.extensionService.functionTypeKindExtensions) {
+ with(extension) { registrar.registerKinds() }
+ }
}
}.also { kinds ->
val allNames = kinds.map { "${it.packageFqName}.${it.classNamePrefix}" }
diff --git a/plugins/kapt4/src/org/jetbrains/kotlin/kapt4/FirKaptAnalysisHandlerExtension.kt b/plugins/kapt4/src/org/jetbrains/kotlin/kapt4/FirKaptAnalysisHandlerExtension.kt
index cd0c17d..adcce16 100644
--- a/plugins/kapt4/src/org/jetbrains/kotlin/kapt4/FirKaptAnalysisHandlerExtension.kt
+++ b/plugins/kapt4/src/org/jetbrains/kotlin/kapt4/FirKaptAnalysisHandlerExtension.kt
@@ -214,7 +214,7 @@
val (analysisTime, analysisResults) = measureTimeMillis {
val sourceFiles = getSourceFiles(disposable, projectEnvironment, configuration)
- runFrontendForAnalysis(projectEnvironment, configuration, messageCollector, sourceFiles, null, module)
+ runFrontendForAnalysis(projectEnvironment, configuration, messageCollector, sourceFiles, null, module, true)
}
logger.info { "Initial analysis took $analysisTime ms" }
diff --git a/plugins/kapt4/test/org/jetbrains/kotlin/kapt4/integration/AbstractFirKotlinKaptIntegrationTestRunner.kt b/plugins/kapt4/test/org/jetbrains/kotlin/kapt4/integration/AbstractFirKotlinKaptIntegrationTestRunner.kt
index 82ba6ae..3c36af6 100644
--- a/plugins/kapt4/test/org/jetbrains/kotlin/kapt4/integration/AbstractFirKotlinKaptIntegrationTestRunner.kt
+++ b/plugins/kapt4/test/org/jetbrains/kotlin/kapt4/integration/AbstractFirKotlinKaptIntegrationTestRunner.kt
@@ -6,6 +6,12 @@
package org.jetbrains.kotlin.kapt4.integration
import org.jetbrains.kotlin.backend.common.extensions.IrGenerationExtension
+import org.jetbrains.kotlin.compiler.plugin.CompilerPluginRegistrar
+import org.jetbrains.kotlin.config.CompilerConfiguration
+import org.jetbrains.kotlin.fir.FirSession
+import org.jetbrains.kotlin.fir.extensions.FirExtensionRegistrar
+import org.jetbrains.kotlin.fir.extensions.FirExtensionRegistrarAdapter
+import org.jetbrains.kotlin.fir.extensions.FirFunctionTypeKindExtension
import org.jetbrains.kotlin.kapt3.base.util.doOpenInternalPackagesIfRequired
import org.jetbrains.kotlin.kapt3.test.JvmCompilerWithKaptFacade
import org.jetbrains.kotlin.kapt3.test.KaptContextBinaryArtifact
@@ -16,7 +22,10 @@
import org.jetbrains.kotlin.test.builders.TestConfigurationBuilder
import org.jetbrains.kotlin.test.model.DependencyKind
import org.jetbrains.kotlin.test.model.FrontendKinds
+import org.jetbrains.kotlin.test.model.TestModule
import org.jetbrains.kotlin.test.runners.AbstractKotlinCompilerWithTargetBackendTest
+import org.jetbrains.kotlin.test.services.EnvironmentConfigurator
+import org.jetbrains.kotlin.test.services.TestServices
import org.jetbrains.kotlin.test.services.configuration.CommonEnvironmentConfigurator
import org.jetbrains.kotlin.test.services.configuration.JvmEnvironmentConfigurator
import org.jetbrains.kotlin.utils.bind
@@ -27,6 +36,7 @@
class AbstractFirKotlinKaptIntegrationTestRunner(
private val processorOptions: Map<String, String>,
private val supportedAnnotations: List<String>,
+ private val additionalFirPluginExtension: ((FirSession) -> FirFunctionTypeKindExtension)?,
private val additionalPluginExtension: IrGenerationExtension?,
private val process: (Set<TypeElement>, RoundEnvironment, ProcessingEnvironment, FirKaptExtensionForTests) -> Unit
) : AbstractKotlinCompilerWithTargetBackendTest(TargetBackend.JVM_IR) {
@@ -50,6 +60,7 @@
::CommonEnvironmentConfigurator,
::JvmEnvironmentConfigurator,
::KaptEnvironmentConfigurator.bind(processorOptions),
+ { FirKaptExtensionRegistrarConfigurator(it, additionalFirPluginExtension) },
{ FirKaptIntegrationEnvironmentConfigurator(it, processorOptions, supportedAnnotations, process) }
)
@@ -61,3 +72,25 @@
useAdditionalService(::FirKaptExtensionProvider)
}
}
+
+class FirKaptExtensionRegistrarConfigurator(
+ testServices: TestServices,
+ private val additionalFirPluginExtension: ((FirSession) -> FirFunctionTypeKindExtension)?,
+): EnvironmentConfigurator(testServices) {
+ override fun CompilerPluginRegistrar.ExtensionStorage.registerCompilerExtensions(
+ module: TestModule,
+ configuration: CompilerConfiguration
+ ) {
+ if (additionalFirPluginExtension != null) {
+ FirExtensionRegistrarAdapter.registerExtension(FirKaptExtensionRegistrar(additionalFirPluginExtension))
+ }
+ }
+}
+
+class FirKaptExtensionRegistrar(
+ private val additionalFirPluginExtension: (FirSession) -> FirFunctionTypeKindExtension,
+): FirExtensionRegistrar() {
+ override fun ExtensionRegistrarContext.configurePlugin() {
+ +additionalFirPluginExtension
+ }
+}
\ No newline at end of file
diff --git a/plugins/kapt4/test/org/jetbrains/kotlin/kapt4/integration/FirKotlinKaptIntegrationTest.kt b/plugins/kapt4/test/org/jetbrains/kotlin/kapt4/integration/FirKotlinKaptIntegrationTest.kt
index 3f87aff..8e68945 100644
--- a/plugins/kapt4/test/org/jetbrains/kotlin/kapt4/integration/FirKotlinKaptIntegrationTest.kt
+++ b/plugins/kapt4/test/org/jetbrains/kotlin/kapt4/integration/FirKotlinKaptIntegrationTest.kt
@@ -9,6 +9,8 @@
import org.jetbrains.kotlin.backend.common.extensions.IrGenerationExtension
import org.jetbrains.kotlin.backend.common.extensions.IrPluginContext
import org.jetbrains.kotlin.cli.common.messages.CompilerMessageSeverity
+import org.jetbrains.kotlin.fir.FirSession
+import org.jetbrains.kotlin.fir.extensions.FirFunctionTypeKindExtension
import org.jetbrains.kotlin.ir.declarations.IrModuleFragment
import org.jetbrains.kotlin.kapt3.javac.KaptJavaFileObject
import org.jetbrains.kotlin.kapt3.test.integration.LoggingMessageCollector
@@ -39,12 +41,14 @@
options: Map<String, String> = emptyMap(),
expectFailure: Boolean = false,
additionalPluginExtension: IrGenerationExtension? = null,
+ additionalFirPluginExtension: ((FirSession) -> FirFunctionTypeKindExtension)? = null,
process: (Set<TypeElement>, RoundEnvironment, ProcessingEnvironment, FirKaptExtensionForTests) -> Unit
) {
val file = File(TEST_DATA_DIR, "$name.kt")
AbstractFirKotlinKaptIntegrationTestRunner(
options,
supportedAnnotations.toList(),
+ additionalFirPluginExtension,
additionalPluginExtension,
process
).apply {
@@ -261,4 +265,16 @@
}
}
) { _, _, _, _ -> }
+
+ @Test
+ fun testFirExtensionIsIgnored() = test(
+ "Simple", "test.MyAnnotation",
+ additionalFirPluginExtension = {
+ object : FirFunctionTypeKindExtension(it) {
+ override fun FunctionTypeKindRegistrar.registerKinds() {
+ fail("FIR extensions should not be run in kapt mode.")
+ }
+ }
+ }
+ ) { _, _, _, _ -> }
}