[FIR] Mark error expressions as valid consts in FirConstCheckVisitor
This commit is contained in:
+11
-1
@@ -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) {
|
||||
|
||||
Reference in New Issue
Block a user