From 7497372f6595c4434411cd0266f6d5641680b662 Mon Sep 17 00:00:00 2001 From: Dmitry Petrov Date: Mon, 28 May 2018 15:23:44 +0300 Subject: [PATCH] IrTypes: IrProperty has no type of its own Within the current scheme, type parameters for IrProperty become type parameters for getter and setter (and, since only extension properties can have type parameters, backing field's type can't depend on type parameters; see also KT-24643). Either properties themselves can have type parameters of their own (for the sake of representing the property type), or properties don't have types and don't have type parameters. --- .../kotlin/psi2ir/generators/ClassGenerator.kt | 12 ++++++------ .../psi2ir/generators/DeclarationGenerator.kt | 1 - .../generators/DelegatedPropertyGenerator.kt | 3 +-- .../psi2ir/generators/PropertyGenerator.kt | 6 ++---- .../kotlin/ir/declarations/IrProperty.kt | 1 - .../ir/declarations/impl/IrPropertyImpl.kt | 18 ++++++------------ .../kotlin/ir/util/DeclarationStubGenerator.kt | 5 +---- .../jetbrains/kotlin/ir/util/DeepCopyIrTree.kt | 1 - .../ir/util/DeepCopyIrTreeWithSymbols.kt | 1 - .../kotlin/ir/util/RenderIrElement.kt | 2 +- 10 files changed, 17 insertions(+), 33 deletions(-) diff --git a/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/generators/ClassGenerator.kt b/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/generators/ClassGenerator.kt index 02bf781452e..2e1930d7bc0 100644 --- a/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/generators/ClassGenerator.kt +++ b/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/generators/ClassGenerator.kt @@ -171,21 +171,21 @@ class ClassGenerator( private fun generateDelegatedProperty( irDelegate: IrField, - delegated: PropertyDescriptor, - overridden: PropertyDescriptor + delegatedDescriptor: PropertyDescriptor, + overriddenDescriptor: PropertyDescriptor ): IrPropertyImpl { val startOffset = irDelegate.startOffset val endOffset = irDelegate.endOffset val irProperty = IrPropertyImpl( startOffset, endOffset, IrDeclarationOrigin.DELEGATED_MEMBER, - false, delegated, delegated.type.toIrType() + false, delegatedDescriptor ) - irProperty.getter = generateDelegatedFunction(irDelegate, delegated.getter!!, overridden.getter!!) + irProperty.getter = generateDelegatedFunction(irDelegate, delegatedDescriptor.getter!!, overriddenDescriptor.getter!!) - if (delegated.isVar) { - irProperty.setter = generateDelegatedFunction(irDelegate, delegated.setter!!, overridden.setter!!) + if (delegatedDescriptor.isVar) { + irProperty.setter = generateDelegatedFunction(irDelegate, delegatedDescriptor.setter!!, overriddenDescriptor.setter!!) } return irProperty } diff --git a/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/generators/DeclarationGenerator.kt b/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/generators/DeclarationGenerator.kt index 5b4285def2e..1af3c781bb5 100644 --- a/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/generators/DeclarationGenerator.kt +++ b/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/generators/DeclarationGenerator.kt @@ -168,7 +168,6 @@ class DeclarationGenerator(override val context: GeneratorContext) : Generator { IrDeclarationOrigin.FAKE_OVERRIDE, false, propertyDescriptor, - propertyDescriptor.type.toIrType(), backingField, propertyDescriptor.getter?.let { generateFakeOverrideFunction(it, ktElement) }, propertyDescriptor.setter?.let { generateFakeOverrideFunction(it, ktElement) } diff --git a/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/generators/DelegatedPropertyGenerator.kt b/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/generators/DelegatedPropertyGenerator.kt index 3e7adc0551f..e08cff3010b 100644 --- a/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/generators/DelegatedPropertyGenerator.kt +++ b/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/generators/DelegatedPropertyGenerator.kt @@ -58,8 +58,7 @@ class DelegatedPropertyGenerator(declarationGenerator: DeclarationGenerator) : D val irProperty = IrPropertyImpl( ktProperty.startOffset, ktProperty.endOffset, IrDeclarationOrigin.DEFINED, isDelegated = true, - descriptor = propertyDescriptor, - type = propertyDescriptor.type.toIrType() + descriptor = propertyDescriptor ).apply { backingField = generateDelegateFieldForProperty(propertyDescriptor, kPropertyType, ktDelegate) } 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 c508c712a65..2f2e2b7035b 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 @@ -48,8 +48,7 @@ class PropertyGenerator(declarationGenerator: DeclarationGenerator) : Declaratio return IrPropertyImpl( ktParameter.startOffset, ktParameter.endOffset, IrDeclarationOrigin.DEFINED, false, - propertyDescriptor, - irPropertyType + propertyDescriptor ).also { irProperty -> irProperty.backingField = generatePropertyBackingField(ktParameter, propertyDescriptor) { @@ -104,8 +103,7 @@ class PropertyGenerator(declarationGenerator: DeclarationGenerator) : Declaratio ktProperty.startOffset, ktProperty.endOffset, IrDeclarationOrigin.DEFINED, false, - propertyDescriptor, - propertyDescriptor.type.toIrType() + propertyDescriptor ).buildWithScope { irProperty -> irProperty.backingField = if (propertyDescriptor.hasBackingField()) diff --git a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/declarations/IrProperty.kt b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/declarations/IrProperty.kt index 6cefa3b149e..531b9d9c423 100644 --- a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/declarations/IrProperty.kt +++ b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/declarations/IrProperty.kt @@ -26,7 +26,6 @@ interface IrProperty : IrDeclaration { override val descriptor: PropertyDescriptor val name: Name - val type: IrType val modality: Modality val visibility: Visibility val isVar: Boolean diff --git a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/declarations/impl/IrPropertyImpl.kt b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/declarations/impl/IrPropertyImpl.kt index 4360b7694bc..a771b251de2 100644 --- a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/declarations/impl/IrPropertyImpl.kt +++ b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/declarations/impl/IrPropertyImpl.kt @@ -20,7 +20,6 @@ import org.jetbrains.kotlin.descriptors.Modality import org.jetbrains.kotlin.descriptors.PropertyDescriptor import org.jetbrains.kotlin.descriptors.Visibility import org.jetbrains.kotlin.ir.declarations.* -import org.jetbrains.kotlin.ir.types.IrType import org.jetbrains.kotlin.ir.util.transform import org.jetbrains.kotlin.ir.visitors.IrElementTransformer import org.jetbrains.kotlin.ir.visitors.IrElementVisitor @@ -34,7 +33,6 @@ class IrPropertyImpl( origin: IrDeclarationOrigin, override val descriptor: PropertyDescriptor, override val name: Name, - override val type: IrType, override val visibility: Visibility, override val modality: Modality, override val isVar: Boolean, @@ -50,11 +48,10 @@ class IrPropertyImpl( endOffset: Int, origin: IrDeclarationOrigin, isDelegated: Boolean, - descriptor: PropertyDescriptor, - type: IrType + descriptor: PropertyDescriptor ) : this( startOffset, endOffset, origin, descriptor, - descriptor.name, type, descriptor.visibility, descriptor.modality, + descriptor.name, descriptor.visibility, descriptor.modality, isVar = descriptor.isVar, isConst = descriptor.isConst, isLateinit = descriptor.isLateInit, @@ -66,9 +63,8 @@ class IrPropertyImpl( startOffset: Int, endOffset: Int, origin: IrDeclarationOrigin, - descriptor: PropertyDescriptor, - type: IrType - ) : this(startOffset, endOffset, origin, descriptor.isDelegated, descriptor, type) + descriptor: PropertyDescriptor + ) : this(startOffset, endOffset, origin, descriptor.isDelegated, descriptor) constructor( startOffset: Int, @@ -76,9 +72,8 @@ class IrPropertyImpl( origin: IrDeclarationOrigin, isDelegated: Boolean, descriptor: PropertyDescriptor, - type: IrType, backingField: IrField? - ) : this(startOffset, endOffset, origin, isDelegated, descriptor, type) { + ) : this(startOffset, endOffset, origin, isDelegated, descriptor) { this.backingField = backingField } @@ -88,11 +83,10 @@ class IrPropertyImpl( origin: IrDeclarationOrigin, isDelegated: Boolean, descriptor: PropertyDescriptor, - type: IrType, backingField: IrField?, getter: IrSimpleFunction?, setter: IrSimpleFunction? - ) : this(startOffset, endOffset, origin, isDelegated, descriptor, type, backingField) { + ) : this(startOffset, endOffset, origin, isDelegated, descriptor, backingField) { this.getter = getter this.setter = setter } diff --git a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/DeclarationStubGenerator.kt b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/DeclarationStubGenerator.kt index fc67753d645..6edebce6b3a 100644 --- a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/DeclarationStubGenerator.kt +++ b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/DeclarationStubGenerator.kt @@ -62,10 +62,7 @@ class DeclarationStubGenerator( } private fun generatePropertyStub(descriptor: PropertyDescriptor): IrProperty = - IrPropertyImpl( - UNDEFINED_OFFSET, UNDEFINED_OFFSET, origin, - descriptor, descriptor.type.toIrType() - ).also { irProperty -> + IrPropertyImpl(UNDEFINED_OFFSET, UNDEFINED_OFFSET, origin, descriptor).also { irProperty -> val getterDescriptor = descriptor.getter if (getterDescriptor == null) { irProperty.backingField = diff --git a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/DeepCopyIrTree.kt b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/DeepCopyIrTree.kt index 0380b862c50..917ee1aca62 100644 --- a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/DeepCopyIrTree.kt +++ b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/DeepCopyIrTree.kt @@ -227,7 +227,6 @@ open class DeepCopyIrTree : IrElementTransformerVoid() { mapDeclarationOrigin(declaration.origin), declaration.isDelegated, mapPropertyDeclaration(declaration.descriptor), - declaration.type, // TODO declaration.backingField?.transform(), declaration.getter?.transform(), declaration.setter?.transform() diff --git a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/DeepCopyIrTreeWithSymbols.kt b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/DeepCopyIrTreeWithSymbols.kt index 5f0e926921f..7f0c9b94244 100644 --- a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/DeepCopyIrTreeWithSymbols.kt +++ b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/DeepCopyIrTreeWithSymbols.kt @@ -160,7 +160,6 @@ open class DeepCopyIrTreeWithSymbols( mapDeclarationOrigin(declaration.origin), declaration.isDelegated, declaration.descriptor, - declaration.type.remapType(), declaration.backingField?.transform(), declaration.getter?.transform(), declaration.setter?.transform() diff --git a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/RenderIrElement.kt b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/RenderIrElement.kt index 8bf7c705fa9..0aaf3244bc2 100644 --- a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/RenderIrElement.kt +++ b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/RenderIrElement.kt @@ -101,7 +101,7 @@ class RenderIrElementVisitor : IrElementVisitor { override fun visitProperty(declaration: IrProperty, data: Nothing?): String = declaration.run { "PROPERTY ${renderOriginIfNonTrivial()}" + - "name:$name type:${type.render()} visibility:$visibility modality:$modality " + + "name:$name visibility:$visibility modality:$modality " + "flags:${renderPropertyFlags()}" }