IR: IrFunctionReference.fromSymbolDescriptor

This commit is contained in:
Georgy Bronnikov
2020-10-14 14:49:19 +03:00
parent 14b3beefb3
commit 305da8ee10
5 changed files with 45 additions and 24 deletions
@@ -69,7 +69,7 @@ private class AddContinuationLowering(context: JvmBackendContext) : SuspendLower
// The only references not yet transformed into objects are inline lambdas; the continuation
// for those will be taken from the inline functions they are passed to, not the enclosing scope.
return transformed.retargetToSuspendView(context, null) {
IrFunctionReferenceImpl(startOffset, endOffset, type, it, typeArgumentsCount, reflectionTarget, origin)
IrFunctionReferenceImpl.fromSymbolOwner(startOffset, endOffset, type, it, typeArgumentsCount, reflectionTarget, origin)
}
}
@@ -110,7 +110,7 @@ private class InlineCallableReferenceToLambdaTransformer(
}
+function
+IrFunctionReferenceImpl(
+IrFunctionReferenceImpl.fromSymbolOwner(
expression.startOffset,
expression.endOffset,
field.type,
@@ -190,7 +190,7 @@ private class InlineCallableReferenceToLambdaTransformer(
}
+function
+IrFunctionReferenceImpl(
+IrFunctionReferenceImpl.fromSymbolOwner(
expression.startOffset,
expression.endOffset,
function.returnType,
@@ -113,7 +113,8 @@ private class PropertyReferenceLowering(val context: JvmBackendContext) : IrElem
// Internal underlying vals of inline classes have no getter method
getter.owner.isInlineClassFieldGetter && getter.owner.visibility == DescriptorVisibilities.INTERNAL
val origin = if (needsDummySignature) InlineClassAbi.UNMANGLED_FUNCTION_REFERENCE else null
val reference = IrFunctionReferenceImpl(UNDEFINED_OFFSET, UNDEFINED_OFFSET, expression.type, getter, 0, getter, origin)
val reference =
IrFunctionReferenceImpl.fromSymbolOwner(UNDEFINED_OFFSET, UNDEFINED_OFFSET, expression.type, getter, 0, getter, origin)
return irCall(signatureStringIntrinsic).apply { putValueArgument(0, reference) }
}
@@ -492,7 +492,7 @@ class ReflectionReferencesGenerator(statementGenerator: StatementGenerator) : St
typeArguments: Map<TypeParameterDescriptor, KotlinType>?,
origin: IrStatementOrigin?
): IrFunctionReference =
IrFunctionReferenceImpl(
IrFunctionReferenceImpl.fromSymbolDescriptor(
startOffset, endOffset, type.toIrType(),
symbol,
typeArgumentsCount = descriptor.typeParametersCount,
@@ -36,25 +36,6 @@ class IrFunctionReferenceImpl(
override val reflectionTarget: IrFunctionSymbol? = symbol,
override val origin: IrStatementOrigin? = null,
) : IrFunctionReference(typeArgumentsCount) {
@ObsoleteDescriptorBasedAPI
constructor(
startOffset: Int,
endOffset: Int,
type: IrType,
symbol: IrFunctionSymbol,
typeArgumentsCount: Int,
reflectionTarget: IrFunctionSymbol?,
origin: IrStatementOrigin? = null
) : this(
startOffset, endOffset,
type,
symbol,
typeArgumentsCount,
symbol.descriptor.valueParameters.size,
reflectionTarget,
origin
)
override val referencedName: Name
get() = symbol.owner.name
@@ -92,4 +73,43 @@ class IrFunctionReferenceImpl(
argumentsByParameterIndex[i] = irExpression?.transform(transformer, data)
}
}
companion object {
@ObsoleteDescriptorBasedAPI
fun fromSymbolDescriptor(
startOffset: Int,
endOffset: Int,
type: IrType,
symbol: IrFunctionSymbol,
typeArgumentsCount: Int,
reflectionTarget: IrFunctionSymbol?,
origin: IrStatementOrigin? = null
) = IrFunctionReferenceImpl(
startOffset, endOffset,
type,
symbol,
typeArgumentsCount,
symbol.descriptor.valueParameters.size,
reflectionTarget,
origin
)
fun fromSymbolOwner(
startOffset: Int,
endOffset: Int,
type: IrType,
symbol: IrFunctionSymbol,
typeArgumentsCount: Int,
reflectionTarget: IrFunctionSymbol?,
origin: IrStatementOrigin? = null
) = IrFunctionReferenceImpl(
startOffset, endOffset,
type,
symbol,
typeArgumentsCount,
symbol.owner.valueParameters.size,
reflectionTarget,
origin
)
}
}