[FIR] Fix qualifier handling by FirQualifierNameResolver

This commit is contained in:
Mikhail Glukhikh
2020-01-14 13:04:17 +03:00
parent ae774a0ab9
commit f4b3e9b4b2
2 changed files with 18 additions and 9 deletions
@@ -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
@@ -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?