[FIR] Fix qualifier handling by FirQualifierNameResolver
This commit is contained in:
@@ -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?
|
||||||
|
|||||||
Reference in New Issue
Block a user