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:
committed by
Space Team
parent
5848b2fde6
commit
a594434a95
+1
-1
@@ -163,7 +163,7 @@ open class JvmIrCodegenFactory(
|
|||||||
|
|
||||||
SourceDeclarationsPreprocessor(psi2irContext).run(input.files)
|
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
|
// The plugin context contains unbound symbols right after construction and has to be
|
||||||
// instantiated before we resolve unbound symbols and invoke any postprocessing steps.
|
// instantiated before we resolve unbound symbols and invoke any postprocessing steps.
|
||||||
val pluginContext = IrPluginContextImpl(
|
val pluginContext = IrPluginContextImpl(
|
||||||
|
|||||||
+8
-1
@@ -5,6 +5,7 @@
|
|||||||
|
|
||||||
package org.jetbrains.kotlin.kapt3.test
|
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.ClassBuilderMode
|
||||||
import org.jetbrains.kotlin.codegen.GenerationUtils
|
import org.jetbrains.kotlin.codegen.GenerationUtils
|
||||||
import org.jetbrains.kotlin.codegen.OriginCollectingClassBuilderFactory
|
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.model.*
|
||||||
import org.jetbrains.kotlin.test.services.*
|
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>() {
|
AbstractTestFacade<ResultingArtifact.Source, KaptContextBinaryArtifact>() {
|
||||||
override val inputKind: TestArtifactKind<ResultingArtifact.Source>
|
override val inputKind: TestArtifactKind<ResultingArtifact.Source>
|
||||||
get() = SourcesKind
|
get() = SourcesKind
|
||||||
@@ -26,6 +30,9 @@ class JvmCompilerWithKaptFacade(private val testServices: TestServices) :
|
|||||||
override fun transform(module: TestModule, inputArtifact: ResultingArtifact.Source): KaptContextBinaryArtifact {
|
override fun transform(module: TestModule, inputArtifact: ResultingArtifact.Source): KaptContextBinaryArtifact {
|
||||||
val configurationProvider = testServices.compilerConfigurationProvider
|
val configurationProvider = testServices.compilerConfigurationProvider
|
||||||
val project = configurationProvider.getProject(module)
|
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 ktFiles = testServices.sourceFileProvider.getKtFilesForSourceFiles(module.files, project, findViaVfs = true).values.toList()
|
||||||
val classBuilderFactory = OriginCollectingClassBuilderFactory(ClassBuilderMode.KAPT3)
|
val classBuilderFactory = OriginCollectingClassBuilderFactory(ClassBuilderMode.KAPT3)
|
||||||
val generationState = GenerationUtils.compileFiles(
|
val generationState = GenerationUtils.compileFiles(
|
||||||
|
|||||||
+17
-1
@@ -6,7 +6,10 @@
|
|||||||
package org.jetbrains.kotlin.kapt3.test.integration
|
package org.jetbrains.kotlin.kapt3.test.integration
|
||||||
|
|
||||||
import org.jetbrains.kotlin.analyzer.CompilationErrorException
|
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.cli.common.messages.CompilerMessageSeverity
|
||||||
|
import org.jetbrains.kotlin.ir.declarations.IrModuleFragment
|
||||||
import org.jetbrains.kotlin.kapt3.javac.KaptJavaFileObject
|
import org.jetbrains.kotlin.kapt3.javac.KaptJavaFileObject
|
||||||
import org.jetbrains.kotlin.test.services.JUnit5Assertions.assertEquals
|
import org.jetbrains.kotlin.test.services.JUnit5Assertions.assertEquals
|
||||||
import org.jetbrains.kotlin.test.services.JUnit5Assertions.assertTrue
|
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.jetbrains.kotlin.test.services.JUnit5Assertions.assertNotNull
|
||||||
import org.junit.jupiter.api.Test
|
import org.junit.jupiter.api.Test
|
||||||
import org.junit.jupiter.api.TestInfo
|
import org.junit.jupiter.api.TestInfo
|
||||||
|
import org.junit.jupiter.api.fail
|
||||||
import java.io.File
|
import java.io.File
|
||||||
import javax.annotation.processing.ProcessingEnvironment
|
import javax.annotation.processing.ProcessingEnvironment
|
||||||
import javax.annotation.processing.RoundEnvironment
|
import javax.annotation.processing.RoundEnvironment
|
||||||
@@ -38,6 +42,7 @@ abstract class AbstractKotlinKapt3IntegrationTestBase(private val testInfo: Test
|
|||||||
vararg supportedAnnotations: String,
|
vararg supportedAnnotations: String,
|
||||||
options: Map<String, String> = emptyMap(),
|
options: Map<String, String> = emptyMap(),
|
||||||
expectFailure: Boolean = false,
|
expectFailure: Boolean = false,
|
||||||
|
additionalPluginExtension: IrGenerationExtension? = null,
|
||||||
process: (Set<TypeElement>, RoundEnvironment, ProcessingEnvironment, Kapt3ExtensionForTests) -> Unit
|
process: (Set<TypeElement>, RoundEnvironment, ProcessingEnvironment, Kapt3ExtensionForTests) -> Unit
|
||||||
) {
|
) {
|
||||||
val file = File(TEST_DATA_DIR, "$name.kt")
|
val file = File(TEST_DATA_DIR, "$name.kt")
|
||||||
@@ -45,6 +50,7 @@ abstract class AbstractKotlinKapt3IntegrationTestBase(private val testInfo: Test
|
|||||||
targetBackend,
|
targetBackend,
|
||||||
options,
|
options,
|
||||||
supportedAnnotations.toList(),
|
supportedAnnotations.toList(),
|
||||||
|
additionalPluginExtension,
|
||||||
process
|
process
|
||||||
).apply {
|
).apply {
|
||||||
initTestInfo(testInfo)
|
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("warning: a warning from processor", CompilerMessageSeverity.STRONG_WARNING)
|
||||||
diagnostics.assertContainsDiagnostic("Note: a note from processor", CompilerMessageSeverity.INFO)
|
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.")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
) { _, _, _, _ -> }
|
||||||
|
}
|
||||||
|
|||||||
+3
-1
@@ -5,6 +5,7 @@
|
|||||||
|
|
||||||
package org.jetbrains.kotlin.kapt3.test.integration
|
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.JvmCompilerWithKaptFacade
|
||||||
import org.jetbrains.kotlin.kapt3.test.KaptContextBinaryArtifact
|
import org.jetbrains.kotlin.kapt3.test.KaptContextBinaryArtifact
|
||||||
import org.jetbrains.kotlin.kapt3.test.KaptEnvironmentConfigurator
|
import org.jetbrains.kotlin.kapt3.test.KaptEnvironmentConfigurator
|
||||||
@@ -27,6 +28,7 @@ class AbstractKotlinKapt3IntegrationTestRunner(
|
|||||||
targetBackend: TargetBackend,
|
targetBackend: TargetBackend,
|
||||||
private val processorOptions: Map<String, String>,
|
private val processorOptions: Map<String, String>,
|
||||||
private val supportedAnnotations: List<String>,
|
private val supportedAnnotations: List<String>,
|
||||||
|
private val additionalPluginExtension: IrGenerationExtension?,
|
||||||
private val process: (Set<TypeElement>, RoundEnvironment, ProcessingEnvironment, Kapt3ExtensionForTests) -> Unit
|
private val process: (Set<TypeElement>, RoundEnvironment, ProcessingEnvironment, Kapt3ExtensionForTests) -> Unit
|
||||||
) : AbstractKotlinCompilerWithTargetBackendTest(targetBackend) {
|
) : AbstractKotlinCompilerWithTargetBackendTest(targetBackend) {
|
||||||
|
|
||||||
@@ -55,7 +57,7 @@ class AbstractKotlinKapt3IntegrationTestRunner(
|
|||||||
{ KaptIntegrationEnvironmentConfigurator(it, processorOptions, supportedAnnotations, process) }
|
{ KaptIntegrationEnvironmentConfigurator(it, processorOptions, supportedAnnotations, process) }
|
||||||
)
|
)
|
||||||
|
|
||||||
facadeStep(::JvmCompilerWithKaptFacade)
|
facadeStep { services -> JvmCompilerWithKaptFacade(services, additionalPluginExtension) }
|
||||||
handlersStep(KaptContextBinaryArtifact.Kind) {
|
handlersStep(KaptContextBinaryArtifact.Kind) {
|
||||||
useHandlers(::KaptIntegrationStubsDumpHandler, ::ProcessorWasCalledHandler)
|
useHandlers(::KaptIntegrationStubsDumpHandler, ::ProcessorWasCalledHandler)
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user