FIR (raw / resolution API): set correctly elvis/bang-bang bound PSIs

This commit is contained in:
Mikhail Glukhikh
2019-07-30 12:02:40 +03:00
parent 1f771a2407
commit 14e9404afd
6 changed files with 45 additions and 7 deletions
@@ -185,25 +185,25 @@ internal fun FirExpression.generateNotNullOrOther(
session: FirSession, other: FirExpression, caseId: String, basePsi: KtElement session: FirSession, other: FirExpression, caseId: String, basePsi: KtElement
): FirWhenExpression { ): FirWhenExpression {
val subjectName = Name.special("<$caseId>") val subjectName = Name.special("<$caseId>")
val subjectVariable = generateTemporaryVariable(session, psi, subjectName, this) val subjectVariable = generateTemporaryVariable(session, basePsi, subjectName, this)
val subject = FirWhenSubject() val subject = FirWhenSubject()
val subjectExpression = FirWhenSubjectExpressionImpl(psi, subject) val subjectExpression = FirWhenSubjectExpressionImpl(basePsi, subject)
return FirWhenExpressionImpl( return FirWhenExpressionImpl(
basePsi, this, subjectVariable basePsi, this, subjectVariable
).apply { ).apply {
subject.bind(this) subject.bind(this)
branches += FirWhenBranchImpl( branches += FirWhenBranchImpl(
psi, basePsi,
FirOperatorCallImpl(psi, FirOperation.EQ).apply { FirOperatorCallImpl(basePsi, FirOperation.EQ).apply {
arguments += subjectExpression arguments += subjectExpression
arguments += FirConstExpressionImpl(psi, IrConstKind.Null, null) arguments += FirConstExpressionImpl(basePsi, IrConstKind.Null, null)
}, },
FirSingleExpressionBlock(other) FirSingleExpressionBlock(other)
) )
branches += FirWhenBranchImpl( branches += FirWhenBranchImpl(
other.psi, FirElseIfTrueCondition(psi), other.psi, FirElseIfTrueCondition(basePsi),
FirSingleExpressionBlock( FirSingleExpressionBlock(
FirUncheckedNotNullCastImpl(psi, generateResolvedAccessExpression(psi, subjectVariable)) FirUncheckedNotNullCastImpl(basePsi, generateResolvedAccessExpression(basePsi, subjectVariable))
) )
) )
} }
+3
View File
@@ -0,0 +1,3 @@
{
"mainFile": "main.kt"
}
+7
View File
@@ -0,0 +1,7 @@
package elvis
class WithElvis(val value: String?) {
fun foo() = <caret>value ?: ""
}
+22
View File
@@ -0,0 +1,22 @@
FILE: main.kt
public final class WithElvis : R|kotlin/Any| {
public constructor(value: R|kotlin/String?|): R|elvis/WithElvis| {
super<R|kotlin/Any|>()
}
public final val value: R|kotlin/String?| = R|<local>/value|
public get(): R|kotlin/String?|
public final fun foo(): R|kotlin/String| {
^foo when (lval <elvis>: R|kotlin/String?| = R|elvis/WithElvis.value|) {
==($subj$, Null(null)) -> {
String()
}
else -> {
R|<local>/<elvis>|!
}
}
}
}
+1
View File
@@ -0,0 +1 @@
R|elvis/WithElvis.value|
@@ -29,6 +29,11 @@ public class FirLazyResolveTestGenerated extends AbstractFirLazyResolveTest {
KotlinTestUtils.assertAllTestsPresentInSingleGeneratedClass(this.getClass(), new File("idea/testData/fir/lazyResolve"), Pattern.compile("^(.+)\\.test$"), TargetBackend.ANY); 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") @TestMetadata("inInit/inInit.test")
public void testInInit_InInit() throws Exception { public void testInInit_InInit() throws Exception {
runTest("idea/testData/fir/lazyResolve/inInit/inInit.test"); runTest("idea/testData/fir/lazyResolve/inInit/inInit.test");