Kapt+JVM_IR: do not run IR plugins in kapt mode

Because in kapt stub generation mode (aka ClassBuilderMode.KAPT3, aka
generateBodies=false in psi2ir), method bodies are not generated and
compiler plugins such as kotlinx-serialization might not expect that.

 #KT-54245 Fixed
This commit is contained in:
Alexander Udalov
2022-12-06 23:46:52 +01:00
committed by Space Team
parent 5848b2fde6
commit a594434a95
4 changed files with 29 additions and 4 deletions
@@ -163,7 +163,7 @@ open class JvmIrCodegenFactory(
SourceDeclarationsPreprocessor(psi2irContext).run(input.files)
if (pluginExtensions.isNotEmpty()) {
if (pluginExtensions.isNotEmpty() && psi2irContext.configuration.generateBodies) {
// The plugin context contains unbound symbols right after construction and has to be
// instantiated before we resolve unbound symbols and invoke any postprocessing steps.
val pluginContext = IrPluginContextImpl(
@@ -5,6 +5,7 @@
package org.jetbrains.kotlin.kapt3.test
import org.jetbrains.kotlin.backend.common.extensions.IrGenerationExtension
import org.jetbrains.kotlin.codegen.ClassBuilderMode
import org.jetbrains.kotlin.codegen.GenerationUtils
import org.jetbrains.kotlin.codegen.OriginCollectingClassBuilderFactory
@@ -13,7 +14,10 @@ import org.jetbrains.kotlin.kapt3.util.MessageCollectorBackedKaptLogger
import org.jetbrains.kotlin.test.model.*
import org.jetbrains.kotlin.test.services.*
class JvmCompilerWithKaptFacade(private val testServices: TestServices) :
class JvmCompilerWithKaptFacade(
private val testServices: TestServices,
private val additionalPluginExtension: IrGenerationExtension? = null,
) :
AbstractTestFacade<ResultingArtifact.Source, KaptContextBinaryArtifact>() {
override val inputKind: TestArtifactKind<ResultingArtifact.Source>
get() = SourcesKind
@@ -26,6 +30,9 @@ class JvmCompilerWithKaptFacade(private val testServices: TestServices) :
override fun transform(module: TestModule, inputArtifact: ResultingArtifact.Source): KaptContextBinaryArtifact {
val configurationProvider = testServices.compilerConfigurationProvider
val project = configurationProvider.getProject(module)
if (additionalPluginExtension != null) {
IrGenerationExtension.registerExtension(project, additionalPluginExtension)
}
val ktFiles = testServices.sourceFileProvider.getKtFilesForSourceFiles(module.files, project, findViaVfs = true).values.toList()
val classBuilderFactory = OriginCollectingClassBuilderFactory(ClassBuilderMode.KAPT3)
val generationState = GenerationUtils.compileFiles(
@@ -6,7 +6,10 @@
package org.jetbrains.kotlin.kapt3.test.integration
import org.jetbrains.kotlin.analyzer.CompilationErrorException
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.ir.declarations.IrModuleFragment
import org.jetbrains.kotlin.kapt3.javac.KaptJavaFileObject
import org.jetbrains.kotlin.test.services.JUnit5Assertions.assertEquals
import org.jetbrains.kotlin.test.services.JUnit5Assertions.assertTrue
@@ -14,6 +17,7 @@ import org.jetbrains.kotlin.test.TargetBackend
import org.jetbrains.kotlin.test.services.JUnit5Assertions.assertNotNull
import org.junit.jupiter.api.Test
import org.junit.jupiter.api.TestInfo
import org.junit.jupiter.api.fail
import java.io.File
import javax.annotation.processing.ProcessingEnvironment
import javax.annotation.processing.RoundEnvironment
@@ -38,6 +42,7 @@ abstract class AbstractKotlinKapt3IntegrationTestBase(private val testInfo: Test
vararg supportedAnnotations: String,
options: Map<String, String> = emptyMap(),
expectFailure: Boolean = false,
additionalPluginExtension: IrGenerationExtension? = null,
process: (Set<TypeElement>, RoundEnvironment, ProcessingEnvironment, Kapt3ExtensionForTests) -> Unit
) {
val file = File(TEST_DATA_DIR, "$name.kt")
@@ -45,6 +50,7 @@ abstract class AbstractKotlinKapt3IntegrationTestBase(private val testInfo: Test
targetBackend,
options,
supportedAnnotations.toList(),
additionalPluginExtension,
process
).apply {
initTestInfo(testInfo)
@@ -241,4 +247,14 @@ abstract class AbstractKotlinKapt3IntegrationTestBase(private val testInfo: Test
diagnostics.assertContainsDiagnostic("warning: a warning from processor", CompilerMessageSeverity.STRONG_WARNING)
diagnostics.assertContainsDiagnostic("Note: a note from processor", CompilerMessageSeverity.INFO)
}
}
@Test
fun testKt54245() = test(
"Simple", "test.MyAnnotation",
additionalPluginExtension = object : IrGenerationExtension {
override fun generate(moduleFragment: IrModuleFragment, pluginContext: IrPluginContext) {
fail("IR generation extensions should not be run in kapt mode.")
}
}
) { _, _, _, _ -> }
}
@@ -5,6 +5,7 @@
package org.jetbrains.kotlin.kapt3.test.integration
import org.jetbrains.kotlin.backend.common.extensions.IrGenerationExtension
import org.jetbrains.kotlin.kapt3.test.JvmCompilerWithKaptFacade
import org.jetbrains.kotlin.kapt3.test.KaptContextBinaryArtifact
import org.jetbrains.kotlin.kapt3.test.KaptEnvironmentConfigurator
@@ -27,6 +28,7 @@ class AbstractKotlinKapt3IntegrationTestRunner(
targetBackend: TargetBackend,
private val processorOptions: Map<String, String>,
private val supportedAnnotations: List<String>,
private val additionalPluginExtension: IrGenerationExtension?,
private val process: (Set<TypeElement>, RoundEnvironment, ProcessingEnvironment, Kapt3ExtensionForTests) -> Unit
) : AbstractKotlinCompilerWithTargetBackendTest(targetBackend) {
@@ -55,7 +57,7 @@ class AbstractKotlinKapt3IntegrationTestRunner(
{ KaptIntegrationEnvironmentConfigurator(it, processorOptions, supportedAnnotations, process) }
)
facadeStep(::JvmCompilerWithKaptFacade)
facadeStep { services -> JvmCompilerWithKaptFacade(services, additionalPluginExtension) }
handlersStep(KaptContextBinaryArtifact.Kind) {
useHandlers(::KaptIntegrationStubsDumpHandler, ::ProcessorWasCalledHandler)
}