From c066b7843c92fb0981809ce4a14060f4054bff5f Mon Sep 17 00:00:00 2001 From: Ilya Chernikov Date: Fri, 8 Jan 2021 17:07:06 +0100 Subject: [PATCH] Fix provided properties generation in ir scripting --- .../kotlin/psi2ir/generators/CallGenerator.kt | 3 ++- .../psi2ir/generators/PropertyGenerator.kt | 26 +++++++++++++++---- .../psi2ir/generators/ScriptGenerator.kt | 2 +- 3 files changed, 24 insertions(+), 7 deletions(-) diff --git a/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/generators/CallGenerator.kt b/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/generators/CallGenerator.kt index fc847e6e90c..843f3017926 100644 --- a/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/generators/CallGenerator.kt +++ b/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/generators/CallGenerator.kt @@ -190,7 +190,8 @@ class CallGenerator(statementGenerator: StatementGenerator) : StatementGenerator return if (getMethodDescriptor == null) { call.callReceiver.call { dispatchReceiverValue, _ -> val superQualifierSymbol = (call.superQualifier ?: descriptor.containingDeclaration as? ClassDescriptor)?.let { - context.symbolTable.referenceClass(it) + if (it is ScriptDescriptor) null // otherwise it creates a reference to script as class; TODO: check if correct + else context.symbolTable.referenceClass(it) } val fieldSymbol = context.symbolTable.referenceField(descriptor.resolveFakeOverride().original) IrGetFieldImpl( diff --git a/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/generators/PropertyGenerator.kt b/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/generators/PropertyGenerator.kt index 8a44f3a4b03..7f47b167afc 100644 --- a/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/generators/PropertyGenerator.kt +++ b/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/generators/PropertyGenerator.kt @@ -19,10 +19,13 @@ package org.jetbrains.kotlin.psi2ir.generators import org.jetbrains.kotlin.descriptors.* import org.jetbrains.kotlin.descriptors.annotations.Annotations import org.jetbrains.kotlin.descriptors.impl.PropertyGetterDescriptorImpl +import org.jetbrains.kotlin.descriptors.impl.PropertySetterDescriptorImpl +import org.jetbrains.kotlin.descriptors.impl.ValueParameterDescriptorImpl import org.jetbrains.kotlin.ir.declarations.* import org.jetbrains.kotlin.ir.expressions.IrExpressionBody import org.jetbrains.kotlin.ir.expressions.IrStatementOrigin import org.jetbrains.kotlin.ir.expressions.impl.IrGetValueImpl +import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.psi.* import org.jetbrains.kotlin.psi.psiUtil.endOffset import org.jetbrains.kotlin.psi.psiUtil.startOffsetSkippingComments @@ -96,8 +99,7 @@ class PropertyGenerator(declarationGenerator: DeclarationGenerator) : Declaratio irProperty.backingField = generatePropertyBackingField(ktDeclarationContainer, propertyDescriptor, generateInitializer) val getter = propertyDescriptor.getter - ?: if (generateSyntheticAccessors) - // TODO: check if this is the correct way to generate synthetic accessor + ?: if (generateSyntheticAccessors) { PropertyGetterDescriptorImpl( propertyDescriptor, Annotations.EMPTY, Modality.FINAL, DescriptorVisibilities.PUBLIC, false, false, false, @@ -105,14 +107,28 @@ class PropertyGenerator(declarationGenerator: DeclarationGenerator) : Declaratio ).apply { initialize(propertyDescriptor.type) } - else throw AssertionError("Property declared in primary constructor has no getter: $propertyDescriptor") + } else + throw AssertionError("Property declared in primary constructor has no getter: $propertyDescriptor") irProperty.getter = FunctionGenerator(declarationGenerator).generateDefaultAccessorForPrimaryConstructorParameter(getter, ktDeclarationContainer) if (propertyDescriptor.isVar) { val setter = propertyDescriptor.setter - // TODO: implement setter descriptor generation, if needed - ?: throw AssertionError("Property declared in primary constructor has no setter: $propertyDescriptor") + ?: if (generateSyntheticAccessors) { + PropertySetterDescriptorImpl( + propertyDescriptor, + Annotations.EMPTY, Modality.FINAL, DescriptorVisibilities.PUBLIC, false, false, false, + CallableMemberDescriptor.Kind.SYNTHESIZED, null, propertyDescriptor.source + ).apply { + val setterValueParameter = ValueParameterDescriptorImpl( + this, null, 0, Annotations.EMPTY, Name.identifier("value"), propertyDescriptor.type, + declaresDefaultValue = false, isCrossinline = false, isNoinline = false, + varargElementType = null, source = SourceElement.NO_SOURCE + ) + initialize(setterValueParameter) + } + } else + throw AssertionError("Property declared in primary constructor has no setter: $propertyDescriptor") irProperty.setter = FunctionGenerator(declarationGenerator).generateDefaultAccessorForPrimaryConstructorParameter(setter, ktDeclarationContainer) } diff --git a/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/generators/ScriptGenerator.kt b/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/generators/ScriptGenerator.kt index 3927ab63014..623617e6a75 100644 --- a/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/generators/ScriptGenerator.kt +++ b/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/generators/ScriptGenerator.kt @@ -111,7 +111,7 @@ class ScriptGenerator(declarationGenerator: DeclarationGenerator) : DeclarationG startOffset, endOffset, IrDeclarationOrigin.SCRIPT_PROVIDED_PROPERTY, parameter, type ) val irProperty = - PropertyGenerator(declarationGenerator).generateSyntheticProperty(ktScript, providedProperty, valueParameter) + PropertyGenerator(declarationGenerator).generateSyntheticProperty(ktScript, providedProperty, valueParameter, generateSyntheticAccessors = true) irProperty.origin = IrDeclarationOrigin.SCRIPT_PROVIDED_PROPERTY irScript.statements += irProperty valueParameter to irProperty.symbol