From 6ca61cf34737a2151588aa95259bb549aeb8275e Mon Sep 17 00:00:00 2001 From: Dmitry Petrov Date: Thu, 21 Mar 2019 13:48:44 +0300 Subject: [PATCH] IR: symbol for IrLocalDelegatedProperty --- .../lower/inline/IrUnboundSymbolReplacer.kt | 9 ++- .../generators/DelegatedPropertyGenerator.kt | 3 +- .../ReflectionReferencesGenerator.kt | 2 +- .../declarations/IrLocalDelegatedProperty.kt | 8 ++- .../impl/IrLocalDelegatedPropertyImpl.kt | 57 ++++++++++++++----- .../ir/expressions/IrCallableReference.kt | 1 + .../IrLocalDelegatedPropertyReferenceImpl.kt | 6 +- .../jetbrains/kotlin/ir/symbols/IrSymbol.kt | 7 +++ .../kotlin/ir/symbols/impl/IrSymbolBase.kt | 7 ++- .../ir/util/DeepCopyIrTreeWithSymbols.kt | 14 ++--- .../kotlin/ir/util/DeepCopySymbolRemapper.kt | 16 +++++- .../kotlin/ir/util/DescriptorsRemapper.kt | 3 +- .../kotlin/ir/util/IrSymbolVisitor.kt | 3 + .../kotlin/ir/util/SymbolRemapper.kt | 2 + .../jetbrains/kotlin/ir/util/SymbolTable.kt | 24 +++++++- 15 files changed, 128 insertions(+), 34 deletions(-) diff --git a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/inline/IrUnboundSymbolReplacer.kt b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/inline/IrUnboundSymbolReplacer.kt index e6d43923d60..ab73c9aee53 100644 --- a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/inline/IrUnboundSymbolReplacer.kt +++ b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/inline/IrUnboundSymbolReplacer.kt @@ -319,6 +319,7 @@ private class IrUnboundSymbolReplacer( } override fun visitLocalDelegatedPropertyReference(expression: IrLocalDelegatedPropertyReference): IrExpression { + val localDelegatedProperty = expression.symbol.replaceOrSame(SymbolTable::referenceLocalDelegatedProperty) val delegate = expression.delegate.replaceOrSame(SymbolTable::referenceVariable) val getter = expression.getter.replace(SymbolTable::referenceSimpleFunction) ?: expression.getter val setter = expression.setter?.replace(SymbolTable::referenceSimpleFunction) ?: expression.setter @@ -329,9 +330,11 @@ private class IrUnboundSymbolReplacer( expression.transformChildrenVoid(this) return with(expression) { - IrLocalDelegatedPropertyReferenceImpl(startOffset, endOffset, type, descriptor, - delegate, getter, setter, origin).also { - + IrLocalDelegatedPropertyReferenceImpl( + startOffset, endOffset, type, + localDelegatedProperty, + delegate, getter, setter, origin + ).also { it.copyArgumentsFrom(this) } } 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 fa2d2916ae4..db4c4dfe0b4 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 @@ -22,7 +22,6 @@ import org.jetbrains.kotlin.ir.builders.irBlockBody import org.jetbrains.kotlin.ir.builders.irGet import org.jetbrains.kotlin.ir.builders.irReturn import org.jetbrains.kotlin.ir.declarations.* -import org.jetbrains.kotlin.ir.declarations.impl.IrLocalDelegatedPropertyImpl import org.jetbrains.kotlin.ir.descriptors.IrLocalDelegatedPropertyDelegateDescriptor import org.jetbrains.kotlin.ir.descriptors.IrLocalDelegatedPropertyDelegateDescriptorImpl import org.jetbrains.kotlin.ir.descriptors.IrPropertyDelegateDescriptor @@ -228,7 +227,7 @@ class DelegatedPropertyGenerator(declarationGenerator: DeclarationGenerator) : D ): IrLocalDelegatedProperty { val kPropertyType = getKPropertyTypeForLocalDelegatedProperty(variableDescriptor) - val irLocalDelegatedProperty = IrLocalDelegatedPropertyImpl( + val irLocalDelegatedProperty = context.symbolTable.declareLocalDelegatedProperty( ktProperty.startOffsetSkippingComments, ktProperty.endOffset, IrDeclarationOrigin.DEFINED, variableDescriptor, variableDescriptor.type.toIrType() diff --git a/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/generators/ReflectionReferencesGenerator.kt b/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/generators/ReflectionReferencesGenerator.kt index 0f31a3b2178..d4671c4d305 100644 --- a/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/generators/ReflectionReferencesGenerator.kt +++ b/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/generators/ReflectionReferencesGenerator.kt @@ -121,7 +121,7 @@ class ReflectionReferencesGenerator(statementGenerator: StatementGenerator) : St return IrLocalDelegatedPropertyReferenceImpl( startOffset, endOffset, type.toIrType(), - variableDescriptor, + context.symbolTable.referenceLocalDelegatedProperty(variableDescriptor), irDelegateSymbol, getterSymbol, setterSymbol, origin ) diff --git a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/declarations/IrLocalDelegatedProperty.kt b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/declarations/IrLocalDelegatedProperty.kt index b31f45d4a0f..3cf06d19b7d 100644 --- a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/declarations/IrLocalDelegatedProperty.kt +++ b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/declarations/IrLocalDelegatedProperty.kt @@ -17,10 +17,16 @@ package org.jetbrains.kotlin.ir.declarations import org.jetbrains.kotlin.descriptors.VariableDescriptorWithAccessors +import org.jetbrains.kotlin.ir.symbols.IrLocalDelegatedPropertySymbol +import org.jetbrains.kotlin.ir.symbols.IrSymbol import org.jetbrains.kotlin.ir.types.IrType -interface IrLocalDelegatedProperty : IrDeclarationWithName { +interface IrLocalDelegatedProperty : + IrDeclarationWithName, + IrSymbolOwner { + override val descriptor: VariableDescriptorWithAccessors + override val symbol: IrLocalDelegatedPropertySymbol val type: IrType val isVar: Boolean diff --git a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/declarations/impl/IrLocalDelegatedPropertyImpl.kt b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/declarations/impl/IrLocalDelegatedPropertyImpl.kt index 1d547c86aec..5bb78268cb2 100644 --- a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/declarations/impl/IrLocalDelegatedPropertyImpl.kt +++ b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/declarations/impl/IrLocalDelegatedPropertyImpl.kt @@ -21,6 +21,8 @@ import org.jetbrains.kotlin.ir.declarations.IrDeclarationOrigin import org.jetbrains.kotlin.ir.declarations.IrFunction import org.jetbrains.kotlin.ir.declarations.IrLocalDelegatedProperty import org.jetbrains.kotlin.ir.declarations.IrVariable +import org.jetbrains.kotlin.ir.symbols.IrLocalDelegatedPropertySymbol +import org.jetbrains.kotlin.ir.symbols.impl.IrLocalDelegatedPropertySymbolImpl import org.jetbrains.kotlin.ir.types.IrType import org.jetbrains.kotlin.ir.visitors.IrElementTransformer import org.jetbrains.kotlin.ir.visitors.IrElementVisitor @@ -30,7 +32,7 @@ class IrLocalDelegatedPropertyImpl( startOffset: Int, endOffset: Int, origin: IrDeclarationOrigin, - override val descriptor: VariableDescriptorWithAccessors, + override val symbol: IrLocalDelegatedPropertySymbol, override val name: Name, override val type: IrType, override val isVar: Boolean @@ -38,6 +40,39 @@ class IrLocalDelegatedPropertyImpl( IrDeclarationBase(startOffset, endOffset, origin), IrLocalDelegatedProperty { + init { + symbol.bind(this) + } + + constructor( + startOffset: Int, + endOffset: Int, + origin: IrDeclarationOrigin, + symbol: IrLocalDelegatedPropertySymbol, + type: IrType + ) : this( + startOffset, endOffset, origin, symbol, + symbol.descriptor.name, + type, + symbol.descriptor.isVar + ) + + @Deprecated("Creates unbound symbol") + constructor( + startOffset: Int, + endOffset: Int, + origin: IrDeclarationOrigin, + descriptor: VariableDescriptorWithAccessors, + name: Name, + type: IrType, + isVar: Boolean + ) : this( + startOffset, endOffset, origin, + IrLocalDelegatedPropertySymbolImpl(descriptor), + name, type, isVar + ) + + @Deprecated("Creates unbound symbol") constructor( startOffset: Int, endOffset: Int, @@ -45,21 +80,12 @@ class IrLocalDelegatedPropertyImpl( descriptor: VariableDescriptorWithAccessors, type: IrType ) : this( - startOffset, endOffset, origin, descriptor, + startOffset, endOffset, origin, + IrLocalDelegatedPropertySymbolImpl(descriptor), descriptor.name, type, descriptor.isVar ) - constructor( - startOffset: Int, - endOffset: Int, - origin: IrDeclarationOrigin, - descriptor: VariableDescriptorWithAccessors, - type: IrType, - delegate: IrVariable - ) : this(startOffset, endOffset, origin, descriptor, type) { - this.delegate = delegate - } - + @Deprecated("Creates unbound symbol") constructor( startOffset: Int, endOffset: Int, @@ -75,8 +101,13 @@ class IrLocalDelegatedPropertyImpl( this.setter = setter } + override val descriptor: VariableDescriptorWithAccessors + get() = symbol.descriptor + override lateinit var delegate: IrVariable + override lateinit var getter: IrFunction + override var setter: IrFunction? = null override fun accept(visitor: IrElementVisitor, data: D): R = diff --git a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/expressions/IrCallableReference.kt b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/expressions/IrCallableReference.kt index 6410a116189..295728f3370 100644 --- a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/expressions/IrCallableReference.kt +++ b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/expressions/IrCallableReference.kt @@ -41,6 +41,7 @@ interface IrPropertyReference : IrCallableReference { interface IrLocalDelegatedPropertyReference : IrCallableReference { override val descriptor: VariableDescriptorWithAccessors + val symbol: IrLocalDelegatedPropertySymbol val delegate: IrVariableSymbol val getter: IrSimpleFunctionSymbol val setter: IrSimpleFunctionSymbol? diff --git a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/expressions/impl/IrLocalDelegatedPropertyReferenceImpl.kt b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/expressions/impl/IrLocalDelegatedPropertyReferenceImpl.kt index 00a3368a870..b3fd9e15a9e 100644 --- a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/expressions/impl/IrLocalDelegatedPropertyReferenceImpl.kt +++ b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/expressions/impl/IrLocalDelegatedPropertyReferenceImpl.kt @@ -19,6 +19,7 @@ package org.jetbrains.kotlin.ir.expressions.impl import org.jetbrains.kotlin.descriptors.VariableDescriptorWithAccessors import org.jetbrains.kotlin.ir.expressions.IrLocalDelegatedPropertyReference import org.jetbrains.kotlin.ir.expressions.IrStatementOrigin +import org.jetbrains.kotlin.ir.symbols.IrLocalDelegatedPropertySymbol import org.jetbrains.kotlin.ir.symbols.IrSimpleFunctionSymbol import org.jetbrains.kotlin.ir.symbols.IrVariableSymbol import org.jetbrains.kotlin.ir.types.IrType @@ -28,7 +29,7 @@ class IrLocalDelegatedPropertyReferenceImpl( startOffset: Int, endOffset: Int, type: IrType, - override val descriptor: VariableDescriptorWithAccessors, + override val symbol: IrLocalDelegatedPropertySymbol, override val delegate: IrVariableSymbol, override val getter: IrSimpleFunctionSymbol, override val setter: IrSimpleFunctionSymbol?, @@ -37,6 +38,9 @@ class IrLocalDelegatedPropertyReferenceImpl( IrNoArgumentsCallableReferenceBase(startOffset, endOffset, type, 0, origin), IrLocalDelegatedPropertyReference { + override val descriptor: VariableDescriptorWithAccessors + get() = symbol.descriptor + override fun accept(visitor: IrElementVisitor, data: D): R = visitor.visitLocalDelegatedPropertyReference(this, data) } \ No newline at end of file diff --git a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/symbols/IrSymbol.kt b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/symbols/IrSymbol.kt index d7ab1e0428b..b0c2f8060f5 100644 --- a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/symbols/IrSymbol.kt +++ b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/symbols/IrSymbol.kt @@ -169,4 +169,11 @@ interface IrPropertySymbol : override fun accept(visitor: IrSymbolVisitor, data: D): R = visitor.visitPropertySymbol(this, data) +} + +interface IrLocalDelegatedPropertySymbol : + IrBindableSymbol { + + override fun accept(visitor: IrSymbolVisitor, data: D): R = + visitor.visitLocalDelegatedPropertySymbol(this, data) } \ No newline at end of file diff --git a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/symbols/impl/IrSymbolBase.kt b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/symbols/impl/IrSymbolBase.kt index ee89c17eca3..b916c767883 100644 --- a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/symbols/impl/IrSymbolBase.kt +++ b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/symbols/impl/IrSymbolBase.kt @@ -102,7 +102,10 @@ class IrReturnableBlockSymbolImpl(descriptor: FunctionDescriptor) : IrBindableSymbolBase(descriptor), IrReturnableBlockSymbol - class IrPropertySymbolImpl(descriptor: PropertyDescriptor) : IrBindableSymbolBase(descriptor), - IrPropertySymbol \ No newline at end of file + IrPropertySymbol + +class IrLocalDelegatedPropertySymbolImpl(descriptor: VariableDescriptorWithAccessors) : + IrBindableSymbolBase(descriptor), + IrLocalDelegatedPropertySymbol \ No newline at end of file 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 5420a55a356..941090134fa 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 @@ -33,7 +33,7 @@ import java.util.* inline fun T.deepCopyWithSymbols( initialParent: IrDeclarationParent? = null, - descriptorRemapper: DescriptorsRemapper = DescriptorsRemapper.DEFAULT + descriptorRemapper: DescriptorsRemapper = DescriptorsRemapper.Default ): T { val symbolRemapper = DeepCopySymbolRemapper(descriptorRemapper) acceptVoid(symbolRemapper) @@ -238,13 +238,13 @@ open class DeepCopyIrTreeWithSymbols( IrLocalDelegatedPropertyImpl( declaration.startOffset, declaration.endOffset, mapDeclarationOrigin(declaration.origin), - declaration.descriptor, // TODO - declaration.type.remapType(), - declaration.delegate.transform(), - declaration.getter.transform(), - declaration.setter?.transform() + symbolRemapper.getDeclaredLocalDelegatedProperty(declaration.symbol), + declaration.type.remapType() ).apply { transformAnnotations(declaration) + delegate = declaration.delegate.transform() + getter = declaration.getter.transform() + setter = declaration.setter?.transform() } override fun visitEnumEntry(declaration: IrEnumEntry): IrEnumEntry = @@ -573,7 +573,7 @@ open class DeepCopyIrTreeWithSymbols( IrLocalDelegatedPropertyReferenceImpl( expression.startOffset, expression.endOffset, expression.type.remapType(), - expression.descriptor, + symbolRemapper.getReferencedLocalDelegatedProperty(expression.symbol), symbolRemapper.getReferencedVariable(expression.delegate), symbolRemapper.getReferencedSimpleFunction(expression.getter), expression.setter?.let { symbolRemapper.getReferencedSimpleFunction(it) }, diff --git a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/DeepCopySymbolRemapper.kt b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/DeepCopySymbolRemapper.kt index 2cc44643cb9..83bb52bb4c9 100644 --- a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/DeepCopySymbolRemapper.kt +++ b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/DeepCopySymbolRemapper.kt @@ -27,8 +27,9 @@ import org.jetbrains.kotlin.ir.visitors.IrElementVisitorVoid import org.jetbrains.kotlin.ir.visitors.acceptChildrenVoid open class DeepCopySymbolRemapper( - private val descriptorsRemapper: DescriptorsRemapper = DescriptorsRemapper.DEFAULT + private val descriptorsRemapper: DescriptorsRemapper = DescriptorsRemapper.Default ) : IrElementVisitorVoid, SymbolRemapper { + private val classes = hashMapOf() private val constructors = hashMapOf() private val enumEntries = hashMapOf() @@ -41,6 +42,7 @@ open class DeepCopySymbolRemapper( private val typeParameters = hashMapOf() private val valueParameters = hashMapOf() private val variables = hashMapOf() + private val localDelegatedProperties = hashMapOf() override fun visitElement(element: IrElement) { element.acceptChildrenVoid(this) @@ -132,6 +134,13 @@ open class DeepCopySymbolRemapper( declaration.acceptChildrenVoid(this) } + override fun visitLocalDelegatedProperty(declaration: IrLocalDelegatedProperty) { + remapSymbol(localDelegatedProperties, declaration) { + IrLocalDelegatedPropertySymbolImpl(descriptorsRemapper.remapDeclaredLocalDelegatedProperty(it.descriptor)) + } + declaration.acceptChildrenVoid(this) + } + override fun visitBlock(expression: IrBlock) { if (expression is IrReturnableBlock) { remapSymbol(returnableBlocks, expression) { @@ -162,11 +171,16 @@ open class DeepCopySymbolRemapper( override fun getDeclaredVariable(symbol: IrVariableSymbol): IrVariableSymbol = variables.getDeclared(symbol) override fun getDeclaredTypeParameter(symbol: IrTypeParameterSymbol): IrTypeParameterSymbol = typeParameters.getDeclared(symbol) override fun getDeclaredValueParameter(symbol: IrValueParameterSymbol): IrValueParameterSymbol = valueParameters.getDeclared(symbol) + override fun getDeclaredLocalDelegatedProperty(symbol: IrLocalDelegatedPropertySymbol): IrLocalDelegatedPropertySymbol = + localDelegatedProperties.getDeclared(symbol) override fun getReferencedClass(symbol: IrClassSymbol): IrClassSymbol = classes.getReferenced(symbol) override fun getReferencedClassOrNull(symbol: IrClassSymbol?): IrClassSymbol? = symbol?.let { classes.getReferenced(it) } override fun getReferencedEnumEntry(symbol: IrEnumEntrySymbol): IrEnumEntrySymbol = enumEntries.getReferenced(symbol) override fun getReferencedVariable(symbol: IrVariableSymbol): IrVariableSymbol = variables.getReferenced(symbol) + override fun getReferencedLocalDelegatedProperty(symbol: IrLocalDelegatedPropertySymbol): IrLocalDelegatedPropertySymbol = + localDelegatedProperties.getReferenced(symbol) + override fun getReferencedField(symbol: IrFieldSymbol): IrFieldSymbol = fields.getReferenced(symbol) override fun getReferencedConstructor(symbol: IrConstructorSymbol): IrConstructorSymbol = constructors.getReferenced(symbol) override fun getReferencedSimpleFunction(symbol: IrSimpleFunctionSymbol): IrSimpleFunctionSymbol = functions.getReferenced(symbol) diff --git a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/DescriptorsRemapper.kt b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/DescriptorsRemapper.kt index 9bc1a3650a5..bbd24a6dd84 100644 --- a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/DescriptorsRemapper.kt +++ b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/DescriptorsRemapper.kt @@ -30,6 +30,7 @@ interface DescriptorsRemapper { fun remapDeclaredTypeParameter(descriptor: TypeParameterDescriptor): TypeParameterDescriptor = descriptor fun remapDeclaredValueParameter(descriptor: ParameterDescriptor): ParameterDescriptor = descriptor fun remapDeclaredVariable(descriptor: VariableDescriptor): VariableDescriptor = descriptor + fun remapDeclaredLocalDelegatedProperty(descriptor: VariableDescriptorWithAccessors): VariableDescriptorWithAccessors = descriptor - object DEFAULT : DescriptorsRemapper + object Default : DescriptorsRemapper } \ No newline at end of file diff --git a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/IrSymbolVisitor.kt b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/IrSymbolVisitor.kt index 2e5ea9d8eae..d58db81b689 100644 --- a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/IrSymbolVisitor.kt +++ b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/IrSymbolVisitor.kt @@ -63,4 +63,7 @@ interface IrSymbolVisitor { fun visitPropertySymbol(symbol: IrPropertySymbol, data: D) = visitSymbol(symbol, data) + + fun visitLocalDelegatedPropertySymbol(symbol: IrLocalDelegatedPropertySymbol, data: D) = + visitSymbol(symbol, data) } \ No newline at end of file diff --git a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/SymbolRemapper.kt b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/SymbolRemapper.kt index c6775581839..5329545070f 100644 --- a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/SymbolRemapper.kt +++ b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/SymbolRemapper.kt @@ -28,12 +28,14 @@ interface SymbolRemapper { fun getDeclaredEnumEntry(symbol: IrEnumEntrySymbol): IrEnumEntrySymbol fun getDeclaredExternalPackageFragment(symbol: IrExternalPackageFragmentSymbol): IrExternalPackageFragmentSymbol fun getDeclaredVariable(symbol: IrVariableSymbol): IrVariableSymbol + fun getDeclaredLocalDelegatedProperty(symbol: IrLocalDelegatedPropertySymbol): IrLocalDelegatedPropertySymbol fun getDeclaredTypeParameter(symbol: IrTypeParameterSymbol): IrTypeParameterSymbol fun getDeclaredValueParameter(symbol: IrValueParameterSymbol): IrValueParameterSymbol fun getReferencedClass(symbol: IrClassSymbol): IrClassSymbol fun getReferencedClassOrNull(symbol: IrClassSymbol?): IrClassSymbol? fun getReferencedEnumEntry(symbol: IrEnumEntrySymbol): IrEnumEntrySymbol fun getReferencedVariable(symbol: IrVariableSymbol): IrVariableSymbol + fun getReferencedLocalDelegatedProperty(symbol: IrLocalDelegatedPropertySymbol): IrLocalDelegatedPropertySymbol fun getReferencedField(symbol: IrFieldSymbol): IrFieldSymbol fun getReferencedConstructor(symbol: IrConstructorSymbol): IrConstructorSymbol fun getReferencedValue(symbol: IrValueSymbol): IrValueSymbol diff --git a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/SymbolTable.kt b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/SymbolTable.kt index ba92a56447b..f730df3f04a 100644 --- a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/SymbolTable.kt +++ b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/SymbolTable.kt @@ -207,7 +207,10 @@ open class SymbolTable : ReferenceSymbolTable { private val scopedTypeParameterSymbolTable = ScopedSymbolTable() private val valueParameterSymbolTable = ScopedSymbolTable() private val variableSymbolTable = ScopedSymbolTable() - private val scopedSymbolTables = listOf(valueParameterSymbolTable, variableSymbolTable, scopedTypeParameterSymbolTable) + private val localDelegatedPropertySymbolTable = + ScopedSymbolTable() + private val scopedSymbolTables = + listOf(valueParameterSymbolTable, variableSymbolTable, scopedTypeParameterSymbolTable, localDelegatedPropertySymbolTable) fun referenceExternalPackageFragment(descriptor: PackageFragmentDescriptor) = externalPackageFragmentTable.referenced(descriptor) { IrExternalPackageFragmentSymbolImpl(descriptor) } @@ -220,7 +223,6 @@ open class SymbolTable : ReferenceSymbolTable { ) } - fun declareAnonymousInitializer( startOffset: Int, endOffset: Int, @@ -467,6 +469,24 @@ open class SymbolTable : ReferenceSymbolTable { val unboundVariables: Set get() = variableSymbolTable.unboundSymbols + fun declareLocalDelegatedProperty( + startOffset: Int, + endOffset: Int, + origin: IrDeclarationOrigin, + descriptor: VariableDescriptorWithAccessors, + type: IrType + ): IrLocalDelegatedProperty = + localDelegatedPropertySymbolTable.declareLocal( + descriptor, + { IrLocalDelegatedPropertySymbolImpl(descriptor) }, + { IrLocalDelegatedPropertyImpl(startOffset, endOffset, origin, it, type) } + ) + + fun referenceLocalDelegatedProperty(descriptor: VariableDescriptorWithAccessors) = + localDelegatedPropertySymbolTable.referenced(descriptor) { + throw AssertionError("Undefined local delegated property referenced: $descriptor") + } + override fun enterScope(owner: DeclarationDescriptor) { scopedSymbolTables.forEach { it.enterScope(owner) } }