From 1bbcec4935d928fc557d56f68f84ed032199dbb0 Mon Sep 17 00:00:00 2001 From: Mikhail Glukhikh Date: Wed, 5 Feb 2020 17:23:51 +0300 Subject: [PATCH] [FIR] DFA fix after x?.syntheticProperty ?: return --- .../jetbrains/kotlin/fir/resolve/dfa/util.kt | 4 +-- .../expresssions/syntheticSmartCast.kt | 10 ++++++- .../expresssions/syntheticSmartCast.txt | 26 ++++++++++++++++++- 3 files changed, 36 insertions(+), 4 deletions(-) diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/dfa/util.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/dfa/util.kt index bda8a05569f..ebe0cad620a 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/dfa/util.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/dfa/util.kt @@ -12,9 +12,9 @@ import org.jetbrains.kotlin.fir.contracts.description.ConeConstantReference import org.jetbrains.kotlin.fir.expressions.* import org.jetbrains.kotlin.fir.references.FirResolvedNamedReference import org.jetbrains.kotlin.fir.references.FirThisReference -import org.jetbrains.kotlin.fir.references.impl.FirExplicitThisReference import org.jetbrains.kotlin.fir.resolve.calls.FirNamedReferenceWithCandidate import org.jetbrains.kotlin.fir.symbols.AbstractFirBasedSymbol +import org.jetbrains.kotlin.fir.symbols.impl.FirAccessorSymbol import org.jetbrains.kotlin.fir.symbols.impl.FirFunctionSymbol import org.jetbrains.kotlin.fir.symbols.impl.FirNamedFunctionSymbol import org.jetbrains.kotlin.fir.types.ConeKotlinType @@ -109,7 +109,7 @@ internal val FirElement.symbol: AbstractFirBasedSymbol<*>? is FirSymbolOwner<*> -> symbol is FirWhenSubjectExpression -> whenSubject.whenExpression.subject?.symbol else -> null - }?.takeIf { this is FirThisReceiverExpression || it !is FirFunctionSymbol<*> } + }?.takeIf { this is FirThisReceiverExpression || (it !is FirFunctionSymbol<*> && it !is FirAccessorSymbol) } @DfaInternals internal val FirResolvable.symbol: AbstractFirBasedSymbol<*>? diff --git a/compiler/fir/resolve/testData/resolve/expresssions/syntheticSmartCast.kt b/compiler/fir/resolve/testData/resolve/expresssions/syntheticSmartCast.kt index c36f2b2f402..d6af94c9b02 100644 --- a/compiler/fir/resolve/testData/resolve/expresssions/syntheticSmartCast.kt +++ b/compiler/fir/resolve/testData/resolve/expresssions/syntheticSmartCast.kt @@ -45,7 +45,7 @@ fun test5(x: AnotherClass?) { fun test6(x: SomeClass?) { val bar = x?.bar as? String ?: return - x.foo + x.foo } fun test7(x: AnotherClass?) { @@ -53,5 +53,13 @@ fun test7(x: AnotherClass?) { x.foo } +fun test8(x: AnotherClass?) { + val bar = x?.bar ?: return + x.foo +} +fun test9(x: AnotherClass?) { + val baz = x?.baz() ?: return + x.foo +} diff --git a/compiler/fir/resolve/testData/resolve/expresssions/syntheticSmartCast.txt b/compiler/fir/resolve/testData/resolve/expresssions/syntheticSmartCast.txt index f7f955a1db9..e106c0a94ce 100644 --- a/compiler/fir/resolve/testData/resolve/expresssions/syntheticSmartCast.txt +++ b/compiler/fir/resolve/testData/resolve/expresssions/syntheticSmartCast.txt @@ -79,7 +79,7 @@ FILE: test.kt } } - R|/x|.# + R|/x|.R|/SomeClass.foo| } public final fun test7(x: R|AnotherClass?|): R|kotlin/Unit| { lval baz: R|kotlin/Boolean| = when (lval : R|kotlin/Boolean?| = (R|/x|?.R|/AnotherClass.baz|() as? R|kotlin/Boolean|)) { @@ -93,3 +93,27 @@ FILE: test.kt R|/x|.R|/AnotherClass.foo| } + public final fun test8(x: R|AnotherClass?|): R|kotlin/Unit| { + lval bar: R|kotlin/CharSequence| = when (lval : R|kotlin/CharSequence?| = R|/x|?.R|/AnotherClass.bar|) { + ==($subj$, Null(null)) -> { + ^test8 Unit + } + else -> { + R|/| + } + } + + R|/x|.R|/AnotherClass.foo| + } + public final fun test9(x: R|AnotherClass?|): R|kotlin/Unit| { + lval baz: R|kotlin/Any| = when (lval : R|kotlin/Any?| = R|/x|?.R|/AnotherClass.baz|()) { + ==($subj$, Null(null)) -> { + ^test9 Unit + } + else -> { + R|/| + } + } + + R|/x|.R|/AnotherClass.foo| + }