[FIR] Properly check when expression in FirConstCheckVisitor
Added proper checks for `FirWhenSubjectExpression` and `FirElseIfTrueCondition`
This commit is contained in:
+9
-1
@@ -16,6 +16,7 @@ import org.jetbrains.kotlin.fir.declarations.utils.isConst
|
|||||||
import org.jetbrains.kotlin.fir.declarations.utils.isStatic
|
import org.jetbrains.kotlin.fir.declarations.utils.isStatic
|
||||||
import org.jetbrains.kotlin.fir.declarations.utils.modality
|
import org.jetbrains.kotlin.fir.declarations.utils.modality
|
||||||
import org.jetbrains.kotlin.fir.expressions.*
|
import org.jetbrains.kotlin.fir.expressions.*
|
||||||
|
import org.jetbrains.kotlin.fir.expressions.impl.FirElseIfTrueCondition
|
||||||
import org.jetbrains.kotlin.fir.languageVersionSettings
|
import org.jetbrains.kotlin.fir.languageVersionSettings
|
||||||
import org.jetbrains.kotlin.fir.references.FirErrorNamedReference
|
import org.jetbrains.kotlin.fir.references.FirErrorNamedReference
|
||||||
import org.jetbrains.kotlin.fir.references.FirResolvedErrorReference
|
import org.jetbrains.kotlin.fir.references.FirResolvedErrorReference
|
||||||
@@ -103,7 +104,10 @@ private class FirConstCheckVisitor(private val session: FirSession) : FirVisitor
|
|||||||
|
|
||||||
whenExpression.subject?.accept(this, data)?.ifNotValidConst { return it }
|
whenExpression.subject?.accept(this, data)?.ifNotValidConst { return it }
|
||||||
for (branch in whenExpression.branches) {
|
for (branch in whenExpression.branches) {
|
||||||
branch.condition.accept(this, data).ifNotValidConst { return it }
|
when (branch.condition) {
|
||||||
|
is FirElseIfTrueCondition -> { /* skip */ }
|
||||||
|
else -> branch.condition.accept(this, data).ifNotValidConst { return it }
|
||||||
|
}
|
||||||
branch.result.statements.forEach { stmt ->
|
branch.result.statements.forEach { stmt ->
|
||||||
if (stmt !is FirExpression) return ConstantArgumentKind.NOT_CONST
|
if (stmt !is FirExpression) return ConstantArgumentKind.NOT_CONST
|
||||||
stmt.accept(this, data).ifNotValidConst { return it }
|
stmt.accept(this, data).ifNotValidConst { return it }
|
||||||
@@ -112,6 +116,10 @@ private class FirConstCheckVisitor(private val session: FirSession) : FirVisitor
|
|||||||
return ConstantArgumentKind.VALID_CONST
|
return ConstantArgumentKind.VALID_CONST
|
||||||
}
|
}
|
||||||
|
|
||||||
|
override fun visitWhenSubjectExpression(whenSubjectExpression: FirWhenSubjectExpression, data: Nothing?): ConstantArgumentKind {
|
||||||
|
return if (intrinsicConstEvaluation) ConstantArgumentKind.VALID_CONST else ConstantArgumentKind.NOT_CONST
|
||||||
|
}
|
||||||
|
|
||||||
override fun <T> visitConstExpression(constExpression: FirConstExpression<T>, data: Nothing?): ConstantArgumentKind {
|
override fun <T> visitConstExpression(constExpression: FirConstExpression<T>, data: Nothing?): ConstantArgumentKind {
|
||||||
return ConstantArgumentKind.VALID_CONST
|
return ConstantArgumentKind.VALID_CONST
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user