KT-16905 Wrong IR for call to inner class constructor through typealias
This commit is contained in:
+22
-10
@@ -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 ->
|
||||
|
||||
@@ -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()
|
||||
@@ -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");
|
||||
|
||||
Reference in New Issue
Block a user