[fir2ir] Fix field-receiver extracting for evaluator
KT-61144
This commit is contained in:
committed by
Space Team
parent
c520aeb5aa
commit
35eca56d32
@@ -655,9 +655,12 @@ class Fir2IrVisitor(
|
||||
): IrElement = whileAnalysing(session, thisReceiverExpression) {
|
||||
val calleeReference = thisReceiverExpression.calleeReference
|
||||
|
||||
callGenerator.injectGetValueCall(thisReceiverExpression, calleeReference)?.let { return it }
|
||||
|
||||
val boundSymbol = calleeReference.boundSymbol
|
||||
|
||||
if (boundSymbol !is FirClassSymbol || calleeReference.contextReceiverNumber == -1) {
|
||||
callGenerator.injectGetValueCall(thisReceiverExpression, calleeReference)?.let { return it }
|
||||
}
|
||||
|
||||
when (boundSymbol) {
|
||||
is FirClassSymbol -> {
|
||||
// Object case
|
||||
@@ -680,7 +683,9 @@ class Fir2IrVisitor(
|
||||
val dispatchReceiver = conversionScope.dispatchReceiverParameter(irClass)
|
||||
if (dispatchReceiver != null) {
|
||||
return thisReceiverExpression.convertWithOffsets { startOffset, endOffset ->
|
||||
val thisRef = IrGetValueImpl(startOffset, endOffset, dispatchReceiver.type, dispatchReceiver.symbol)
|
||||
val thisRef = callGenerator.findInjectedValue(calleeReference)?.let {
|
||||
callGenerator.useInjectedValue(it, calleeReference, startOffset, endOffset)
|
||||
} ?: IrGetValueImpl(startOffset, endOffset, dispatchReceiver.type, dispatchReceiver.symbol)
|
||||
if (calleeReference.contextReceiverNumber != -1) {
|
||||
val constructorForCurrentlyGeneratedDelegatedConstructor =
|
||||
conversionScope.getConstructorForCurrentlyGeneratedDelegatedConstructor(irClass)
|
||||
|
||||
+16
-5
@@ -343,18 +343,27 @@ class CallAndReferenceGenerator(
|
||||
}
|
||||
|
||||
internal fun injectGetValueCall(element: FirElement, calleeReference: FirReference): IrExpression? {
|
||||
val injectedValue = extensions.findInjectedValue(calleeReference, conversionScope)
|
||||
val injectedValue = findInjectedValue(calleeReference)
|
||||
if (injectedValue != null) {
|
||||
return element.convertWithOffsets { startOffset, endOffset ->
|
||||
val type = injectedValue.typeRef.toIrType()
|
||||
val origin = calleeReference.statementOrigin()
|
||||
IrGetValueImpl(startOffset, endOffset, type, injectedValue.irParameterSymbol, origin)
|
||||
useInjectedValue(injectedValue, calleeReference, startOffset, endOffset)
|
||||
}
|
||||
}
|
||||
|
||||
return null
|
||||
}
|
||||
|
||||
internal fun useInjectedValue(
|
||||
injectedValue: InjectedValue,
|
||||
calleeReference: FirReference,
|
||||
startOffset: Int,
|
||||
endOffset: Int,
|
||||
): IrGetValueImpl {
|
||||
val type = injectedValue.typeRef.toIrType()
|
||||
val origin = calleeReference.statementOrigin()
|
||||
return IrGetValueImpl(startOffset, endOffset, type, injectedValue.irParameterSymbol, origin)
|
||||
}
|
||||
|
||||
fun convertToIrCall(
|
||||
qualifiedAccess: FirQualifiedAccessExpression,
|
||||
typeRef: FirTypeRef,
|
||||
@@ -552,7 +561,7 @@ class CallAndReferenceGenerator(
|
||||
}
|
||||
|
||||
private fun injectSetValueCall(element: FirElement, calleeReference: FirReference, assignedValue: IrExpression): IrExpression? {
|
||||
val injectedValue = extensions.findInjectedValue(calleeReference, conversionScope)
|
||||
val injectedValue = findInjectedValue(calleeReference)
|
||||
if (injectedValue != null) {
|
||||
return element.convertWithOffsets { startOffset, endOffset ->
|
||||
val type = irBuiltIns.unitType
|
||||
@@ -564,6 +573,8 @@ class CallAndReferenceGenerator(
|
||||
return null
|
||||
}
|
||||
|
||||
internal fun findInjectedValue(calleeReference: FirReference) = extensions.findInjectedValue(calleeReference, conversionScope)
|
||||
|
||||
fun convertToIrSetCall(variableAssignment: FirVariableAssignment, explicitReceiverExpression: IrExpression?): IrExpression {
|
||||
try {
|
||||
val type = irBuiltIns.unitType
|
||||
|
||||
Reference in New Issue
Block a user