KT-16669 Exception in PSI2IR on type alias constructor in supertypes list
This commit is contained in:
@@ -154,7 +154,7 @@ class BodyGenerator(val scopeOwner: DeclarationDescriptor, override val context:
|
|||||||
generateEnumSuperConstructorCall(irBlockBody, ktConstructor)
|
generateEnumSuperConstructorCall(irBlockBody, ktConstructor)
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
generateAnySuperConstructorCAll(irBlockBody, ktConstructor)
|
generateAnySuperConstructorCall(irBlockBody, ktConstructor)
|
||||||
}
|
}
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
@@ -230,12 +230,12 @@ class BodyGenerator(val scopeOwner: DeclarationDescriptor, override val context:
|
|||||||
// Thus, super class should be Any.
|
// Thus, super class should be Any.
|
||||||
val superClass = classDescriptor.getSuperClassOrAny()
|
val superClass = classDescriptor.getSuperClassOrAny()
|
||||||
assert(KotlinBuiltIns.isAny(superClass)) { "$classDescriptor: Super class should be any: $superClass" }
|
assert(KotlinBuiltIns.isAny(superClass)) { "$classDescriptor: Super class should be any: $superClass" }
|
||||||
generateAnySuperConstructorCAll(irBlockBody, ktClassOrObject)
|
generateAnySuperConstructorCall(irBlockBody, ktClassOrObject)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun generateAnySuperConstructorCAll(irBlockBody: IrBlockBodyImpl, ktElement: KtElement) {
|
private fun generateAnySuperConstructorCall(irBlockBody: IrBlockBodyImpl, ktElement: KtElement) {
|
||||||
val anyConstructor = context.builtIns.any.constructors.single()
|
val anyConstructor = context.builtIns.any.constructors.single()
|
||||||
irBlockBody.statements.add(IrDelegatingConstructorCallImpl(ktElement.startOffset, ktElement.endOffset, anyConstructor, null))
|
irBlockBody.statements.add(IrDelegatingConstructorCallImpl(ktElement.startOffset, ktElement.endOffset, anyConstructor, null))
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -19,6 +19,7 @@ package org.jetbrains.kotlin.psi2ir.generators
|
|||||||
import org.jetbrains.kotlin.descriptors.*
|
import org.jetbrains.kotlin.descriptors.*
|
||||||
import org.jetbrains.kotlin.descriptors.impl.LocalVariableDescriptor
|
import org.jetbrains.kotlin.descriptors.impl.LocalVariableDescriptor
|
||||||
import org.jetbrains.kotlin.descriptors.impl.SyntheticFieldDescriptor
|
import org.jetbrains.kotlin.descriptors.impl.SyntheticFieldDescriptor
|
||||||
|
import org.jetbrains.kotlin.descriptors.impl.TypeAliasConstructorDescriptor
|
||||||
import org.jetbrains.kotlin.ir.expressions.IrExpression
|
import org.jetbrains.kotlin.ir.expressions.IrExpression
|
||||||
import org.jetbrains.kotlin.ir.expressions.IrMemberAccessExpression
|
import org.jetbrains.kotlin.ir.expressions.IrMemberAccessExpression
|
||||||
import org.jetbrains.kotlin.ir.expressions.IrStatementOrigin
|
import org.jetbrains.kotlin.ir.expressions.IrStatementOrigin
|
||||||
@@ -105,8 +106,13 @@ class CallGenerator(statementGenerator: StatementGenerator): StatementGeneratorE
|
|||||||
IrGetValueImpl(startOffset, endOffset, descriptor, origin)
|
IrGetValueImpl(startOffset, endOffset, descriptor, origin)
|
||||||
|
|
||||||
fun generateDelegatingConstructorCall(startOffset: Int, endOffset: Int, call: CallBuilder) : IrExpression {
|
fun generateDelegatingConstructorCall(startOffset: Int, endOffset: Int, call: CallBuilder) : IrExpression {
|
||||||
val descriptor = call.descriptor
|
val descriptor = call.descriptor.let { callDescriptor ->
|
||||||
if (descriptor !is ClassConstructorDescriptor) throw AssertionError("Class constructor expected: $descriptor")
|
when (callDescriptor) {
|
||||||
|
is ClassConstructorDescriptor -> callDescriptor
|
||||||
|
is TypeAliasConstructorDescriptor -> callDescriptor.underlyingConstructorDescriptor
|
||||||
|
else -> throw AssertionError("Unexpected constructor descriptor: $callDescriptor")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
return call.callReceiver.call { dispatchReceiver, extensionReceiver ->
|
return call.callReceiver.call { dispatchReceiver, extensionReceiver ->
|
||||||
val irCall = IrDelegatingConstructorCallImpl(startOffset, endOffset, descriptor, getTypeArguments(call.original))
|
val irCall = IrDelegatingConstructorCallImpl(startOffset, endOffset, descriptor, getTypeArguments(call.original))
|
||||||
|
|||||||
+7
@@ -0,0 +1,7 @@
|
|||||||
|
open class Cell<T>(val value: T)
|
||||||
|
|
||||||
|
typealias CT<T> = Cell<T>
|
||||||
|
typealias CStr = Cell<String>
|
||||||
|
|
||||||
|
class C1 : CT<String>("O")
|
||||||
|
class C2 : CStr("K")
|
||||||
+31
@@ -0,0 +1,31 @@
|
|||||||
|
FILE /delegatingConstructorCallToTypeAliasConstructor.kt
|
||||||
|
CLASS CLASS Cell
|
||||||
|
CONSTRUCTOR public constructor Cell<T>(value: T)
|
||||||
|
BLOCK_BODY
|
||||||
|
DELEGATING_CONSTRUCTOR_CALL 'constructor Any()'
|
||||||
|
INSTANCE_INITIALIZER_CALL classDescriptor='Cell'
|
||||||
|
PROPERTY public final val value: T
|
||||||
|
FIELD PROPERTY_BACKING_FIELD public final val value: T
|
||||||
|
EXPRESSION_BODY
|
||||||
|
GET_VAR 'value-parameter value: T' type=T origin=INITIALIZE_PROPERTY_FROM_PARAMETER
|
||||||
|
FUN DEFAULT_PROPERTY_ACCESSOR public final fun <get-value>(): T
|
||||||
|
BLOCK_BODY
|
||||||
|
RETURN type=kotlin.Nothing from='<get-value>(): T'
|
||||||
|
GET_FIELD 'value: T' type=T origin=null
|
||||||
|
receiver: GET_VAR '<receiver: Cell>' type=Cell<T> origin=null
|
||||||
|
TYPEALIAS typealias CT = Cell<T> type=Cell<T>
|
||||||
|
TYPEALIAS typealias CStr = Cell<String> type=Cell<kotlin.String>
|
||||||
|
CLASS CLASS C1
|
||||||
|
CONSTRUCTOR public constructor C1()
|
||||||
|
BLOCK_BODY
|
||||||
|
DELEGATING_CONSTRUCTOR_CALL 'constructor Cell(T)'
|
||||||
|
value: TYPE_OP type=T origin=IMPLICIT_CAST typeOperand=T
|
||||||
|
CONST String type=kotlin.String value='O'
|
||||||
|
INSTANCE_INITIALIZER_CALL classDescriptor='C1'
|
||||||
|
CLASS CLASS C2
|
||||||
|
CONSTRUCTOR public constructor C2()
|
||||||
|
BLOCK_BODY
|
||||||
|
DELEGATING_CONSTRUCTOR_CALL 'constructor Cell(T)'
|
||||||
|
value: TYPE_OP type=T origin=IMPLICIT_CAST typeOperand=T
|
||||||
|
CONST String type=kotlin.String value='K'
|
||||||
|
INSTANCE_INITIALIZER_CALL classDescriptor='C2'
|
||||||
@@ -86,6 +86,12 @@ public class IrTextTestCaseGenerated extends AbstractIrTextTestCase {
|
|||||||
doTest(fileName);
|
doTest(fileName);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@TestMetadata("delegatingConstructorCallToTypeAliasConstructor.kt")
|
||||||
|
public void testDelegatingConstructorCallToTypeAliasConstructor() throws Exception {
|
||||||
|
String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/ir/irText/classes/delegatingConstructorCallToTypeAliasConstructor.kt");
|
||||||
|
doTest(fileName);
|
||||||
|
}
|
||||||
|
|
||||||
@TestMetadata("delegatingConstructorCallsInSecondaryConstructors.kt")
|
@TestMetadata("delegatingConstructorCallsInSecondaryConstructors.kt")
|
||||||
public void testDelegatingConstructorCallsInSecondaryConstructors() throws Exception {
|
public void testDelegatingConstructorCallsInSecondaryConstructors() throws Exception {
|
||||||
String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/ir/irText/classes/delegatingConstructorCallsInSecondaryConstructors.kt");
|
String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/ir/irText/classes/delegatingConstructorCallsInSecondaryConstructors.kt");
|
||||||
|
|||||||
Reference in New Issue
Block a user