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
): 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))
)
)
}
+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);
}
@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");