FIR (raw / resolution API): set correctly elvis/bang-bang bound PSIs
This commit is contained in:
@@ -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))
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,3 @@
|
|||||||
|
{
|
||||||
|
"mainFile": "main.kt"
|
||||||
|
}
|
||||||
+7
@@ -0,0 +1,7 @@
|
|||||||
|
package elvis
|
||||||
|
|
||||||
|
class WithElvis(val value: String?) {
|
||||||
|
fun foo() = <caret>value ?: ""
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
+22
@@ -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>|!
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -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");
|
||||||
|
|||||||
Reference in New Issue
Block a user