kapt: Fix compilation in 'compile' running mode (KT-33800)

This commit is contained in:
Yan Zhulanow
2019-10-01 22:41:36 +09:00
parent 66758472c7
commit a4c8ccee06
7 changed files with 83 additions and 8 deletions
@@ -32,7 +32,7 @@ import org.jetbrains.kotlin.resolve.scopes.LexicalScope
import org.jetbrains.kotlin.resolve.scopes.utils.memberScopeAsImportingScope import org.jetbrains.kotlin.resolve.scopes.utils.memberScopeAsImportingScope
open class PartialAnalysisHandlerExtension : AnalysisHandlerExtension { open class PartialAnalysisHandlerExtension : AnalysisHandlerExtension {
protected open val analyzePartially: Boolean open val analyzePartially: Boolean
get() = true get() = true
override fun doAnalysis( override fun doAnalysis(
@@ -54,6 +54,11 @@ public class KaptToolIntegrationTestGenerated extends AbstractKaptToolIntegratio
runTest("plugins/kapt3/kapt3-cli/testData/integration/kotlinFileGenerationDefaultOutput/"); 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") @TestMetadata("separateStubAptCompilation")
public void testSeparateStubAptCompilation() throws Exception { public void testSeparateStubAptCompilation() throws Exception {
runTest("plugins/kapt3/kapt3-cli/testData/integration/separateStubAptCompilation/"); runTest("plugins/kapt3/kapt3-cli/testData/integration/separateStubAptCompilation/");
@@ -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)
}
@@ -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
@@ -47,6 +47,7 @@ import org.jetbrains.kotlin.resolve.BindingTrace
import org.jetbrains.kotlin.platform.TargetPlatform import org.jetbrains.kotlin.platform.TargetPlatform
import org.jetbrains.kotlin.platform.jvm.isJvm import org.jetbrains.kotlin.platform.jvm.isJvm
import org.jetbrains.kotlin.resolve.jvm.extensions.AnalysisHandlerExtension import org.jetbrains.kotlin.resolve.jvm.extensions.AnalysisHandlerExtension
import org.jetbrains.kotlin.resolve.jvm.extensions.PartialAnalysisHandlerExtension
import org.jetbrains.kotlin.utils.decodePluginOptions import org.jetbrains.kotlin.utils.decodePluginOptions
import java.io.ByteArrayInputStream import java.io.ByteArrayInputStream
import java.io.File import java.io.File
@@ -186,7 +187,7 @@ class Kapt3ComponentRegistrar : ComponentRegistrar {
val kapt3AnalysisCompletedHandlerExtension = ClasspathBasedKapt3Extension(options, logger, configuration) val kapt3AnalysisCompletedHandlerExtension = ClasspathBasedKapt3Extension(options, logger, configuration)
AnalysisHandlerExtension.registerExtension(project, kapt3AnalysisCompletedHandlerExtension) 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 { private fun KaptOptions.Builder.checkOptions(project: MockProject, logger: KaptLogger, configuration: CompilerConfiguration): Boolean {
@@ -235,14 +236,14 @@ class Kapt3ComponentRegistrar : ComponentRegistrar {
return true return true
} }
class KaptComponentContributor : StorageComponentContainerContributor { class KaptComponentContributor(private val analysisExtension: PartialAnalysisHandlerExtension) : StorageComponentContainerContributor {
override fun registerModuleComponents( override fun registerModuleComponents(
container: StorageComponentContainer, container: StorageComponentContainer,
platform: TargetPlatform, platform: TargetPlatform,
moduleDescriptor: ModuleDescriptor moduleDescriptor: ModuleDescriptor
) { ) {
if (!platform.isJvm()) return if (!platform.isJvm()) return
container.useInstance(KaptAnonymousTypeTransformer()) container.useInstance(KaptAnonymousTypeTransformer(analysisExtension))
} }
} }
@@ -11,15 +11,23 @@ import org.jetbrains.kotlin.descriptors.DeclarationDescriptorWithVisibility
import org.jetbrains.kotlin.resolve.DeclarationSignatureAnonymousTypeTransformer import org.jetbrains.kotlin.resolve.DeclarationSignatureAnonymousTypeTransformer
import org.jetbrains.kotlin.resolve.DescriptorUtils import org.jetbrains.kotlin.resolve.DescriptorUtils
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.KotlinType
import org.jetbrains.kotlin.types.TypeProjectionImpl import org.jetbrains.kotlin.types.TypeProjectionImpl
import org.jetbrains.kotlin.types.replace import org.jetbrains.kotlin.types.replace
import org.jetbrains.kotlin.types.typeUtil.builtIns 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? { override fun transformAnonymousType(descriptor: DeclarationDescriptorWithVisibility, type: KotlinType): KotlinType? {
if (isLocal(descriptor)) if (!analysisExtension.analyzePartially) {
return null
}
if (isLocal(descriptor)) {
return type return type
}
return convertPossiblyAnonymousType(type) return convertPossiblyAnonymousType(type)
} }
@@ -113,8 +113,9 @@ abstract class AbstractKotlinKapt3Test : CodegenTestCase() {
// Use light analysis mode in tests // Use light analysis mode in tests
val project = myEnvironment.project val project = myEnvironment.project
AnalysisHandlerExtension.registerExtension(project, PartialAnalysisHandlerExtension()) val analysisExtension = PartialAnalysisHandlerExtension()
StorageComponentContainerContributor.registerExtension(project, KaptComponentContributor()) AnalysisHandlerExtension.registerExtension(project, analysisExtension)
StorageComponentContainerContributor.registerExtension(project, KaptComponentContributor(analysisExtension))
loadMultiFiles(files) loadMultiFiles(files)