Support nullable callable references in raw FIR
This commit is contained in:
+3
@@ -378,11 +378,13 @@ class ExpressionsConverter(
|
||||
*/
|
||||
private fun convertCallableReferenceExpression(callableReferenceExpression: LighterASTNode): FirExpression {
|
||||
var isReceiver = true
|
||||
var safe = false
|
||||
var firReceiverExpression: FirExpression? = null
|
||||
lateinit var firCallableReference: FirQualifiedAccess
|
||||
callableReferenceExpression.forEachChildren {
|
||||
when (it.tokenType) {
|
||||
COLONCOLON -> isReceiver = false
|
||||
QUEST -> safe = true
|
||||
else -> if (it.isExpression()) {
|
||||
if (isReceiver) {
|
||||
firReceiverExpression = getAsFirExpression(it, "Incorrect receiver expression")
|
||||
@@ -396,6 +398,7 @@ class ExpressionsConverter(
|
||||
return FirCallableReferenceAccessImpl(null).apply {
|
||||
calleeReference = firCallableReference.calleeReference as FirNamedReference
|
||||
explicitReceiver = firReceiverExpression
|
||||
this.safe = safe
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -1467,6 +1467,7 @@ class RawFirBuilder(session: FirSession, val scopeProvider: FirScopeProvider, va
|
||||
expression.callableReference.toFirSourceElement(), expression.callableReference.getReferencedNameAsName(), null
|
||||
)
|
||||
explicitReceiver = expression.receiverExpression?.toFirExpression("Incorrect receiver expression")
|
||||
safe = expression.hasQuestionMarks
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -20,3 +20,5 @@ val test5 = A::bar
|
||||
val test6 = A::qux
|
||||
|
||||
val test7 = ::baz
|
||||
|
||||
val test8 = A?::foo
|
||||
|
||||
@@ -29,3 +29,5 @@ FILE: callableReferences.kt
|
||||
public? get(): <implicit>
|
||||
public? final? val test7: <implicit> = ::baz#
|
||||
public? get(): <implicit>
|
||||
public? final? val test8: <implicit> = A#?::foo#
|
||||
public? get(): <implicit>
|
||||
|
||||
@@ -4,7 +4,7 @@ FILE: getOnKProperty.kt
|
||||
^ Int(42)
|
||||
}
|
||||
public final fun test(): R|kotlin/Unit| {
|
||||
lval f: R|kotlin/reflect/KProperty1<kotlin/Any, kotlin/Int>| = Q|kotlin/Any|::R|/meaning|
|
||||
lval f: R|kotlin/reflect/KProperty1<kotlin/Any, kotlin/Int>| = Q|kotlin/Any|?::R|/meaning|
|
||||
R|<local>/f|.<Inapplicable(INAPPLICABLE): [kotlin/reflect/KProperty1.get]>#(Null(null))
|
||||
R|<local>/f|.R|FakeOverride<kotlin/reflect/KProperty1.get: R|kotlin/Int|>|(String())
|
||||
}
|
||||
|
||||
@@ -944,6 +944,9 @@ class FirRenderer(builder: StringBuilder) : FirVisitorVoid() {
|
||||
override fun visitCallableReferenceAccess(callableReferenceAccess: FirCallableReferenceAccess) {
|
||||
callableReferenceAccess.annotations.renderAnnotations()
|
||||
callableReferenceAccess.explicitReceiver?.accept(this)
|
||||
if (callableReferenceAccess.safe) {
|
||||
print("?")
|
||||
}
|
||||
print("::")
|
||||
callableReferenceAccess.calleeReference.accept(this)
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user