Property initializers from primary constructor parameters

are generated as property initializer expressions
and should not be repeated in primary constructor.
This commit is contained in:
Dmitry Petrov
2016-09-06 15:48:36 +03:00
committed by Dmitry Petrov
parent a9dbaca473
commit 8fc16345e6
17 changed files with 0 additions and 110 deletions
@@ -165,7 +165,6 @@ class BodyGenerator(val scopeOwner: DeclarationDescriptor, override val context:
val irBlockBody = IrBlockBodyImpl(ktClassOrObject.startOffset, ktClassOrObject.endOffset)
generateSuperConstructorCall(irBlockBody, ktClassOrObject)
generateInitializersForPropertiesDefinedInPrimaryConstructor(irBlockBody, ktClassOrObject)
val classDescriptor = (scopeOwner as ConstructorDescriptor).containingDeclaration
irBlockBody.addStatement(IrInstanceInitializerCallImpl(ktClassOrObject.startOffset, ktClassOrObject.endOffset, classDescriptor))
@@ -280,33 +279,5 @@ class BodyGenerator(val scopeOwner: DeclarationDescriptor, override val context:
enumClassConstructor, enumEntryOrNull)
}
private fun generateInitializersForPropertiesDefinedInPrimaryConstructor(irBlockBody: IrBlockBodyImpl, ktClassOrObject: KtClassOrObject) {
ktClassOrObject.getPrimaryConstructor()?.let { ktPrimaryConstructor ->
for (ktParameter in ktPrimaryConstructor.valueParameters) {
if (ktParameter.hasValOrVar()) {
val propertyDescriptor = getOrFail(BindingContext.PRIMARY_CONSTRUCTOR_PARAMETER, ktParameter)
val valueParameterDescriptor = getOrFail(BindingContext.VALUE_PARAMETER, ktParameter)
irBlockBody.addStatement(
initializePropertyInPrimaryConstructor(
ktParameter, propertyDescriptor,
IrGetVariableImpl(ktParameter.startOffset, ktParameter.endOffset,
valueParameterDescriptor, IrOperator.INITIALIZE_PROPERTY_FROM_PARAMETER)
))
}
}
}
}
private fun initializePropertyInPrimaryConstructor(
ktElement: KtElement,
propertyDescriptor: PropertyDescriptor,
value: IrExpression
): IrExpression {
val thisClass = propertyDescriptor.containingDeclaration as ClassDescriptor
return IrSetBackingFieldImpl(ktElement.startOffset, ktElement.endOffset, propertyDescriptor,
IrThisReferenceImpl(ktElement.startOffset, ktElement.endOffset, thisClass.defaultType, thisClass),
value)
}
}