[FIR2IR] Support PROPERTY_REFERENCE_FROM_DELEGATE origin

This commit is contained in:
Mikhail Glukhikh
2020-03-31 16:31:06 +03:00
parent 5f8fadb220
commit 58e00400f1
14 changed files with 48 additions and 41 deletions
@@ -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 -> {
@@ -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())