KT-16905 Wrong IR for call to inner class constructor through typealias

This commit is contained in:
Dmitry Petrov
2017-03-17 14:44:16 +03:00
parent d05de88e3e
commit 64013171e8
4 changed files with 66 additions and 10 deletions
@@ -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 ->
+9
View File
@@ -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()
+29
View File
@@ -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 '<receiver: Outer>' 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 '<receiver: Outer>' 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
@@ -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");