[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") @Suppress("NAME_SHADOWING")
val qualifiedAccess = qualifiedAccess.transformExplicitReceiver(transformer, ResolutionMode.ContextIndependent) val qualifiedAccess = qualifiedAccess.transformExplicitReceiver(transformer, ResolutionMode.ContextIndependent)
qualifiedResolver.replacedQualifier(qualifiedAccess)?.let { return it } qualifiedResolver.replacedQualifier(qualifiedAccess)?.let { resolvedQualifierPart ->
return resolvedQualifierPart
}
val info = CallInfo( val info = CallInfo(
CallKind.VariableAccess, CallKind.VariableAccess,
@@ -182,10 +184,17 @@ class FirCallResolver(
result.currentApplicability result.currentApplicability
) )
if (qualifiedAccess.explicitReceiver == null && if (qualifiedAccess.explicitReceiver == null) {
(reducedCandidates.size <= 1 && result.currentApplicability < CandidateApplicability.SYNTHETIC_RESOLVED) if (result.currentApplicability < CandidateApplicability.SYNTHETIC_RESOLVED
) { ) {
qualifiedResolver.tryResolveAsQualifier(qualifiedAccess.source)?.let { return it } // 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) { val referencedSymbol = when (nameReference) {
@@ -194,10 +203,6 @@ class FirCallResolver(
else -> null else -> null
} }
if (qualifiedAccess.explicitReceiver == null) {
qualifiedResolver.reset()
}
when { when {
referencedSymbol is FirClassLikeSymbol<*> -> { referencedSymbol is FirClassLikeSymbol<*> -> {
val classId = referencedSymbol.classId val classId = referencedSymbol.classId
@@ -25,6 +25,7 @@ class FirQualifiedNameResolver(components: BodyResolveComponents) : BodyResolveC
fun reset() { fun reset() {
qualifierStack.clear() qualifierStack.clear()
qualifierPartsToDrop = 0
} }
fun initProcessingQualifiedAccess(qualifiedAccess: FirQualifiedAccess, callee: FirSimpleNamedReference) { fun initProcessingQualifiedAccess(qualifiedAccess: FirQualifiedAccess, callee: FirSimpleNamedReference) {
@@ -44,6 +45,9 @@ class FirQualifiedNameResolver(components: BodyResolveComponents) : BodyResolveC
} }
fun tryResolveAsQualifier(source: FirSourceElement?): FirResolvedQualifier? { fun tryResolveAsQualifier(source: FirSourceElement?): FirResolvedQualifier? {
if (qualifierStack.isEmpty()) {
return null
}
val symbolProvider = session.firSymbolProvider val symbolProvider = session.firSymbolProvider
var qualifierParts = qualifierStack.asReversed().map { it.asString() } var qualifierParts = qualifierStack.asReversed().map { it.asString() }
var resolved: PackageOrClass? var resolved: PackageOrClass?