From 4f2551497d1ae550cd98c6504bb93d8ee7662010 Mon Sep 17 00:00:00 2001 From: Alexander Udalov Date: Fri, 6 Jan 2023 19:45:57 +0100 Subject: [PATCH] Kapt+JVM_IR: do not require KtFile for each generated class In particular, JVM IR doesn't provide KtFile for a multifile facade in JvmDeclarationOrigin (JVM backend provides KtFile of a random multifile part). This led to multifile classes being completely ignored in the JVM_IR version of kapt. Now they are generated correctly and the changed test passes, but there's a _ir.txt expectation file because the order of 'foo' and 'bar' is different (which is not a problem). --- .../stubs/ClassFileToSourceStubConverter.kt | 11 ++++--- .../testData/converter/multifileClass.kt | 1 - .../testData/converter/multifileClass_ir.txt | 30 +++++++++++++++++++ 3 files changed, 37 insertions(+), 5 deletions(-) create mode 100644 plugins/kapt3/kapt3-compiler/testData/converter/multifileClass_ir.txt diff --git a/plugins/kapt3/kapt3-compiler/src/org/jetbrains/kotlin/kapt3/stubs/ClassFileToSourceStubConverter.kt b/plugins/kapt3/kapt3-compiler/src/org/jetbrains/kotlin/kapt3/stubs/ClassFileToSourceStubConverter.kt index b281bb6f7aa..0125a1b5711 100644 --- a/plugins/kapt3/kapt3-compiler/src/org/jetbrains/kotlin/kapt3/stubs/ClassFileToSourceStubConverter.kt +++ b/plugins/kapt3/kapt3-compiler/src/org/jetbrains/kotlin/kapt3/stubs/ClassFileToSourceStubConverter.kt @@ -52,6 +52,7 @@ import org.jetbrains.kotlin.psi.* import org.jetbrains.kotlin.resolve.ArrayFqNames import org.jetbrains.kotlin.resolve.BindingContext import org.jetbrains.kotlin.resolve.DelegatingBindingTrace +import org.jetbrains.kotlin.resolve.DescriptorUtils import org.jetbrains.kotlin.resolve.calls.model.DefaultValueArgument import org.jetbrains.kotlin.resolve.calls.model.ResolvedValueArgument import org.jetbrains.kotlin.resolve.calls.util.getResolvedCall @@ -64,9 +65,9 @@ import org.jetbrains.kotlin.resolve.descriptorUtil.getSuperClassOrAny import org.jetbrains.kotlin.resolve.descriptorUtil.isCompanionObject import org.jetbrains.kotlin.resolve.jvm.diagnostics.JvmDeclarationOrigin import org.jetbrains.kotlin.resolve.source.getPsi +import org.jetbrains.kotlin.types.KotlinType import org.jetbrains.kotlin.types.error.ErrorTypeKind import org.jetbrains.kotlin.types.error.ErrorUtils -import org.jetbrains.kotlin.types.KotlinType import org.jetbrains.kotlin.types.isError import org.jetbrains.kotlin.types.typeUtil.isEnum import org.jetbrains.org.objectweb.asm.Opcodes @@ -206,7 +207,6 @@ class ClassFileToSourceStubConverter(val kaptContext: KaptContextForStubGenerati private fun convertTopLevelClass(clazz: ClassNode): KaptStub? { val origin = kaptContext.origins[clazz] ?: return null - val ktFile = origin.element?.containingFile as? KtFile ?: return null val descriptor = origin.descriptor ?: return null // Nested classes will be processed during the outer classes conversion @@ -214,14 +214,17 @@ class ClassFileToSourceStubConverter(val kaptContext: KaptContextForStubGenerati val lineMappings = KaptLineMappingCollector(kaptContext) - val packageName = ktFile.packageFqName.asString() + val packageName = DescriptorUtils.getParentOfType(descriptor, PackageFragmentDescriptor::class.java, false)?.fqName?.asString() + ?: return null + val packageClause = if (packageName.isEmpty()) null else treeMaker.FqName(packageName) val classDeclaration = convertClass(clazz, lineMappings, packageName, true) ?: return null classDeclaration.mods.annotations = classDeclaration.mods.annotations - val imports = if (correctErrorTypes) convertImports(ktFile, classDeclaration) else JavacList.nil() + val ktFile = origin.element?.containingFile as? KtFile + val imports = if (ktFile != null && correctErrorTypes) convertImports(ktFile, classDeclaration) else JavacList.nil() val classes = JavacList.of(classDeclaration) diff --git a/plugins/kapt3/kapt3-compiler/testData/converter/multifileClass.kt b/plugins/kapt3/kapt3-compiler/testData/converter/multifileClass.kt index bc8b7e9620f..3c3adac697e 100644 --- a/plugins/kapt3/kapt3-compiler/testData/converter/multifileClass.kt +++ b/plugins/kapt3/kapt3-compiler/testData/converter/multifileClass.kt @@ -1,4 +1,3 @@ -// IGNORE_BACKEND: JVM_IR // WITH_STDLIB // FILE: a.kt diff --git a/plugins/kapt3/kapt3-compiler/testData/converter/multifileClass_ir.txt b/plugins/kapt3/kapt3-compiler/testData/converter/multifileClass_ir.txt new file mode 100644 index 00000000000..1c341e16481 --- /dev/null +++ b/plugins/kapt3/kapt3-compiler/testData/converter/multifileClass_ir.txt @@ -0,0 +1,30 @@ +package test; + +@kotlin.Metadata() +public final class M1 { + + public M1() { + super(); + } + + public static final void bar() { + } + + public static final void foo() { + } +} + +//////////////////// + +package test; + +@kotlin.Metadata() +public final class M2 { + + public M2() { + super(); + } + + public static final void baz() { + } +}