From 14e9404afd4b5a77b8bdf2d95a4f10edbbebb507 Mon Sep 17 00:00:00 2001 From: Mikhail Glukhikh Date: Tue, 30 Jul 2019 12:02:40 +0300 Subject: [PATCH] FIR (raw / resolution API): set correctly elvis/bang-bang bound PSIs --- .../kotlin/fir/builder/ConversionUtils.kt | 14 ++++++------ .../testData/fir/lazyResolve/elvis/elvis.test | 3 +++ idea/testData/fir/lazyResolve/elvis/main.kt | 7 ++++++ idea/testData/fir/lazyResolve/elvis/main.txt | 22 +++++++++++++++++++ .../fir/lazyResolve/elvis/results.txt | 1 + .../idea/fir/FirLazyResolveTestGenerated.java | 5 +++++ 6 files changed, 45 insertions(+), 7 deletions(-) create mode 100644 idea/testData/fir/lazyResolve/elvis/elvis.test create mode 100644 idea/testData/fir/lazyResolve/elvis/main.kt create mode 100644 idea/testData/fir/lazyResolve/elvis/main.txt create mode 100644 idea/testData/fir/lazyResolve/elvis/results.txt diff --git a/compiler/fir/psi2fir/src/org/jetbrains/kotlin/fir/builder/ConversionUtils.kt b/compiler/fir/psi2fir/src/org/jetbrains/kotlin/fir/builder/ConversionUtils.kt index c62b6dbd510..d53c2cb072e 100644 --- a/compiler/fir/psi2fir/src/org/jetbrains/kotlin/fir/builder/ConversionUtils.kt +++ b/compiler/fir/psi2fir/src/org/jetbrains/kotlin/fir/builder/ConversionUtils.kt @@ -185,25 +185,25 @@ internal fun FirExpression.generateNotNullOrOther( session: FirSession, other: FirExpression, caseId: String, basePsi: KtElement ): FirWhenExpression { val subjectName = Name.special("<$caseId>") - val subjectVariable = generateTemporaryVariable(session, psi, subjectName, this) + val subjectVariable = generateTemporaryVariable(session, basePsi, subjectName, this) val subject = FirWhenSubject() - val subjectExpression = FirWhenSubjectExpressionImpl(psi, subject) + val subjectExpression = FirWhenSubjectExpressionImpl(basePsi, subject) return FirWhenExpressionImpl( basePsi, this, subjectVariable ).apply { subject.bind(this) branches += FirWhenBranchImpl( - psi, - FirOperatorCallImpl(psi, FirOperation.EQ).apply { + basePsi, + FirOperatorCallImpl(basePsi, FirOperation.EQ).apply { arguments += subjectExpression - arguments += FirConstExpressionImpl(psi, IrConstKind.Null, null) + arguments += FirConstExpressionImpl(basePsi, IrConstKind.Null, null) }, FirSingleExpressionBlock(other) ) branches += FirWhenBranchImpl( - other.psi, FirElseIfTrueCondition(psi), + other.psi, FirElseIfTrueCondition(basePsi), FirSingleExpressionBlock( - FirUncheckedNotNullCastImpl(psi, generateResolvedAccessExpression(psi, subjectVariable)) + FirUncheckedNotNullCastImpl(basePsi, generateResolvedAccessExpression(basePsi, subjectVariable)) ) ) } diff --git a/idea/testData/fir/lazyResolve/elvis/elvis.test b/idea/testData/fir/lazyResolve/elvis/elvis.test new file mode 100644 index 00000000000..3099545c162 --- /dev/null +++ b/idea/testData/fir/lazyResolve/elvis/elvis.test @@ -0,0 +1,3 @@ +{ + "mainFile": "main.kt" +} \ No newline at end of file diff --git a/idea/testData/fir/lazyResolve/elvis/main.kt b/idea/testData/fir/lazyResolve/elvis/main.kt new file mode 100644 index 00000000000..d6b5c72a2f9 --- /dev/null +++ b/idea/testData/fir/lazyResolve/elvis/main.kt @@ -0,0 +1,7 @@ +package elvis + +class WithElvis(val value: String?) { + fun foo() = value ?: "" +} + + diff --git a/idea/testData/fir/lazyResolve/elvis/main.txt b/idea/testData/fir/lazyResolve/elvis/main.txt new file mode 100644 index 00000000000..64212966878 --- /dev/null +++ b/idea/testData/fir/lazyResolve/elvis/main.txt @@ -0,0 +1,22 @@ +FILE: main.kt + public final class WithElvis : R|kotlin/Any| { + public constructor(value: R|kotlin/String?|): R|elvis/WithElvis| { + super() + } + + public final val value: R|kotlin/String?| = R|/value| + public get(): R|kotlin/String?| + + public final fun foo(): R|kotlin/String| { + ^foo when (lval : R|kotlin/String?| = R|elvis/WithElvis.value|) { + ==($subj$, Null(null)) -> { + String() + } + else -> { + R|/|! + } + } + + } + + } diff --git a/idea/testData/fir/lazyResolve/elvis/results.txt b/idea/testData/fir/lazyResolve/elvis/results.txt new file mode 100644 index 00000000000..35e0a3c3fc0 --- /dev/null +++ b/idea/testData/fir/lazyResolve/elvis/results.txt @@ -0,0 +1 @@ +R|elvis/WithElvis.value| \ No newline at end of file diff --git a/idea/tests/org/jetbrains/kotlin/idea/fir/FirLazyResolveTestGenerated.java b/idea/tests/org/jetbrains/kotlin/idea/fir/FirLazyResolveTestGenerated.java index ad5451975de..62a87b95756 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/fir/FirLazyResolveTestGenerated.java +++ b/idea/tests/org/jetbrains/kotlin/idea/fir/FirLazyResolveTestGenerated.java @@ -29,6 +29,11 @@ public class FirLazyResolveTestGenerated extends AbstractFirLazyResolveTest { KotlinTestUtils.assertAllTestsPresentInSingleGeneratedClass(this.getClass(), new File("idea/testData/fir/lazyResolve"), Pattern.compile("^(.+)\\.test$"), TargetBackend.ANY); } + @TestMetadata("elvis/elvis.test") + public void testElvis_Elvis() throws Exception { + runTest("idea/testData/fir/lazyResolve/elvis/elvis.test"); + } + @TestMetadata("inInit/inInit.test") public void testInInit_InInit() throws Exception { runTest("idea/testData/fir/lazyResolve/inInit/inInit.test");