From 64013171e8b3c9f9c5aab53a6c1028d17153d468 Mon Sep 17 00:00:00 2001 From: Dmitry Petrov Date: Fri, 17 Mar 2017 14:44:16 +0300 Subject: [PATCH] KT-16905 Wrong IR for call to inner class constructor through typealias --- .../generators/ArgumentsGenerationUtils.kt | 32 +++++++++++++------ .../testData/ir/irText/expressions/kt16905.kt | 9 ++++++ .../ir/irText/expressions/kt16905.txt | 29 +++++++++++++++++ .../kotlin/ir/IrTextTestCaseGenerated.java | 6 ++++ 4 files changed, 66 insertions(+), 10 deletions(-) create mode 100644 compiler/testData/ir/irText/expressions/kt16905.kt create mode 100644 compiler/testData/ir/irText/expressions/kt16905.txt diff --git a/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/generators/ArgumentsGenerationUtils.kt b/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/generators/ArgumentsGenerationUtils.kt index ca5eb33f061..2c2b29aa9a7 100644 --- a/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/generators/ArgumentsGenerationUtils.kt +++ b/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/generators/ArgumentsGenerationUtils.kt @@ -109,17 +109,29 @@ fun StatementGenerator.generateCallReceiver( isSafe: Boolean, isAssignmentReceiver: Boolean = false ) : CallReceiver { - val dispatchReceiverValue: IntermediateValue? = - if (calleeDescriptor is ImportedFromObjectCallableDescriptor<*>) { - assert(dispatchReceiver == null) { - "Call for member imported from object $calleeDescriptor has non-null dispatch receiver $dispatchReceiver" - } - generateReceiverForCalleeImportedFromObject(ktDefaultElement.startOffset, ktDefaultElement.endOffset, calleeDescriptor) + val dispatchReceiverValue: IntermediateValue? + val extensionReceiverValue: IntermediateValue? + when (calleeDescriptor) { + is ImportedFromObjectCallableDescriptor<*> -> { + assert(dispatchReceiver == null) { + "Call for member imported from object $calleeDescriptor has non-null dispatch receiver $dispatchReceiver" } - else - generateReceiverOrNull(ktDefaultElement, dispatchReceiver) - - val extensionReceiverValue = generateReceiverOrNull(ktDefaultElement, extensionReceiver) + dispatchReceiverValue = generateReceiverForCalleeImportedFromObject(ktDefaultElement.startOffset, ktDefaultElement.endOffset, calleeDescriptor) + extensionReceiverValue = generateReceiverOrNull(ktDefaultElement, extensionReceiver) + } + is TypeAliasConstructorDescriptor -> { + assert(!(dispatchReceiver != null && extensionReceiver != null)) { + "Type alias constructor call for $calleeDescriptor can't have both dispatch receiver and extension receiver: " + + "$dispatchReceiver, $extensionReceiver" + } + dispatchReceiverValue = generateReceiverOrNull(ktDefaultElement, extensionReceiver ?: dispatchReceiver) + extensionReceiverValue = null + } + else -> { + dispatchReceiverValue = generateReceiverOrNull(ktDefaultElement, dispatchReceiver) + extensionReceiverValue = generateReceiverOrNull(ktDefaultElement, extensionReceiver) + } + } return when { !isSafe -> diff --git a/compiler/testData/ir/irText/expressions/kt16905.kt b/compiler/testData/ir/irText/expressions/kt16905.kt new file mode 100644 index 00000000000..bc8cbbcf943 --- /dev/null +++ b/compiler/testData/ir/irText/expressions/kt16905.kt @@ -0,0 +1,9 @@ +class Outer { + open inner class Inner + inner class InnerDerived0 : Inner() + inner class InnerDerived1 : OI() +} + +typealias OI = Outer.Inner + +fun test() = Outer().OI() \ No newline at end of file diff --git a/compiler/testData/ir/irText/expressions/kt16905.txt b/compiler/testData/ir/irText/expressions/kt16905.txt new file mode 100644 index 00000000000..c048790e639 --- /dev/null +++ b/compiler/testData/ir/irText/expressions/kt16905.txt @@ -0,0 +1,29 @@ +FILE /kt16905.kt + CLASS CLASS Outer + CONSTRUCTOR public constructor Outer() + BLOCK_BODY + DELEGATING_CONSTRUCTOR_CALL 'constructor Any()' + INSTANCE_INITIALIZER_CALL classDescriptor='Outer' + CLASS CLASS Inner + CONSTRUCTOR public constructor Inner() + BLOCK_BODY + DELEGATING_CONSTRUCTOR_CALL 'constructor Any()' + INSTANCE_INITIALIZER_CALL classDescriptor='Inner' + CLASS CLASS InnerDerived0 + CONSTRUCTOR public constructor InnerDerived0() + BLOCK_BODY + DELEGATING_CONSTRUCTOR_CALL 'constructor Inner()' + $this: GET_VAR '' type=Outer origin=null + INSTANCE_INITIALIZER_CALL classDescriptor='InnerDerived0' + CLASS CLASS InnerDerived1 + CONSTRUCTOR public constructor InnerDerived1() + BLOCK_BODY + DELEGATING_CONSTRUCTOR_CALL 'constructor Inner()' + $this: GET_VAR '' type=Outer origin=null + INSTANCE_INITIALIZER_CALL classDescriptor='InnerDerived1' + TYPEALIAS typealias OI = Outer.Inner type=Outer.Inner + FUN public fun test(): Outer.Inner + BLOCK_BODY + RETURN type=kotlin.Nothing from='test(): Outer.Inner' + CALL 'constructor Inner()' type=Outer.Inner origin=null + $this: CALL 'constructor Outer()' type=Outer origin=null diff --git a/compiler/tests/org/jetbrains/kotlin/ir/IrTextTestCaseGenerated.java b/compiler/tests/org/jetbrains/kotlin/ir/IrTextTestCaseGenerated.java index 959d1b6f7e2..6a249e40f2c 100644 --- a/compiler/tests/org/jetbrains/kotlin/ir/IrTextTestCaseGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/ir/IrTextTestCaseGenerated.java @@ -608,6 +608,12 @@ public class IrTextTestCaseGenerated extends AbstractIrTextTestCase { doTest(fileName); } + @TestMetadata("kt16905.kt") + public void testKt16905() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/ir/irText/expressions/kt16905.kt"); + doTest(fileName); + } + @TestMetadata("literals.kt") public void testLiterals() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/ir/irText/expressions/literals.kt");