From a4c8ccee067683ea276f514cd186d57d45041ca4 Mon Sep 17 00:00:00 2001 From: Yan Zhulanow Date: Tue, 1 Oct 2019 22:41:36 +0900 Subject: [PATCH] kapt: Fix compilation in 'compile' running mode (KT-33800) --- .../PartialAnalysisHandlerExtension.kt | 2 +- .../KaptToolIntegrationTestGenerated.java | 5 +++ .../testData/integration/kt33800/Test.kt | 19 +++++++++ .../testData/integration/kt33800/build.txt | 41 +++++++++++++++++++ .../org/jetbrains/kotlin/kapt3/Kapt3Plugin.kt | 7 ++-- .../kapt3/KaptAnonymousTypeTransformer.kt | 12 +++++- .../kapt3/test/AbstractKotlinKapt3Test.kt | 5 ++- 7 files changed, 83 insertions(+), 8 deletions(-) create mode 100644 plugins/kapt3/kapt3-cli/testData/integration/kt33800/Test.kt create mode 100644 plugins/kapt3/kapt3-cli/testData/integration/kt33800/build.txt diff --git a/compiler/frontend.java/src/org/jetbrains/kotlin/resolve/jvm/extensions/PartialAnalysisHandlerExtension.kt b/compiler/frontend.java/src/org/jetbrains/kotlin/resolve/jvm/extensions/PartialAnalysisHandlerExtension.kt index a4de17a9d83..ecf00ffc3c0 100644 --- a/compiler/frontend.java/src/org/jetbrains/kotlin/resolve/jvm/extensions/PartialAnalysisHandlerExtension.kt +++ b/compiler/frontend.java/src/org/jetbrains/kotlin/resolve/jvm/extensions/PartialAnalysisHandlerExtension.kt @@ -32,7 +32,7 @@ import org.jetbrains.kotlin.resolve.scopes.LexicalScope import org.jetbrains.kotlin.resolve.scopes.utils.memberScopeAsImportingScope open class PartialAnalysisHandlerExtension : AnalysisHandlerExtension { - protected open val analyzePartially: Boolean + open val analyzePartially: Boolean get() = true override fun doAnalysis( diff --git a/plugins/kapt3/kapt3-cli/test/org/jetbrains/kotlin/kapt/cli/test/KaptToolIntegrationTestGenerated.java b/plugins/kapt3/kapt3-cli/test/org/jetbrains/kotlin/kapt/cli/test/KaptToolIntegrationTestGenerated.java index 80d200069fb..f379668203f 100644 --- a/plugins/kapt3/kapt3-cli/test/org/jetbrains/kotlin/kapt/cli/test/KaptToolIntegrationTestGenerated.java +++ b/plugins/kapt3/kapt3-cli/test/org/jetbrains/kotlin/kapt/cli/test/KaptToolIntegrationTestGenerated.java @@ -54,6 +54,11 @@ public class KaptToolIntegrationTestGenerated extends AbstractKaptToolIntegratio runTest("plugins/kapt3/kapt3-cli/testData/integration/kotlinFileGenerationDefaultOutput/"); } + @TestMetadata("kt33800") + public void testKt33800() throws Exception { + runTest("plugins/kapt3/kapt3-cli/testData/integration/kt33800/"); + } + @TestMetadata("separateStubAptCompilation") public void testSeparateStubAptCompilation() throws Exception { runTest("plugins/kapt3/kapt3-cli/testData/integration/separateStubAptCompilation/"); diff --git a/plugins/kapt3/kapt3-cli/testData/integration/kt33800/Test.kt b/plugins/kapt3/kapt3-cli/testData/integration/kt33800/Test.kt new file mode 100644 index 00000000000..e40827f392b --- /dev/null +++ b/plugins/kapt3/kapt3-cli/testData/integration/kt33800/Test.kt @@ -0,0 +1,19 @@ +package test + +import apt.Anno +import generated.Example as ExampleGenerated + +@Anno +class Example() { + private val callback = object : Any() { + val obj = Object() + } + + fun call() { + callback.obj + } +} + +fun main() { + println("Generated class: " + ExampleGenerated::class.java.name) +} \ No newline at end of file diff --git a/plugins/kapt3/kapt3-cli/testData/integration/kt33800/build.txt b/plugins/kapt3/kapt3-cli/testData/integration/kt33800/build.txt new file mode 100644 index 00000000000..fce839b01e9 --- /dev/null +++ b/plugins/kapt3/kapt3-cli/testData/integration/kt33800/build.txt @@ -0,0 +1,41 @@ +# copy +../simple/ap +ap + +# mkdir +output/ap +output/stubs +output/classes +output/javaClasses +output/sources + +# kotlinc +-cp %KOTLIN_STDLIB% +-d output/ap +ap/Processor.kt + +# copy +../simple/ap/META-INF/services/javax.annotation.processing.Processor +output/ap/META-INF/services/javax.annotation.processing.Processor + +# kapt +-Kapt-stubs=output/stubs +-Kapt-classes=output/classes +-Kapt-sources=output/sources +-Kapt-classpath=output/ap +-d output/classes +-cp output/ap:%KOTLIN_STDLIB% +Test.kt + +# javac +-cp output/ap +-d output/javaClasses +-proc:none +output/sources/generated/Example.java + +# java +-cp output/classes:output/javaClasses:output/ap:%KOTLIN_STDLIB% +test.TestKt + +# after +Generated class: generated.Example \ No newline at end of file diff --git a/plugins/kapt3/kapt3-compiler/src/org/jetbrains/kotlin/kapt3/Kapt3Plugin.kt b/plugins/kapt3/kapt3-compiler/src/org/jetbrains/kotlin/kapt3/Kapt3Plugin.kt index 133097ebfd2..db4e89d1bf7 100644 --- a/plugins/kapt3/kapt3-compiler/src/org/jetbrains/kotlin/kapt3/Kapt3Plugin.kt +++ b/plugins/kapt3/kapt3-compiler/src/org/jetbrains/kotlin/kapt3/Kapt3Plugin.kt @@ -47,6 +47,7 @@ import org.jetbrains.kotlin.resolve.BindingTrace import org.jetbrains.kotlin.platform.TargetPlatform import org.jetbrains.kotlin.platform.jvm.isJvm import org.jetbrains.kotlin.resolve.jvm.extensions.AnalysisHandlerExtension +import org.jetbrains.kotlin.resolve.jvm.extensions.PartialAnalysisHandlerExtension import org.jetbrains.kotlin.utils.decodePluginOptions import java.io.ByteArrayInputStream import java.io.File @@ -186,7 +187,7 @@ class Kapt3ComponentRegistrar : ComponentRegistrar { val kapt3AnalysisCompletedHandlerExtension = ClasspathBasedKapt3Extension(options, logger, configuration) AnalysisHandlerExtension.registerExtension(project, kapt3AnalysisCompletedHandlerExtension) - StorageComponentContainerContributor.registerExtension(project, KaptComponentContributor()) + StorageComponentContainerContributor.registerExtension(project, KaptComponentContributor(kapt3AnalysisCompletedHandlerExtension)) } private fun KaptOptions.Builder.checkOptions(project: MockProject, logger: KaptLogger, configuration: CompilerConfiguration): Boolean { @@ -235,14 +236,14 @@ class Kapt3ComponentRegistrar : ComponentRegistrar { return true } - class KaptComponentContributor : StorageComponentContainerContributor { + class KaptComponentContributor(private val analysisExtension: PartialAnalysisHandlerExtension) : StorageComponentContainerContributor { override fun registerModuleComponents( container: StorageComponentContainer, platform: TargetPlatform, moduleDescriptor: ModuleDescriptor ) { if (!platform.isJvm()) return - container.useInstance(KaptAnonymousTypeTransformer()) + container.useInstance(KaptAnonymousTypeTransformer(analysisExtension)) } } diff --git a/plugins/kapt3/kapt3-compiler/src/org/jetbrains/kotlin/kapt3/KaptAnonymousTypeTransformer.kt b/plugins/kapt3/kapt3-compiler/src/org/jetbrains/kotlin/kapt3/KaptAnonymousTypeTransformer.kt index bc865f3f399..90a6f7a2edb 100644 --- a/plugins/kapt3/kapt3-compiler/src/org/jetbrains/kotlin/kapt3/KaptAnonymousTypeTransformer.kt +++ b/plugins/kapt3/kapt3-compiler/src/org/jetbrains/kotlin/kapt3/KaptAnonymousTypeTransformer.kt @@ -11,15 +11,23 @@ import org.jetbrains.kotlin.descriptors.DeclarationDescriptorWithVisibility import org.jetbrains.kotlin.resolve.DeclarationSignatureAnonymousTypeTransformer import org.jetbrains.kotlin.resolve.DescriptorUtils import org.jetbrains.kotlin.resolve.DescriptorUtils.* +import org.jetbrains.kotlin.resolve.jvm.extensions.PartialAnalysisHandlerExtension import org.jetbrains.kotlin.types.KotlinType import org.jetbrains.kotlin.types.TypeProjectionImpl import org.jetbrains.kotlin.types.replace import org.jetbrains.kotlin.types.typeUtil.builtIns -class KaptAnonymousTypeTransformer : DeclarationSignatureAnonymousTypeTransformer { +class KaptAnonymousTypeTransformer( + private val analysisExtension: PartialAnalysisHandlerExtension +) : DeclarationSignatureAnonymousTypeTransformer { override fun transformAnonymousType(descriptor: DeclarationDescriptorWithVisibility, type: KotlinType): KotlinType? { - if (isLocal(descriptor)) + if (!analysisExtension.analyzePartially) { + return null + } + + if (isLocal(descriptor)) { return type + } return convertPossiblyAnonymousType(type) } diff --git a/plugins/kapt3/kapt3-compiler/test/org/jetbrains/kotlin/kapt3/test/AbstractKotlinKapt3Test.kt b/plugins/kapt3/kapt3-compiler/test/org/jetbrains/kotlin/kapt3/test/AbstractKotlinKapt3Test.kt index 76d1beede6b..540d149cf25 100644 --- a/plugins/kapt3/kapt3-compiler/test/org/jetbrains/kotlin/kapt3/test/AbstractKotlinKapt3Test.kt +++ b/plugins/kapt3/kapt3-compiler/test/org/jetbrains/kotlin/kapt3/test/AbstractKotlinKapt3Test.kt @@ -113,8 +113,9 @@ abstract class AbstractKotlinKapt3Test : CodegenTestCase() { // Use light analysis mode in tests val project = myEnvironment.project - AnalysisHandlerExtension.registerExtension(project, PartialAnalysisHandlerExtension()) - StorageComponentContainerContributor.registerExtension(project, KaptComponentContributor()) + val analysisExtension = PartialAnalysisHandlerExtension() + AnalysisHandlerExtension.registerExtension(project, analysisExtension) + StorageComponentContainerContributor.registerExtension(project, KaptComponentContributor(analysisExtension)) loadMultiFiles(files)