IR: symbol for IrLocalDelegatedProperty

This commit is contained in:
Dmitry Petrov
2019-03-21 13:48:44 +03:00
parent aa6ba1cd4a
commit 6ca61cf347
15 changed files with 128 additions and 34 deletions
@@ -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)
}
}
@@ -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()
@@ -121,7 +121,7 @@ class ReflectionReferencesGenerator(statementGenerator: StatementGenerator) : St
return IrLocalDelegatedPropertyReferenceImpl(
startOffset, endOffset, type.toIrType(),
variableDescriptor,
context.symbolTable.referenceLocalDelegatedProperty(variableDescriptor),
irDelegateSymbol, getterSymbol, setterSymbol,
origin
)
@@ -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
@@ -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 <R, D> accept(visitor: IrElementVisitor<R, D>, data: D): R =
@@ -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?
@@ -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 <R, D> accept(visitor: IrElementVisitor<R, D>, data: D): R =
visitor.visitLocalDelegatedPropertyReference(this, data)
}
@@ -169,4 +169,11 @@ interface IrPropertySymbol :
override fun <D, R> accept(visitor: IrSymbolVisitor<R, D>, data: D): R =
visitor.visitPropertySymbol(this, data)
}
interface IrLocalDelegatedPropertySymbol :
IrBindableSymbol<VariableDescriptorWithAccessors, IrLocalDelegatedProperty> {
override fun <D, R> accept(visitor: IrSymbolVisitor<R, D>, data: D): R =
visitor.visitLocalDelegatedPropertySymbol(this, data)
}
@@ -102,7 +102,10 @@ class IrReturnableBlockSymbolImpl(descriptor: FunctionDescriptor) :
IrBindableSymbolBase<FunctionDescriptor, IrReturnableBlock>(descriptor),
IrReturnableBlockSymbol
class IrPropertySymbolImpl(descriptor: PropertyDescriptor) :
IrBindableSymbolBase<PropertyDescriptor, IrProperty>(descriptor),
IrPropertySymbol
IrPropertySymbol
class IrLocalDelegatedPropertySymbolImpl(descriptor: VariableDescriptorWithAccessors) :
IrBindableSymbolBase<VariableDescriptorWithAccessors, IrLocalDelegatedProperty>(descriptor),
IrLocalDelegatedPropertySymbol
@@ -33,7 +33,7 @@ import java.util.*
inline fun <reified T : IrElement> 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) },
@@ -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<IrClassSymbol, IrClassSymbol>()
private val constructors = hashMapOf<IrConstructorSymbol, IrConstructorSymbol>()
private val enumEntries = hashMapOf<IrEnumEntrySymbol, IrEnumEntrySymbol>()
@@ -41,6 +42,7 @@ open class DeepCopySymbolRemapper(
private val typeParameters = hashMapOf<IrTypeParameterSymbol, IrTypeParameterSymbol>()
private val valueParameters = hashMapOf<IrValueParameterSymbol, IrValueParameterSymbol>()
private val variables = hashMapOf<IrVariableSymbol, IrVariableSymbol>()
private val localDelegatedProperties = hashMapOf<IrLocalDelegatedPropertySymbol, IrLocalDelegatedPropertySymbol>()
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)
@@ -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
}
@@ -63,4 +63,7 @@ interface IrSymbolVisitor<out R, in D> {
fun visitPropertySymbol(symbol: IrPropertySymbol, data: D) =
visitSymbol(symbol, data)
fun visitLocalDelegatedPropertySymbol(symbol: IrLocalDelegatedPropertySymbol, data: D) =
visitSymbol(symbol, data)
}
@@ -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
@@ -207,7 +207,10 @@ open class SymbolTable : ReferenceSymbolTable {
private val scopedTypeParameterSymbolTable = ScopedSymbolTable<TypeParameterDescriptor, IrTypeParameter, IrTypeParameterSymbol>()
private val valueParameterSymbolTable = ScopedSymbolTable<ParameterDescriptor, IrValueParameter, IrValueParameterSymbol>()
private val variableSymbolTable = ScopedSymbolTable<VariableDescriptor, IrVariable, IrVariableSymbol>()
private val scopedSymbolTables = listOf(valueParameterSymbolTable, variableSymbolTable, scopedTypeParameterSymbolTable)
private val localDelegatedPropertySymbolTable =
ScopedSymbolTable<VariableDescriptorWithAccessors, IrLocalDelegatedProperty, IrLocalDelegatedPropertySymbol>()
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<IrVariableSymbol> 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) }
}