Use original descriptors to create symbols for callable references
This commit is contained in:
+2
-2
@@ -37,7 +37,7 @@ class LocalFunctionGenerator(statementGenerator: StatementGenerator) : Statement
|
||||
irBlock.statements.add(
|
||||
IrFunctionReferenceImpl(
|
||||
ktLambda.startOffset, ktLambda.endOffset, lambdaExpressionType,
|
||||
irLambdaFunction.symbol,
|
||||
irLambdaFunction.symbol, irLambdaFunction.symbol.descriptor,
|
||||
null, IrStatementOrigin.LAMBDA
|
||||
)
|
||||
)
|
||||
@@ -59,7 +59,7 @@ class LocalFunctionGenerator(statementGenerator: StatementGenerator) : Statement
|
||||
irBlock.statements.add(
|
||||
IrFunctionReferenceImpl(
|
||||
ktFun.startOffset, ktFun.endOffset, funExpressionType,
|
||||
irFun.symbol,
|
||||
irFun.symbol, irFun.symbol.descriptor,
|
||||
null, IrStatementOrigin.ANONYMOUS_FUNCTION
|
||||
)
|
||||
)
|
||||
|
||||
+7
-5
@@ -42,7 +42,7 @@ class ReflectionReferencesGenerator(statementGenerator: StatementGenerator) : St
|
||||
}
|
||||
else {
|
||||
val typeConstructorDeclaration = lhs.type.constructor.declarationDescriptor
|
||||
val typeClass = typeConstructorDeclaration as? ClassifierDescriptor ?:
|
||||
val typeClass = typeConstructorDeclaration ?:
|
||||
throw AssertionError("Unexpected type constructor for ${lhs.type}: $typeConstructorDeclaration")
|
||||
IrClassReferenceImpl(ktClassLiteral.startOffset, ktClassLiteral.endOffset, resultType,
|
||||
context.symbolTable.referenceClassifier(typeClass))
|
||||
@@ -83,7 +83,8 @@ class ReflectionReferencesGenerator(statementGenerator: StatementGenerator) : St
|
||||
is FunctionDescriptor ->
|
||||
generateFunctionReference(
|
||||
startOffset, endOffset, type,
|
||||
context.symbolTable.referenceFunction(callableDescriptor),
|
||||
context.symbolTable.referenceFunction(callableDescriptor.original),
|
||||
callableDescriptor,
|
||||
typeArguments,
|
||||
origin
|
||||
)
|
||||
@@ -128,8 +129,8 @@ class ReflectionReferencesGenerator(statementGenerator: StatementGenerator) : St
|
||||
val setterDescriptor = propertyDescriptor.setter
|
||||
|
||||
val fieldSymbol = if (getterDescriptor == null) context.symbolTable.referenceField(propertyDescriptor) else null
|
||||
val getterSymbol = getterDescriptor?.let { context.symbolTable.referenceFunction(it) }
|
||||
val setterSymbol = setterDescriptor?.let { context.symbolTable.referenceFunction(it) }
|
||||
val getterSymbol = getterDescriptor?.let { context.symbolTable.referenceFunction(it.original) }
|
||||
val setterSymbol = setterDescriptor?.let { context.symbolTable.referenceFunction(it.original) }
|
||||
|
||||
return IrPropertyReferenceImpl(
|
||||
startOffset, endOffset, type,
|
||||
@@ -145,12 +146,13 @@ class ReflectionReferencesGenerator(statementGenerator: StatementGenerator) : St
|
||||
endOffset: Int,
|
||||
type: KotlinType,
|
||||
symbol: IrFunctionSymbol,
|
||||
descriptor: FunctionDescriptor,
|
||||
typeArguments: Map<TypeParameterDescriptor, KotlinType>?,
|
||||
origin: IrStatementOrigin?
|
||||
): IrFunctionReference =
|
||||
IrFunctionReferenceImpl(
|
||||
startOffset, endOffset, type,
|
||||
symbol,
|
||||
symbol, descriptor,
|
||||
typeArguments,
|
||||
origin
|
||||
)
|
||||
|
||||
+2
-3
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user