From ef684c0dffc68fd73c217e496f96837881a9c13d Mon Sep 17 00:00:00 2001 From: "Denis.Zharkov" Date: Wed, 8 Sep 2021 11:45:08 +0300 Subject: [PATCH] FIR: Improve error reporting for EXPRESSION_EXPECTED_PACKAGE_FOUND --- .../resolve/expresssions/innerQualifier.fir.txt | 2 +- .../src/org/jetbrains/kotlin/fir/FirCallResolver.kt | 10 ++++++++-- .../tests/PackageInExpressionPosition.fir.kt | 5 +++-- .../diagnostics/tests/PackageInExpressionPosition.kt | 1 + 4 files changed, 13 insertions(+), 5 deletions(-) diff --git a/compiler/fir/analysis-tests/testData/resolve/expresssions/innerQualifier.fir.txt b/compiler/fir/analysis-tests/testData/resolve/expresssions/innerQualifier.fir.txt index 2cb5e764514..b01a138d56c 100644 --- a/compiler/fir/analysis-tests/testData/resolve/expresssions/innerQualifier.fir.txt +++ b/compiler/fir/analysis-tests/testData/resolve/expresssions/innerQualifier.fir.txt @@ -12,7 +12,7 @@ FILE: innerQualifier.kt } } - public final val x: R|kotlin/Unit| = R|kotlin/Unit| + public final val x: R|kotlin/Unit| = Q|Outer.Inner| public get(): R|kotlin/Unit| public final val klass: R|kotlin/reflect/KClass| = (Q|Outer.Inner|) public get(): R|kotlin/reflect/KClass| 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 b7a4e185b3e..f64e33b439f 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/FirCallResolver.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/FirCallResolver.kt @@ -232,7 +232,13 @@ class FirCallResolver( val qualifiedAccess = qualifiedAccess.transformExplicitReceiver() val nonFatalDiagnosticFromExpression = (qualifiedAccess as? FirPropertyAccessExpression)?.nonFatalDiagnostics - if (isUsedAsReceiver) { + val basicResult by lazy(LazyThreadSafetyMode.NONE) { + collectCandidates(qualifiedAccess, callee.name) + } + + // Even if it's not receiver, it makes sense to continue qualifier if resolution is unsuccessful + // just to try to resolve to package/class and then report meaningful error at FirStandaloneQualifierChecker + if (isUsedAsReceiver || !basicResult.applicability.isSuccess) { (qualifiedAccess.explicitReceiver as? FirResolvedQualifier) ?.continueQualifier( callee, @@ -244,7 +250,7 @@ class FirCallResolver( ?.let { return it } } - var result = collectCandidates(qualifiedAccess, callee.name) + var result = basicResult if (qualifiedAccess.explicitReceiver == null) { // Even if we successfully resolved to some companion/named object, we should re-try with qualifier resolution diff --git a/compiler/testData/diagnostics/tests/PackageInExpressionPosition.fir.kt b/compiler/testData/diagnostics/tests/PackageInExpressionPosition.fir.kt index 7e893e84337..11456837617 100644 --- a/compiler/testData/diagnostics/tests/PackageInExpressionPosition.fir.kt +++ b/compiler/testData/diagnostics/tests/PackageInExpressionPosition.fir.kt @@ -1,3 +1,4 @@ +// COMPARE_WITH_LIGHT_TREE package foo class X {} @@ -6,7 +7,7 @@ val s = java val ss = System val sss = X val x = "${System}" -val xs = java.lang +val xs = java.lang val xss = java.lang.System val xsss = foo.X val xssss = foo @@ -16,7 +17,7 @@ fun main() { java = null System = null System!! - java.lang.System = null + java.lang.System = null java.lang.System!! System is Int System() diff --git a/compiler/testData/diagnostics/tests/PackageInExpressionPosition.kt b/compiler/testData/diagnostics/tests/PackageInExpressionPosition.kt index 8b6a963d361..679754bcb5b 100644 --- a/compiler/testData/diagnostics/tests/PackageInExpressionPosition.kt +++ b/compiler/testData/diagnostics/tests/PackageInExpressionPosition.kt @@ -1,3 +1,4 @@ +// COMPARE_WITH_LIGHT_TREE package foo class X {}