Use original descriptors to create symbols for callable references

This commit is contained in:
Dmitry Petrov
2017-05-04 12:43:31 +03:00
parent c2601c947f
commit fdb4de355c
8 changed files with 74 additions and 15 deletions
@@ -30,6 +30,7 @@ class IrFunctionReferenceImpl(
endOffset: Int,
type: KotlinType,
override val symbol: IrFunctionSymbol,
override val descriptor: FunctionDescriptor,
typeArguments: Map<TypeParameterDescriptor, KotlinType>?,
origin: IrStatementOrigin? = null
) : IrFunctionReference,
@@ -48,9 +49,7 @@ class IrFunctionReferenceImpl(
descriptor: FunctionDescriptor,
typeArguments: Map<TypeParameterDescriptor, KotlinType>?,
origin: IrStatementOrigin? = null
) : this(startOffset, endOffset, type, createFunctionSymbol(descriptor), typeArguments, origin)
override val descriptor: FunctionDescriptor get() = symbol.descriptor
) : this(startOffset, endOffset, type, createFunctionSymbol(descriptor.original), descriptor, typeArguments, origin)
override fun <R, D> accept(visitor: IrElementVisitor<R, D>, data: D): R =
visitor.visitFunctionReference(this, data)
@@ -409,7 +409,7 @@ open class DeepCopyIrTree : IrElementTransformerVoid() {
return IrFunctionReferenceImpl(
expression.startOffset, expression.endOffset,
expression.type,
newCallee,
newCallee.original,
expression.transformTypeArguments(newCallee),
mapStatementOrigin(expression.origin)
).transformValueArguments(expression)
@@ -418,8 +418,8 @@ open class DeepCopyIrTree : IrElementTransformerVoid() {
override fun visitPropertyReference(expression: IrPropertyReference): IrExpression {
val newProperty = mapPropertyReference(expression.descriptor)
val newFieldSymbol = if (newProperty.getter == null) IrFieldSymbolImpl(newProperty) else null
val newGetterSymbol = newProperty.getter?.let { IrSimpleFunctionSymbolImpl(it) }
val newSetterSymbol = newProperty.setter?.let { IrSimpleFunctionSymbolImpl(it) }
val newGetterSymbol = newProperty.getter?.let { IrSimpleFunctionSymbolImpl(it.original) }
val newSetterSymbol = newProperty.setter?.let { IrSimpleFunctionSymbolImpl(it.original) }
return IrPropertyReferenceImpl(
expression.startOffset, expression.endOffset, expression.type,
newProperty, newFieldSymbol, newGetterSymbol, newSetterSymbol,
@@ -432,8 +432,8 @@ open class DeepCopyIrTree : IrElementTransformerVoid() {
val newLocalDelegatedProperty = mapLocalPropertyReference(expression.descriptor)
val newDelegateDescriptor = mapVariableReference(expression.delegate.descriptor)
val newDelegateSymbol = IrVariableSymbolImpl(newDelegateDescriptor)
val newGetterSymbol = newLocalDelegatedProperty.getter!!.let { IrSimpleFunctionSymbolImpl(it) }
val newSetterSymbol = newLocalDelegatedProperty.setter?.let { IrSimpleFunctionSymbolImpl(it) }
val newGetterSymbol = newLocalDelegatedProperty.getter!!.let { IrSimpleFunctionSymbolImpl(it.original) }
val newSetterSymbol = newLocalDelegatedProperty.setter?.let { IrSimpleFunctionSymbolImpl(it.original) }
return IrLocalDelegatedPropertyReferenceImpl(
expression.startOffset, expression.endOffset, expression.type,
newLocalDelegatedProperty,
@@ -378,6 +378,7 @@ class DeepCopyIrTreeWithSymbols(private val symbolsRemapper: DeepCopySymbolsRema
expression.startOffset, expression.endOffset,
expression.type,
symbolsRemapper.getReferencedFunction(expression.symbol),
expression.descriptor, // TODO substitute referenced descriptor
expression.getTypeArgumentsMap(),
mapStatementOrigin(expression.origin)
).transformValueArguments(expression)