From a584589665b27bb9060a72649c41dad520cf4cf0 Mon Sep 17 00:00:00 2001 From: Mikhail Glukhikh Date: Thu, 30 Jan 2020 19:05:32 +0300 Subject: [PATCH] Support nullable callable references in raw FIR --- .../kotlin/fir/lightTree/converter/ExpressionsConverter.kt | 3 +++ .../src/org/jetbrains/kotlin/fir/builder/RawFirBuilder.kt | 1 + .../testData/rawBuilder/expressions/callableReferences.kt | 2 ++ .../testData/rawBuilder/expressions/callableReferences.txt | 2 ++ .../fir/resolve/testData/resolve/stdlib/getOnKProperty.txt | 2 +- compiler/fir/tree/src/org/jetbrains/kotlin/fir/FirRenderer.kt | 3 +++ 6 files changed, 12 insertions(+), 1 deletion(-) diff --git a/compiler/fir/lightTree/src/org/jetbrains/kotlin/fir/lightTree/converter/ExpressionsConverter.kt b/compiler/fir/lightTree/src/org/jetbrains/kotlin/fir/lightTree/converter/ExpressionsConverter.kt index d93496598e7..2416e5fa9ea 100644 --- a/compiler/fir/lightTree/src/org/jetbrains/kotlin/fir/lightTree/converter/ExpressionsConverter.kt +++ b/compiler/fir/lightTree/src/org/jetbrains/kotlin/fir/lightTree/converter/ExpressionsConverter.kt @@ -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 } } diff --git a/compiler/fir/psi2fir/src/org/jetbrains/kotlin/fir/builder/RawFirBuilder.kt b/compiler/fir/psi2fir/src/org/jetbrains/kotlin/fir/builder/RawFirBuilder.kt index 87cd59584bd..8570ee4dedc 100644 --- a/compiler/fir/psi2fir/src/org/jetbrains/kotlin/fir/builder/RawFirBuilder.kt +++ b/compiler/fir/psi2fir/src/org/jetbrains/kotlin/fir/builder/RawFirBuilder.kt @@ -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 } } diff --git a/compiler/fir/psi2fir/testData/rawBuilder/expressions/callableReferences.kt b/compiler/fir/psi2fir/testData/rawBuilder/expressions/callableReferences.kt index 5903db92f16..e08bc0bd109 100644 --- a/compiler/fir/psi2fir/testData/rawBuilder/expressions/callableReferences.kt +++ b/compiler/fir/psi2fir/testData/rawBuilder/expressions/callableReferences.kt @@ -20,3 +20,5 @@ val test5 = A::bar val test6 = A::qux val test7 = ::baz + +val test8 = A?::foo diff --git a/compiler/fir/psi2fir/testData/rawBuilder/expressions/callableReferences.txt b/compiler/fir/psi2fir/testData/rawBuilder/expressions/callableReferences.txt index ba46202eb7b..9b6bd252840 100644 --- a/compiler/fir/psi2fir/testData/rawBuilder/expressions/callableReferences.txt +++ b/compiler/fir/psi2fir/testData/rawBuilder/expressions/callableReferences.txt @@ -29,3 +29,5 @@ FILE: callableReferences.kt public? get(): public? final? val test7: = ::baz# public? get(): + public? final? val test8: = A#?::foo# + public? get(): diff --git a/compiler/fir/resolve/testData/resolve/stdlib/getOnKProperty.txt b/compiler/fir/resolve/testData/resolve/stdlib/getOnKProperty.txt index 8e626e50dfa..6c6d2c37b83 100644 --- a/compiler/fir/resolve/testData/resolve/stdlib/getOnKProperty.txt +++ b/compiler/fir/resolve/testData/resolve/stdlib/getOnKProperty.txt @@ -4,7 +4,7 @@ FILE: getOnKProperty.kt ^ Int(42) } public final fun test(): R|kotlin/Unit| { - lval f: R|kotlin/reflect/KProperty1| = Q|kotlin/Any|::R|/meaning| + lval f: R|kotlin/reflect/KProperty1| = Q|kotlin/Any|?::R|/meaning| R|/f|.#(Null(null)) R|/f|.R|FakeOverride|(String()) } diff --git a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/FirRenderer.kt b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/FirRenderer.kt index f30eb0f5c69..d606c77bebe 100644 --- a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/FirRenderer.kt +++ b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/FirRenderer.kt @@ -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) }