From f4b3e9b4b2f64c0ae0acdc7f95d2e1abec92013b Mon Sep 17 00:00:00 2001 From: Mikhail Glukhikh Date: Tue, 14 Jan 2020 13:04:17 +0300 Subject: [PATCH] [FIR] Fix qualifier handling by FirQualifierNameResolver --- .../jetbrains/kotlin/fir/FirCallResolver.kt | 23 +++++++++++-------- .../kotlin/fir/FirQualifiedNameResolver.kt | 4 ++++ 2 files changed, 18 insertions(+), 9 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 15673eaa9b5..e8a4e45e128 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/FirCallResolver.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/FirCallResolver.kt @@ -150,7 +150,9 @@ class FirCallResolver( @Suppress("NAME_SHADOWING") val qualifiedAccess = qualifiedAccess.transformExplicitReceiver(transformer, ResolutionMode.ContextIndependent) - qualifiedResolver.replacedQualifier(qualifiedAccess)?.let { return it } + qualifiedResolver.replacedQualifier(qualifiedAccess)?.let { resolvedQualifierPart -> + return resolvedQualifierPart + } val info = CallInfo( CallKind.VariableAccess, @@ -182,10 +184,17 @@ class FirCallResolver( result.currentApplicability ) - if (qualifiedAccess.explicitReceiver == null && - (reducedCandidates.size <= 1 && result.currentApplicability < CandidateApplicability.SYNTHETIC_RESOLVED) - ) { - qualifiedResolver.tryResolveAsQualifier(qualifiedAccess.source)?.let { return it } + if (qualifiedAccess.explicitReceiver == null) { + if (result.currentApplicability < CandidateApplicability.SYNTHETIC_RESOLVED + ) { + // We should run QualifierResolver if no successful candidates are available + // Otherwise expression (even ambiguous) beat qualifier + qualifiedResolver.tryResolveAsQualifier(qualifiedAccess.source)?.let { resolvedQualifier -> + return resolvedQualifier + } + } else { + qualifiedResolver.reset() + } } val referencedSymbol = when (nameReference) { @@ -194,10 +203,6 @@ class FirCallResolver( else -> null } - if (qualifiedAccess.explicitReceiver == null) { - qualifiedResolver.reset() - } - when { referencedSymbol is FirClassLikeSymbol<*> -> { val classId = referencedSymbol.classId diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/FirQualifiedNameResolver.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/FirQualifiedNameResolver.kt index 21e8a2b815e..3d1917f0393 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/FirQualifiedNameResolver.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/FirQualifiedNameResolver.kt @@ -25,6 +25,7 @@ class FirQualifiedNameResolver(components: BodyResolveComponents) : BodyResolveC fun reset() { qualifierStack.clear() + qualifierPartsToDrop = 0 } fun initProcessingQualifiedAccess(qualifiedAccess: FirQualifiedAccess, callee: FirSimpleNamedReference) { @@ -44,6 +45,9 @@ class FirQualifiedNameResolver(components: BodyResolveComponents) : BodyResolveC } fun tryResolveAsQualifier(source: FirSourceElement?): FirResolvedQualifier? { + if (qualifierStack.isEmpty()) { + return null + } val symbolProvider = session.firSymbolProvider var qualifierParts = qualifierStack.asReversed().map { it.asString() } var resolved: PackageOrClass?