From c51d68e22787b0c57a250dfc2130d57019bb26c4 Mon Sep 17 00:00:00 2001 From: Ivan Kylchik Date: Thu, 21 Dec 2023 00:01:46 +0100 Subject: [PATCH] [FIR] Mark error expressions as valid consts in `FirConstCheckVisitor` --- .../kotlin/fir/analysis/checkers/FirConstChecks.kt | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/FirConstChecks.kt b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/FirConstChecks.kt index 2a667343242..f496e4f8d47 100644 --- a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/FirConstChecks.kt +++ b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/FirConstChecks.kt @@ -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) {