[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.expressions.*
|
||||||
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.FirResolvedNamedReference
|
import org.jetbrains.kotlin.fir.references.FirResolvedNamedReference
|
||||||
import org.jetbrains.kotlin.fir.references.toResolvedCallableSymbol
|
import org.jetbrains.kotlin.fir.references.toResolvedCallableSymbol
|
||||||
import org.jetbrains.kotlin.fir.resolve.fullyExpandedType
|
import org.jetbrains.kotlin.fir.resolve.fullyExpandedType
|
||||||
@@ -110,6 +111,12 @@ private class FirConstCheckVisitor(private val session: FirSession) : FirVisitor
|
|||||||
return ConstantArgumentKind.NOT_CONST
|
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 {
|
override fun visitNamedArgumentExpression(namedArgumentExpression: FirNamedArgumentExpression, data: Nothing?): ConstantArgumentKind {
|
||||||
return namedArgumentExpression.expression.accept(this, data)
|
return namedArgumentExpression.expression.accept(this, data)
|
||||||
}
|
}
|
||||||
@@ -210,6 +217,9 @@ private class FirConstCheckVisitor(private val session: FirSession) : FirVisitor
|
|||||||
): ConstantArgumentKind {
|
): ConstantArgumentKind {
|
||||||
val propertySymbol = propertyAccessExpression.toReference()?.toResolvedCallableSymbol(discardErrorReference = true)
|
val propertySymbol = propertyAccessExpression.toReference()?.toResolvedCallableSymbol(discardErrorReference = true)
|
||||||
when (propertySymbol) {
|
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
|
null -> return ConstantArgumentKind.VALID_CONST
|
||||||
is FirPropertySymbol -> {
|
is FirPropertySymbol -> {
|
||||||
val classKindOfParent = (propertySymbol.getReferencedClassSymbol() as? FirRegularClassSymbol)?.classKind
|
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 {
|
override fun visitFunctionCall(functionCall: FirFunctionCall, data: Nothing?): ConstantArgumentKind {
|
||||||
val calleeReference = functionCall.calleeReference
|
val calleeReference = functionCall.calleeReference
|
||||||
if (calleeReference is FirErrorNamedReference) {
|
if (calleeReference is FirErrorNamedReference || calleeReference is FirResolvedErrorReference) {
|
||||||
return ConstantArgumentKind.VALID_CONST
|
return ConstantArgumentKind.VALID_CONST
|
||||||
}
|
}
|
||||||
if (functionCall.getExpandedType().classId == StandardClassIds.KClass) {
|
if (functionCall.getExpandedType().classId == StandardClassIds.KClass) {
|
||||||
|
|||||||
Reference in New Issue
Block a user