[FIR2IR] Support PROPERTY_REFERENCE_FROM_DELEGATE origin
This commit is contained in:
+8
-1
@@ -13,6 +13,7 @@ import org.jetbrains.kotlin.fir.declarations.FirClass
|
||||
import org.jetbrains.kotlin.fir.declarations.FirRegularClass
|
||||
import org.jetbrains.kotlin.fir.expressions.*
|
||||
import org.jetbrains.kotlin.fir.expressions.impl.FirNoReceiverExpression
|
||||
import org.jetbrains.kotlin.fir.psi
|
||||
import org.jetbrains.kotlin.fir.references.FirDelegateFieldReference
|
||||
import org.jetbrains.kotlin.fir.references.FirReference
|
||||
import org.jetbrains.kotlin.fir.references.FirResolvedNamedReference
|
||||
@@ -37,6 +38,7 @@ import org.jetbrains.kotlin.ir.types.IrType
|
||||
import org.jetbrains.kotlin.ir.types.classifierOrNull
|
||||
import org.jetbrains.kotlin.ir.types.makeNotNull
|
||||
import org.jetbrains.kotlin.ir.util.defaultType
|
||||
import org.jetbrains.kotlin.psi.KtPropertyDelegate
|
||||
|
||||
internal class CallAndReferenceGenerator(
|
||||
private val components: Fir2IrComponents,
|
||||
@@ -60,12 +62,17 @@ internal class CallAndReferenceGenerator(
|
||||
referencedPropertyGetter != null -> null
|
||||
else -> referencedProperty.backingField?.symbol
|
||||
}
|
||||
val origin = when (callableReferenceAccess.source?.psi?.parent) {
|
||||
is KtPropertyDelegate -> IrStatementOrigin.PROPERTY_REFERENCE_FOR_DELEGATE
|
||||
else -> null
|
||||
}
|
||||
IrPropertyReferenceImpl(
|
||||
startOffset, endOffset, type, symbol,
|
||||
typeArgumentsCount = referencedPropertyGetter?.typeParameters?.size ?: 0,
|
||||
backingFieldSymbol,
|
||||
referencedPropertyGetter?.symbol,
|
||||
referencedProperty.setter?.symbol
|
||||
referencedProperty.setter?.symbol,
|
||||
origin
|
||||
)
|
||||
}
|
||||
is IrConstructorSymbol -> {
|
||||
|
||||
+7
-7
@@ -312,7 +312,7 @@ fun FirPropertyBuilder.generateAccessorsByDelegate(
|
||||
}
|
||||
|
||||
fun delegateAccess() = buildQualifiedAccessExpression {
|
||||
source = null
|
||||
source = delegateBuilder.source
|
||||
calleeReference = buildDelegateFieldReference {
|
||||
resolvedSymbol = delegateFieldSymbol
|
||||
}
|
||||
@@ -320,15 +320,15 @@ fun FirPropertyBuilder.generateAccessorsByDelegate(
|
||||
|
||||
fun thisRef(): FirExpression =
|
||||
if (member || extension) buildQualifiedAccessExpression {
|
||||
source = null
|
||||
source = delegateBuilder.source
|
||||
calleeReference = buildExplicitThisReference {}
|
||||
}
|
||||
else buildConstExpression(null, FirConstKind.Null, null)
|
||||
|
||||
fun propertyRef() = buildCallableReferenceAccess {
|
||||
source = null
|
||||
source = delegateBuilder.source
|
||||
calleeReference = buildResolvedNamedReference {
|
||||
source = null
|
||||
source = delegateBuilder.source
|
||||
name = this@generateAccessorsByDelegate.name
|
||||
resolvedSymbol = this@generateAccessorsByDelegate.symbol
|
||||
}
|
||||
@@ -338,7 +338,7 @@ fun FirPropertyBuilder.generateAccessorsByDelegate(
|
||||
delegateBuilder.delegateProvider = if (stubMode) buildExpressionStub() else buildFunctionCall {
|
||||
explicitReceiver = receiver
|
||||
calleeReference = buildSimpleNamedReference {
|
||||
source = null
|
||||
source = delegateBuilder.source
|
||||
name = PROVIDE_DELEGATE
|
||||
}
|
||||
argumentList = buildBinaryArgumentList(thisRef(), propertyRef())
|
||||
@@ -357,10 +357,10 @@ fun FirPropertyBuilder.generateAccessorsByDelegate(
|
||||
body = FirSingleExpressionBlock(
|
||||
buildReturnExpression {
|
||||
result = buildFunctionCall {
|
||||
source = null
|
||||
source = delegateBuilder.source
|
||||
explicitReceiver = delegateAccess()
|
||||
calleeReference = buildSimpleNamedReference {
|
||||
source = null
|
||||
source = delegateBuilder.source
|
||||
name = GET_VALUE
|
||||
}
|
||||
argumentList = buildBinaryArgumentList(thisRef(), propertyRef())
|
||||
|
||||
Reference in New Issue
Block a user