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
|
||||
): 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))
|
||||
)
|
||||
)
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
@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");
|
||||
|
||||
Reference in New Issue
Block a user