FIR checker: skip error named reference if receiver is unresolved
Currently, FIR reports errors caused by previous resolution failure. For example with unresolved `a` and `b` in code `a.b`, both `a` and `b` are highlighted. FE1.0 only highlights `a` since it's the root cause. This change applies this heuristics when reporting FirDiagnostics.
This commit is contained in:
committed by
Dmitriy Novozhilov
parent
d6907222cd
commit
fb14b03824
+14
-3
@@ -34,17 +34,28 @@ class ErrorNodeDiagnosticCollectorComponent(collector: AbstractDiagnosticCollect
|
||||
|
||||
override fun visitErrorNamedReference(errorNamedReference: FirErrorNamedReference, data: CheckerContext) {
|
||||
val source = errorNamedReference.source ?: return
|
||||
val qualifiedAccessSource = data.qualifiedAccesses.lastOrNull()?.takeIf {
|
||||
val qualifiedAccess = data.qualifiedAccesses.lastOrNull()?.takeIf {
|
||||
// Use the source of the enclosing FirQualifiedAccessExpression if it is exactly the call to the erroneous callee.
|
||||
it is FirQualifiedAccessExpression && it.calleeReference == errorNamedReference
|
||||
}?.source
|
||||
}
|
||||
// Don't report duplicated unresolved reference on annotation entry (already reported on its type)
|
||||
if (source.elementType == KtNodeTypes.ANNOTATION_ENTRY && errorNamedReference.diagnostic is ConeUnresolvedNameError) return
|
||||
// Already reported in FirConventionFunctionCallChecker
|
||||
if (source.kind == FirFakeSourceElementKind.ArrayAccessNameReference &&
|
||||
errorNamedReference.diagnostic is ConeUnresolvedNameError
|
||||
) return
|
||||
reportFirDiagnostic(errorNamedReference.diagnostic, source, reporter, data, qualifiedAccessSource)
|
||||
|
||||
// If the receiver cannot be resolved, we skip reporting any further problems for this call.
|
||||
if (qualifiedAccess?.dispatchReceiver.hasUnresolvedNameError() || qualifiedAccess?.extensionReceiver.hasUnresolvedNameError() || qualifiedAccess?.explicitReceiver.hasUnresolvedNameError()) return
|
||||
|
||||
reportFirDiagnostic(errorNamedReference.diagnostic, source, reporter, data, qualifiedAccess?.source)
|
||||
}
|
||||
|
||||
private fun FirExpression?.hasUnresolvedNameError(): Boolean {
|
||||
return when ((this?.typeRef as? FirErrorTypeRef)?.diagnostic) {
|
||||
is ConeUnresolvedNameError -> true
|
||||
else -> false
|
||||
}
|
||||
}
|
||||
|
||||
override fun visitErrorExpression(errorExpression: FirErrorExpression, data: CheckerContext) {
|
||||
|
||||
Reference in New Issue
Block a user