FirCallResolver: perform completion for var access with ILT receiver

#KT-38473 Fixed
This commit is contained in:
Mikhail Glukhikh
2020-04-27 16:30:38 +03:00
parent b0b198119d
commit d910a4cf23
@@ -77,6 +77,7 @@ class FirCallResolver(
name, name,
result.candidates, result.candidates,
result.applicability, result.applicability,
functionCall.explicitReceiver,
) )
val resultExpression = functionCall.transformCalleeReference(StoreNameReference, nameReference) val resultExpression = functionCall.transformCalleeReference(StoreNameReference, nameReference)
@@ -168,6 +169,7 @@ class FirCallResolver(
callee.name, callee.name,
reducedCandidates, reducedCandidates,
result.applicability, result.applicability,
qualifiedAccess.explicitReceiver,
) )
if (qualifiedAccess.explicitReceiver == null) { if (qualifiedAccess.explicitReceiver == null) {
@@ -353,6 +355,7 @@ class FirCallResolver(
name: Name, name: Name,
candidates: Collection<Candidate>, candidates: Collection<Candidate>,
applicability: CandidateApplicability, applicability: CandidateApplicability,
explicitReceiver: FirExpression? = null,
): FirNamedReference { ): FirNamedReference {
val source = reference.source val source = reference.source
return when { return when {
@@ -377,24 +380,26 @@ class FirCallResolver(
candidates.size == 1 -> { candidates.size == 1 -> {
val candidate = candidates.single() val candidate = candidates.single()
val coneSymbol = candidate.symbol val coneSymbol = candidate.symbol
when { if (coneSymbol is FirBackingFieldSymbol) {
coneSymbol is FirBackingFieldSymbol -> buildBackingFieldReference { return buildBackingFieldReference {
this.source = source this.source = source
resolvedSymbol = coneSymbol resolvedSymbol = coneSymbol
} }
coneSymbol is FirVariableSymbol && (
coneSymbol !is FirPropertySymbol ||
(coneSymbol.phasedFir() as FirMemberDeclaration).typeParameters.isEmpty()
)
-> buildResolvedNamedReference {
this.source = source
this.name = name
resolvedSymbol = coneSymbol
}
else -> FirNamedReferenceWithCandidate(source, name, candidate)
} }
if (explicitReceiver?.typeRef?.coneTypeSafe<ConeIntegerLiteralType>() == null) {
if (coneSymbol is FirVariableSymbol) {
if (coneSymbol !is FirPropertySymbol ||
(coneSymbol.phasedFir() as FirMemberDeclaration).typeParameters.isEmpty()
) {
return buildResolvedNamedReference {
this.source = source
this.name = name
resolvedSymbol = coneSymbol
}
}
}
}
FirNamedReferenceWithCandidate(source, name, candidate)
} }
else -> buildErrorNamedReference { else -> buildErrorNamedReference {
this.source = source this.source = source