FIR: Refactor ResolvedCallableReferenceAtom

^KT-32725 In Progress
This commit is contained in:
Denis Zharkov
2019-10-23 14:12:43 +03:00
parent fe8cd195aa
commit 5e322a2dd9
4 changed files with 6 additions and 13 deletions
@@ -221,7 +221,7 @@ class FirCallResolver(
constraintSystemBuilder: ConstraintSystemBuilder, constraintSystemBuilder: ConstraintSystemBuilder,
resolvedCallableReferenceAtom: ResolvedCallableReferenceAtom resolvedCallableReferenceAtom: ResolvedCallableReferenceAtom
): Boolean { ): Boolean {
val callableReferenceAccess = resolvedCallableReferenceAtom.atom val callableReferenceAccess = resolvedCallableReferenceAtom.reference
val lhs = resolvedCallableReferenceAtom.lhs val lhs = resolvedCallableReferenceAtom.lhs
val coneSubstitutor = constraintSystemBuilder.buildCurrentSubstitutor() as ConeSubstitutor val coneSubstitutor = constraintSystemBuilder.buildCurrentSubstitutor() as ConeSubstitutor
val expectedType = resolvedCallableReferenceAtom.expectedType?.let(coneSubstitutor::substituteOrSelf) val expectedType = resolvedCallableReferenceAtom.expectedType?.let(coneSubstitutor::substituteOrSelf)
@@ -50,7 +50,7 @@ fun Candidate.preprocessCallableReference(
expectedType: ConeKotlinType expectedType: ConeKotlinType
) { ) {
val lhs = bodyResolveComponents.doubleColonExpressionResolver.resolveDoubleColonLHS(argument) val lhs = bodyResolveComponents.doubleColonExpressionResolver.resolveDoubleColonLHS(argument)
postponedAtoms += EagerCallableReferenceAtom(argument, expectedType, lhs) postponedAtoms += ResolvedCallableReferenceAtom(argument, expectedType, lhs)
} }
val ConeKotlinType.isBuiltinFunctionalType: Boolean val ConeKotlinType.isBuiltinFunctionalType: Boolean
@@ -207,8 +207,8 @@ class ResolvedLambdaAtom(
override val outputType: ConeKotlinType get() = returnType override val outputType: ConeKotlinType get() = returnType
} }
abstract class ResolvedCallableReferenceAtom( class ResolvedCallableReferenceAtom(
val atom: FirCallableReferenceAccess, val reference: FirCallableReferenceAccess,
val expectedType: ConeKotlinType?, val expectedType: ConeKotlinType?,
val lhs: DoubleColonLHS? val lhs: DoubleColonLHS?
) : PostponedResolvedAtomMarker { ) : PostponedResolvedAtomMarker {
@@ -216,13 +216,6 @@ abstract class ResolvedCallableReferenceAtom(
var postponed: Boolean = false var postponed: Boolean = false
var resultingCandidate: Pair<Candidate, CandidateApplicability>? = null var resultingCandidate: Pair<Candidate, CandidateApplicability>? = null
}
class EagerCallableReferenceAtom(
atom: FirCallableReferenceAccess,
expectedType: ConeKotlinType?,
lhs: DoubleColonLHS?
) : ResolvedCallableReferenceAtom(atom, expectedType, lhs) {
override val inputTypes: Collection<ConeKotlinType> override val inputTypes: Collection<ConeKotlinType>
get() { get() {
@@ -76,7 +76,7 @@ class PostponedArgumentsAnalyzer(
callResolver.resolveCallableReference(candidate.csBuilder, atom) callResolver.resolveCallableReference(candidate.csBuilder, atom)
} }
val callableReferenceAccess = atom.atom val callableReferenceAccess = atom.reference
atom.analyzed = true atom.analyzed = true
val (candidate, applicability) = atom.resultingCandidate ?: Pair(null, CandidateApplicability.INAPPLICABLE) val (candidate, applicability) = atom.resultingCandidate ?: Pair(null, CandidateApplicability.INAPPLICABLE)
@@ -164,7 +164,7 @@ internal object CheckArguments : CheckerStage() {
internal object EagerResolveOfCallableReferences : CheckerStage() { internal object EagerResolveOfCallableReferences : CheckerStage() {
override suspend fun check(candidate: Candidate, sink: CheckerSink, callInfo: CallInfo) { override suspend fun check(candidate: Candidate, sink: CheckerSink, callInfo: CallInfo) {
for (atom in candidate.postponedAtoms.filterIsInstance<EagerCallableReferenceAtom>()) { for (atom in candidate.postponedAtoms.filterIsInstance<ResolvedCallableReferenceAtom>()) {
if (!candidate.bodyResolveComponents.callResolver.resolveCallableReference(candidate.csBuilder, atom)) { if (!candidate.bodyResolveComponents.callResolver.resolveCallableReference(candidate.csBuilder, atom)) {
sink.yieldApplicability(CandidateApplicability.INAPPLICABLE) sink.yieldApplicability(CandidateApplicability.INAPPLICABLE)
} }