kapt: Fix compilation in 'compile' running mode (KT-33800)
This commit is contained in:
+1
-1
@@ -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(
|
||||||
|
|||||||
+5
@@ -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))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+10
-2
@@ -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)
|
||||||
}
|
}
|
||||||
|
|||||||
+3
-2
@@ -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)
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user