From 41a1fa25e2f4c8fb97451147359e1315aba85dc8 Mon Sep 17 00:00:00 2001 From: Mark Punzalan Date: Thu, 23 Sep 2021 20:29:50 +0000 Subject: [PATCH] FIR: Add ConeVisibilityError to distinguish between candidates that are invisible versus hidden due to deprecation. --- .../analysis/diagnostics/coneDiagnosticToFirDiagnostic.kt | 1 + .../resolve/src/org/jetbrains/kotlin/fir/FirCallResolver.kt | 1 + .../kotlin/fir/resolve/calls/ResolutionDiagnostic.kt | 2 ++ .../jetbrains/kotlin/fir/resolve/calls/ResolutionStages.kt | 4 ++-- .../kotlin/fir/resolve/diagnostics/FirDiagnostics.kt | 6 ++++++ .../kotlin/resolve/calls/tower/CandidateApplicability.kt | 3 ++- 6 files changed, 14 insertions(+), 3 deletions(-) diff --git a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/diagnostics/coneDiagnosticToFirDiagnostic.kt b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/diagnostics/coneDiagnosticToFirDiagnostic.kt index 73ba3a4a72e..391755609e0 100644 --- a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/diagnostics/coneDiagnosticToFirDiagnostic.kt +++ b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/diagnostics/coneDiagnosticToFirDiagnostic.kt @@ -45,6 +45,7 @@ private fun ConeDiagnostic.toFirDiagnostic( is ConeFunctionExpectedError -> FirErrors.FUNCTION_EXPECTED.createOn(source, this.expression, this.type) is ConeResolutionToClassifierError -> FirErrors.RESOLUTION_TO_CLASSIFIER.createOn(source, this.candidateSymbol) is ConeHiddenCandidateError -> FirErrors.INVISIBLE_REFERENCE.createOn(source, this.candidateSymbol) + is ConeVisibilityError -> FirErrors.INVISIBLE_REFERENCE.createOn(source, this.candidateSymbol) is ConeInapplicableWrongReceiver -> FirErrors.UNRESOLVED_REFERENCE_WRONG_RECEIVER.createOn(source, this.candidateSymbols) is ConeNoCompanionObject -> FirErrors.NO_COMPANION_OBJECT.createOn(source, this.candidateSymbol) is ConeAmbiguityError -> when { diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/FirCallResolver.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/FirCallResolver.kt index f64e33b439f..2f0e33461c7 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/FirCallResolver.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/FirCallResolver.kt @@ -704,6 +704,7 @@ class FirCallResolver( val candidate = candidates.single() val diagnostic = when (applicability) { CandidateApplicability.HIDDEN -> ConeHiddenCandidateError(candidate.symbol) + CandidateApplicability.VISIBILITY_ERROR -> ConeVisibilityError(candidate.symbol) CandidateApplicability.INAPPLICABLE_WRONG_RECEIVER -> ConeInapplicableWrongReceiver(listOf(candidate.symbol)) CandidateApplicability.NO_COMPANION_OBJECT -> ConeNoCompanionObject(candidate.symbol as FirRegularClassSymbol) else -> ConeInapplicableCandidateError(applicability, candidate) diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/ResolutionDiagnostic.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/ResolutionDiagnostic.kt index a0a8a44d3b8..0fe15ee12a1 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/ResolutionDiagnostic.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/ResolutionDiagnostic.kt @@ -63,6 +63,8 @@ object InapplicableCandidate : ResolutionDiagnostic(INAPPLICABLE) object HiddenCandidate : ResolutionDiagnostic(HIDDEN) +object VisibilityError : ResolutionDiagnostic(VISIBILITY_ERROR) + object ResolvedWithLowPriority : ResolutionDiagnostic(RESOLVED_LOW_PRIORITY) class InapplicableWrongReceiver( diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/ResolutionStages.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/ResolutionStages.kt index 8f9b419458e..9eb4a083fe2 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/ResolutionStages.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/ResolutionStages.kt @@ -237,7 +237,7 @@ internal object CheckVisibility : CheckerStage() { if (classSymbol is FirRegularClassSymbol) { if (classSymbol.fir.classKind.isSingleton) { - sink.yieldDiagnostic(HiddenCandidate) + sink.yieldDiagnostic(VisibilityError) } checkVisibility(classSymbol.fir, sink, candidate, visibilityChecker) } @@ -251,7 +251,7 @@ internal object CheckVisibility : CheckerStage() { visibilityChecker: FirVisibilityChecker ): Boolean { if (!visibilityChecker.isVisible(declaration, candidate)) { - sink.yieldDiagnostic(HiddenCandidate) + sink.yieldDiagnostic(VisibilityError) return false } return true diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/diagnostics/FirDiagnostics.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/diagnostics/FirDiagnostics.kt index 9279ae0a831..6bef1a4778b 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/diagnostics/FirDiagnostics.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/diagnostics/FirDiagnostics.kt @@ -72,6 +72,12 @@ class ConeResolutionToClassifierError(override val candidateSymbol: FirRegularCl class ConeHiddenCandidateError( override val candidateSymbol: FirBasedSymbol<*> +) : ConeDiagnosticWithSingleCandidate { + override val reason: String get() = "HIDDEN: ${describeSymbol(candidateSymbol)} is deprecated with DeprecationLevel.HIDDEN" +} + +class ConeVisibilityError( + override val candidateSymbol: FirBasedSymbol<*> ) : ConeDiagnosticWithSingleCandidate { override val reason: String get() = "HIDDEN: ${describeSymbol(candidateSymbol)} is invisible" } diff --git a/compiler/resolution.common/src/org/jetbrains/kotlin/resolve/calls/tower/CandidateApplicability.kt b/compiler/resolution.common/src/org/jetbrains/kotlin/resolve/calls/tower/CandidateApplicability.kt index c81d1f33e36..4bd00a29203 100644 --- a/compiler/resolution.common/src/org/jetbrains/kotlin/resolve/calls/tower/CandidateApplicability.kt +++ b/compiler/resolution.common/src/org/jetbrains/kotlin/resolve/calls/tower/CandidateApplicability.kt @@ -8,6 +8,7 @@ package org.jetbrains.kotlin.resolve.calls.tower enum class CandidateApplicability { RESOLVED_TO_SAM_WITH_VARARG, // migration warning up to 1.5 (when resolve to function with SAM conversion and array without spread as vararg) HIDDEN, // removed from resolve + VISIBILITY_ERROR, // problems with visibility UNSUPPORTED, // unsupported feature INAPPLICABLE_WRONG_RECEIVER, // receiver not matched INAPPLICABLE_ARGUMENTS_MAPPING_ERROR, // arguments not mapped to parameters (i.e. different size of arguments and parameters) @@ -15,7 +16,7 @@ enum class CandidateApplicability { INAPPLICABLE_MODIFIER, // no expected modifier (eg infix call on non-infix function) NO_COMPANION_OBJECT, // Classifier does not have a companion object IMPOSSIBLE_TO_GENERATE, // access to outer class from nested - RUNTIME_ERROR, // problems with visibility + RUNTIME_ERROR, // TODO: FE 1.0 uses this as catch-all for all other errors. Consider re-assigning those diagnostics. UNSAFE_CALL, // receiver or argument nullability doesn't match UNSTABLE_SMARTCAST, // unstable smart cast CONVENTION_ERROR, // missing infix, operator etc