From 04998cff8aa689a855eec6fa8e3203af9e31b4cd Mon Sep 17 00:00:00 2001 From: Alexander Udalov Date: Fri, 9 Jun 2023 16:12:40 +0200 Subject: [PATCH] Kapt+JVM_IR: fix error on delegation to anonymous object In kapt stub generation mode, psi2ir does not generate bodies of declarations. This means that the delegate type was translated into an IrType which is based on a class which is not generated by psi2ir, thus leading to an unbound symbol error. The fix is to avoid using anonymous types for delegate fields in this mode. #KT-59211 Fixed --- .../kotlin/psi2ir/generators/ClassGenerator.kt | 4 +++- .../converter/delegationToAnonymousObject.kt | 3 +++ .../converter/delegationToAnonymousObject.txt | 14 ++++++++++++++ ...lassFileToSourceStubConverterTestGenerated.java | 6 ++++++ ...lassFileToSourceStubConverterTestGenerated.java | 6 ++++++ 5 files changed, 32 insertions(+), 1 deletion(-) create mode 100644 plugins/kapt3/kapt3-compiler/testData/converter/delegationToAnonymousObject.kt create mode 100644 plugins/kapt3/kapt3-compiler/testData/converter/delegationToAnonymousObject.txt diff --git a/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/generators/ClassGenerator.kt b/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/generators/ClassGenerator.kt index f215a5272b6..855c7d96a78 100644 --- a/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/generators/ClassGenerator.kt +++ b/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/generators/ClassGenerator.kt @@ -204,7 +204,9 @@ internal class ClassGenerator( val delegateType = if (context.configuration.generateBodies) { getTypeInferredByFrontendOrFail(ktDelegateExpression) } else { - getTypeInferredByFrontend(ktDelegateExpression) ?: createErrorType(ErrorTypeKind.UNRESOLVED_TYPE, ktDelegateExpression.text) + getTypeInferredByFrontend(ktDelegateExpression).takeUnless { + it?.constructor?.declarationDescriptor?.let(DescriptorUtils::isLocal) == true + } ?: createErrorType(ErrorTypeKind.UNRESOLVED_TYPE, ktDelegateExpression.text) } val superType = getOrFail(BindingContext.TYPE, ktEntry.typeReference!!) diff --git a/plugins/kapt3/kapt3-compiler/testData/converter/delegationToAnonymousObject.kt b/plugins/kapt3/kapt3-compiler/testData/converter/delegationToAnonymousObject.kt new file mode 100644 index 00000000000..5f349495853 --- /dev/null +++ b/plugins/kapt3/kapt3-compiler/testData/converter/delegationToAnonymousObject.kt @@ -0,0 +1,3 @@ +interface I + +class C : I by (object : I {}) diff --git a/plugins/kapt3/kapt3-compiler/testData/converter/delegationToAnonymousObject.txt b/plugins/kapt3/kapt3-compiler/testData/converter/delegationToAnonymousObject.txt new file mode 100644 index 00000000000..55480f9ebb9 --- /dev/null +++ b/plugins/kapt3/kapt3-compiler/testData/converter/delegationToAnonymousObject.txt @@ -0,0 +1,14 @@ +@kotlin.Metadata() +public final class C implements I { + + public C() { + super(); + } +} + +//////////////////// + + +@kotlin.Metadata() +public abstract interface I { +} diff --git a/plugins/kapt3/kapt3-compiler/tests-gen/org/jetbrains/kotlin/kapt3/test/runners/ClassFileToSourceStubConverterTestGenerated.java b/plugins/kapt3/kapt3-compiler/tests-gen/org/jetbrains/kotlin/kapt3/test/runners/ClassFileToSourceStubConverterTestGenerated.java index 8a83b04b400..52855bb194b 100644 --- a/plugins/kapt3/kapt3-compiler/tests-gen/org/jetbrains/kotlin/kapt3/test/runners/ClassFileToSourceStubConverterTestGenerated.java +++ b/plugins/kapt3/kapt3-compiler/tests-gen/org/jetbrains/kotlin/kapt3/test/runners/ClassFileToSourceStubConverterTestGenerated.java @@ -175,6 +175,12 @@ public class ClassFileToSourceStubConverterTestGenerated extends AbstractClassFi runTest("plugins/kapt3/kapt3-compiler/testData/converter/delegationAndCompanionObject.kt"); } + @Test + @TestMetadata("delegationToAnonymousObject.kt") + public void testDelegationToAnonymousObject() throws Exception { + runTest("plugins/kapt3/kapt3-compiler/testData/converter/delegationToAnonymousObject.kt"); + } + @Test @TestMetadata("deprecated.kt") public void testDeprecated() throws Exception { diff --git a/plugins/kapt3/kapt3-compiler/tests-gen/org/jetbrains/kotlin/kapt3/test/runners/IrClassFileToSourceStubConverterTestGenerated.java b/plugins/kapt3/kapt3-compiler/tests-gen/org/jetbrains/kotlin/kapt3/test/runners/IrClassFileToSourceStubConverterTestGenerated.java index 2ea3229bd85..72262727629 100644 --- a/plugins/kapt3/kapt3-compiler/tests-gen/org/jetbrains/kotlin/kapt3/test/runners/IrClassFileToSourceStubConverterTestGenerated.java +++ b/plugins/kapt3/kapt3-compiler/tests-gen/org/jetbrains/kotlin/kapt3/test/runners/IrClassFileToSourceStubConverterTestGenerated.java @@ -175,6 +175,12 @@ public class IrClassFileToSourceStubConverterTestGenerated extends AbstractIrCla runTest("plugins/kapt3/kapt3-compiler/testData/converter/delegationAndCompanionObject.kt"); } + @Test + @TestMetadata("delegationToAnonymousObject.kt") + public void testDelegationToAnonymousObject() throws Exception { + runTest("plugins/kapt3/kapt3-compiler/testData/converter/delegationToAnonymousObject.kt"); + } + @Test @TestMetadata("deprecated.kt") public void testDeprecated() throws Exception {