From e187c9272de2498e22eccfef7d240315abb1c805 Mon Sep 17 00:00:00 2001 From: Nikolay Lunyak Date: Wed, 18 Jan 2023 20:40:40 +0200 Subject: [PATCH] [FIR] Run checkers for FirErrorResolvedQualifier `INVISIBLE_REFERENCE` may be reported due to CandidateApplicability via a ConeDiagnostic, or in a checker. The former leads to `FirErrorResolvedQualifier`, so the checker is not called. This makes little sense, because CandidateApplicability may result in `NO_COMPANION_OBJECT`, which would prevent other more meaningful diagnostics from being reported (like `API_NOT_AVAILABLE`). If we run checkers for `FirErrorResolvedQualifier` we may get duplicate `INVISIBLE_REFERENCE`. The change in the checker prevents it. --- .../expression/FirVisibilityQualifierChecker.kt | 7 ++++++- .../ExpressionCheckersDiagnosticComponent.kt | 4 ++++ .../tests/annotations/requireKotlin.fir.kt | 2 +- .../diagnostics/tests/j+k/packageVisibility.fir.kt | 12 ++++++------ .../tests/j+k/privateNestedClassStaticMember.fir.kt | 2 +- .../diagnostics/testsWithStdLib/kt54410.fir.kt | 2 +- 6 files changed, 19 insertions(+), 10 deletions(-) diff --git a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/expression/FirVisibilityQualifierChecker.kt b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/expression/FirVisibilityQualifierChecker.kt index 690a78f26ee..c936a7bf49a 100644 --- a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/expression/FirVisibilityQualifierChecker.kt +++ b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/expression/FirVisibilityQualifierChecker.kt @@ -11,8 +11,10 @@ import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors import org.jetbrains.kotlin.diagnostics.reportOn import org.jetbrains.kotlin.fir.declarations.FirTypeAlias import org.jetbrains.kotlin.fir.declarations.utils.expandedConeType +import org.jetbrains.kotlin.fir.expressions.FirErrorResolvedQualifier import org.jetbrains.kotlin.fir.expressions.FirResolvedQualifier import org.jetbrains.kotlin.fir.getOwnerLookupTag +import org.jetbrains.kotlin.fir.resolve.diagnostics.ConeVisibilityError import org.jetbrains.kotlin.fir.resolve.toSymbol import org.jetbrains.kotlin.fir.symbols.SymbolInternals import org.jetbrains.kotlin.fir.symbols.impl.FirClassLikeSymbol @@ -38,7 +40,10 @@ object FirVisibilityQualifierChecker : FirResolvedQualifierChecker() { firClassLikeDeclaration, context.session, firFile, context.containingDeclarations, ) ) { - reporter.reportOn(expression.source, FirErrors.INVISIBLE_REFERENCE, symbol, context) + if (expression !is FirErrorResolvedQualifier || expression.diagnostic !is ConeVisibilityError) { + reporter.reportOn(expression.source, FirErrors.INVISIBLE_REFERENCE, symbol, context) + } + return } diff --git a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/collectors/components/ExpressionCheckersDiagnosticComponent.kt b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/collectors/components/ExpressionCheckersDiagnosticComponent.kt index c89d100e7c3..610bd7f8704 100644 --- a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/collectors/components/ExpressionCheckersDiagnosticComponent.kt +++ b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/collectors/components/ExpressionCheckersDiagnosticComponent.kt @@ -68,6 +68,10 @@ class ExpressionCheckersDiagnosticComponent( checkers.allResolvedQualifierCheckers.check(resolvedQualifier, data) } + override fun visitErrorResolvedQualifier(errorResolvedQualifier: FirErrorResolvedQualifier, data: CheckerContext) { + checkers.allResolvedQualifierCheckers.check(errorResolvedQualifier, data) + } + override fun visitWhenExpression(whenExpression: FirWhenExpression, data: CheckerContext) { checkers.allWhenExpressionCheckers.check(whenExpression, data) } diff --git a/compiler/testData/diagnostics/tests/annotations/requireKotlin.fir.kt b/compiler/testData/diagnostics/tests/annotations/requireKotlin.fir.kt index d9671963b41..47adeb3ae04 100644 --- a/compiler/testData/diagnostics/tests/annotations/requireKotlin.fir.kt +++ b/compiler/testData/diagnostics/tests/annotations/requireKotlin.fir.kt @@ -8,5 +8,5 @@ class IllegalVersion() @RequireKotlin("1.2") class LegalMinimum() -@RequireKotlin("1.2", versionKind = RequireKotlinVersionKind.COMPILER_VERSION, message = "Requires newer compiler version to be inlined correctly.") +@RequireKotlin("1.2", versionKind = RequireKotlinVersionKind.COMPILER_VERSION, message = "Requires newer compiler version to be inlined correctly.") class LegalStdLib() diff --git a/compiler/testData/diagnostics/tests/j+k/packageVisibility.fir.kt b/compiler/testData/diagnostics/tests/j+k/packageVisibility.fir.kt index b19201c5fae..6970b543271 100644 --- a/compiler/testData/diagnostics/tests/j+k/packageVisibility.fir.kt +++ b/compiler/testData/diagnostics/tests/j+k/packageVisibility.fir.kt @@ -28,9 +28,9 @@ import a.MyJavaClass val mc1 = MyJavaClass() -val x = MyJavaClass.staticMethod() -val y = MyJavaClass.NestedClass.staticMethodOfNested() -val z = MyJavaClass.NestedClass() +val x = MyJavaClass.staticMethod() +val y = MyJavaClass.NestedClass.staticMethodOfNested() +val z = MyJavaClass.NestedClass() //FILE: c.kt package a.c @@ -39,6 +39,6 @@ import a.MyJavaClass val mc1 = MyJavaClass() -val x = MyJavaClass.staticMethod() -val y = MyJavaClass.NestedClass.staticMethodOfNested() -val z = MyJavaClass.NestedClass() +val x = MyJavaClass.staticMethod() +val y = MyJavaClass.NestedClass.staticMethodOfNested() +val z = MyJavaClass.NestedClass() diff --git a/compiler/testData/diagnostics/tests/j+k/privateNestedClassStaticMember.fir.kt b/compiler/testData/diagnostics/tests/j+k/privateNestedClassStaticMember.fir.kt index 8d6148f6287..5a7e4a603b1 100644 --- a/compiler/testData/diagnostics/tests/j+k/privateNestedClassStaticMember.fir.kt +++ b/compiler/testData/diagnostics/tests/j+k/privateNestedClassStaticMember.fir.kt @@ -14,5 +14,5 @@ public class Foo { // FILE: 1.kt fun main() { - javaPackage.Foo.Bar.doSmth() + javaPackage.Foo.Bar.doSmth() } diff --git a/compiler/testData/diagnostics/testsWithStdLib/kt54410.fir.kt b/compiler/testData/diagnostics/testsWithStdLib/kt54410.fir.kt index f35fae62700..63f441baa73 100644 --- a/compiler/testData/diagnostics/testsWithStdLib/kt54410.fir.kt +++ b/compiler/testData/diagnostics/testsWithStdLib/kt54410.fir.kt @@ -3,6 +3,6 @@ import kotlin.io.path.OnErrorResult fun fun0 (): Unit { - val something1 = OnErrorResult.TERMINATE + val something1 = OnErrorResult.TERMINATE val something2 = kotlin.io.path.OnErrorResult.TERMINATE }