From 7aaac2573c7864dd71076146de7e6feb36a0708a Mon Sep 17 00:00:00 2001 From: Tianyu Geng Date: Thu, 16 Sep 2021 11:22:03 -0700 Subject: [PATCH] FIR: preserve diagnostics in `createResolvedNamedReference` --- .../jetbrains/kotlin/fir/FirCallResolver.kt | 42 ++++++++++++------- .../dslMarker/threeImplicitReceivers.fir.kt | 2 +- .../dslMarker/threeImplicitReceivers2.fir.kt | 2 +- 3 files changed, 30 insertions(+), 16 deletions(-) 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 2f0e33461c7..d0755c9c074 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/FirCallResolver.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/FirCallResolver.kt @@ -656,13 +656,20 @@ class FirCallResolver( ConeResolutionToClassifierError(fir.symbol) } else { val coneType = explicitReceiver?.typeRef?.coneType - if (coneType != null && !coneType.isUnit) { - ConeFunctionExpectedError( - name.asString(), - (fir as? FirTypedDeclaration)?.returnTypeRef?.coneType ?: coneType - ) - } else { - ConeUnresolvedNameError(name) + when { + coneType != null && !coneType.isUnit -> { + ConeFunctionExpectedError( + name.asString(), + (fir as? FirTypedDeclaration)?.returnTypeRef?.coneType ?: coneType + ) + } + singleExpectedCandidate != null && !singleExpectedCandidate.currentApplicability.isSuccess -> { + createConeDiagnosticForCandidateWithError( + singleExpectedCandidate.currentApplicability, + singleExpectedCandidate + ) + } + else -> ConeUnresolvedNameError(name) } } } @@ -702,13 +709,7 @@ class FirCallResolver( !applicability.isSuccess -> { 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) - } + val diagnostic = createConeDiagnosticForCandidateWithError(applicability, candidate) createErrorReferenceWithExistingCandidate( candidate, diagnostic, @@ -759,6 +760,19 @@ class FirCallResolver( } } + private fun createConeDiagnosticForCandidateWithError( + applicability: CandidateApplicability, + candidate: Candidate + ): ConeDiagnosticWithCandidates { + return 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) + } + } + private fun buildErrorReference( callInfo: CallInfo, diagnostic: ConeDiagnostic, diff --git a/compiler/testData/diagnostics/tests/resolve/dslMarker/threeImplicitReceivers.fir.kt b/compiler/testData/diagnostics/tests/resolve/dslMarker/threeImplicitReceivers.fir.kt index 06932e37d76..8f9da99c879 100644 --- a/compiler/testData/diagnostics/tests/resolve/dslMarker/threeImplicitReceivers.fir.kt +++ b/compiler/testData/diagnostics/tests/resolve/dslMarker/threeImplicitReceivers.fir.kt @@ -40,7 +40,7 @@ fun test() { baz { y() - x() + x() with(D()) { x() diff --git a/compiler/testData/diagnostics/tests/resolve/dslMarker/threeImplicitReceivers2.fir.kt b/compiler/testData/diagnostics/tests/resolve/dslMarker/threeImplicitReceivers2.fir.kt index 5b4eac008c3..8ef8b0966d7 100644 --- a/compiler/testData/diagnostics/tests/resolve/dslMarker/threeImplicitReceivers2.fir.kt +++ b/compiler/testData/diagnostics/tests/resolve/dslMarker/threeImplicitReceivers2.fir.kt @@ -36,7 +36,7 @@ fun test() { baz { y() - x() + x() with(D()) { x()