[FIR] Mark error expressions as valid consts in FirConstCheckVisitor

This commit is contained in:
Ivan Kylchik
2023-12-21 00:01:46 +01:00
committed by Space Team
parent 521306e5e9
commit c51d68e227
@@ -18,6 +18,7 @@ import org.jetbrains.kotlin.fir.declarations.utils.modality
import org.jetbrains.kotlin.fir.expressions.*
import org.jetbrains.kotlin.fir.languageVersionSettings
import org.jetbrains.kotlin.fir.references.FirErrorNamedReference
import org.jetbrains.kotlin.fir.references.FirResolvedErrorReference
import org.jetbrains.kotlin.fir.references.FirResolvedNamedReference
import org.jetbrains.kotlin.fir.references.toResolvedCallableSymbol
import org.jetbrains.kotlin.fir.resolve.fullyExpandedType
@@ -110,6 +111,12 @@ private class FirConstCheckVisitor(private val session: FirSession) : FirVisitor
return ConstantArgumentKind.NOT_CONST
}
override fun visitErrorExpression(errorExpression: FirErrorExpression, data: Nothing?): ConstantArgumentKind {
// Error expression already signalizes about some problem, and later we will report some diagnostic.
// We count this expression as valid and skip diagnostic reporting not to pollute output with a lot of error messages.
return ConstantArgumentKind.VALID_CONST
}
override fun visitNamedArgumentExpression(namedArgumentExpression: FirNamedArgumentExpression, data: Nothing?): ConstantArgumentKind {
return namedArgumentExpression.expression.accept(this, data)
}
@@ -210,6 +217,9 @@ private class FirConstCheckVisitor(private val session: FirSession) : FirVisitor
): ConstantArgumentKind {
val propertySymbol = propertyAccessExpression.toReference()?.toResolvedCallableSymbol(discardErrorReference = true)
when (propertySymbol) {
// Null symbol means some error occurred.
// We use the same logic as in `visitErrorExpression`.
// Better to report "UNRESOLVED_REFERENCE" later than some "NOT_CONST" diagnostic right now.
null -> return ConstantArgumentKind.VALID_CONST
is FirPropertySymbol -> {
val classKindOfParent = (propertySymbol.getReferencedClassSymbol() as? FirRegularClassSymbol)?.classKind
@@ -252,7 +262,7 @@ private class FirConstCheckVisitor(private val session: FirSession) : FirVisitor
override fun visitFunctionCall(functionCall: FirFunctionCall, data: Nothing?): ConstantArgumentKind {
val calleeReference = functionCall.calleeReference
if (calleeReference is FirErrorNamedReference) {
if (calleeReference is FirErrorNamedReference || calleeReference is FirResolvedErrorReference) {
return ConstantArgumentKind.VALID_CONST
}
if (functionCall.getExpandedType().classId == StandardClassIds.KClass) {