FIR: Add ConeVisibilityError to distinguish between candidates that are

invisible versus hidden due to deprecation.
This commit is contained in:
Mark Punzalan
2021-09-23 20:29:50 +00:00
committed by TeamCityServer
parent 58eb329fb9
commit 41a1fa25e2
6 changed files with 14 additions and 3 deletions
@@ -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 {
@@ -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)
@@ -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(
@@ -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
@@ -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"
}
@@ -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