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,
|
isSafe: Boolean,
|
||||||
isAssignmentReceiver: Boolean = false
|
isAssignmentReceiver: Boolean = false
|
||||||
) : CallReceiver {
|
) : CallReceiver {
|
||||||
val dispatchReceiverValue: IntermediateValue? =
|
val dispatchReceiverValue: IntermediateValue?
|
||||||
if (calleeDescriptor is ImportedFromObjectCallableDescriptor<*>) {
|
val extensionReceiverValue: IntermediateValue?
|
||||||
assert(dispatchReceiver == null) {
|
when (calleeDescriptor) {
|
||||||
"Call for member imported from object $calleeDescriptor has non-null dispatch receiver $dispatchReceiver"
|
is ImportedFromObjectCallableDescriptor<*> -> {
|
||||||
}
|
assert(dispatchReceiver == null) {
|
||||||
generateReceiverForCalleeImportedFromObject(ktDefaultElement.startOffset, ktDefaultElement.endOffset, calleeDescriptor)
|
"Call for member imported from object $calleeDescriptor has non-null dispatch receiver $dispatchReceiver"
|
||||||
}
|
}
|
||||||
else
|
dispatchReceiverValue = generateReceiverForCalleeImportedFromObject(ktDefaultElement.startOffset, ktDefaultElement.endOffset, calleeDescriptor)
|
||||||
generateReceiverOrNull(ktDefaultElement, dispatchReceiver)
|
extensionReceiverValue = generateReceiverOrNull(ktDefaultElement, extensionReceiver)
|
||||||
|
}
|
||||||
val 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 {
|
return when {
|
||||||
!isSafe ->
|
!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);
|
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")
|
@TestMetadata("literals.kt")
|
||||||
public void testLiterals() throws Exception {
|
public void testLiterals() throws Exception {
|
||||||
String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/ir/irText/expressions/literals.kt");
|
String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/ir/irText/expressions/literals.kt");
|
||||||
|
|||||||
Reference in New Issue
Block a user