FIR: Get rid of relation from LevelHandler to FirTowerResolver

This commit is contained in:
Denis Zharkov
2020-03-27 15:34:48 +03:00
parent 123bcdb0ad
commit 36d3abad51
4 changed files with 17 additions and 15 deletions
@@ -51,7 +51,7 @@ class FirCallResolver(
}
private val towerResolver = FirTowerResolver(
returnTypeCalculator, components, resolutionStageRunner,
components, resolutionStageRunner,
)
private val conflictResolver =
@@ -6,11 +6,9 @@
package org.jetbrains.kotlin.fir.resolve.calls
import org.jetbrains.kotlin.fir.resolve.BodyResolveComponents
import org.jetbrains.kotlin.fir.resolve.transformers.ReturnTypeCalculator
class FirTowerResolver(
val typeCalculator: ReturnTypeCalculator,
val components: BodyResolveComponents,
private val components: BodyResolveComponents,
resolutionStageRunner: ResolutionStageRunner,
) {
private val collector = CandidateCollector(components, resolutionStageRunner)
@@ -61,8 +59,7 @@ class FirTowerResolver(
invokeReceiverCandidateFactory,
invokeBuiltinExtensionReceiverCandidateFactory,
stubReceiverCandidateFactory,
invokeReceiverCollector,
this
invokeReceiverCollector
)
}
@@ -83,7 +83,12 @@ class FirTowerResolverSession internal constructor(
): ProcessorAction {
manager.requestGroup(group)
val result = with(LevelHandler(callInfo, explicitReceiverKind, group, callResolutionContext, manager, this)) {
val levelHandler =
LevelHandler(
callInfo, explicitReceiverKind, group,
callResolutionContext, manager, this, components
)
val result = with(levelHandler) {
towerLevel.handleLevel(invokeResolveMode)
}
@@ -8,6 +8,7 @@ package org.jetbrains.kotlin.fir.resolve.calls
import org.jetbrains.kotlin.fir.expressions.FirExpression
import org.jetbrains.kotlin.fir.expressions.FirResolvedQualifier
import org.jetbrains.kotlin.fir.expressions.builder.FirQualifiedAccessExpressionBuilder
import org.jetbrains.kotlin.fir.resolve.BodyResolveComponents
import org.jetbrains.kotlin.fir.resolve.constructType
import org.jetbrains.kotlin.fir.resolve.transformQualifiedAccessUsingSmartcastInfo
import org.jetbrains.kotlin.fir.resolve.transformers.body.resolve.firUnsafe
@@ -30,8 +31,7 @@ internal class CallResolutionContext(
val invokeReceiverCandidateFactory: CandidateFactory?,
val invokeBuiltinExtensionReceiverCandidateFactory: CandidateFactory?,
val stubReceiverCandidateFactory: CandidateFactory?,
val invokeReceiverCollector: CandidateCollector?,
val towerResolver: FirTowerResolver
val invokeReceiverCollector: CandidateCollector?
) {
// TODO: Get rid of the property, storing state here looks like a hack
internal lateinit var invokeOnGivenReceiverCandidateFactory: CandidateFactory
@@ -43,11 +43,11 @@ internal class LevelHandler(
private val group: TowerGroup,
private val callResolutionContext: CallResolutionContext,
private val manager: TowerResolveManager,
private val towerResolverSession: FirTowerResolverSession
private val towerResolverSession: FirTowerResolverSession,
private val components: BodyResolveComponents
) {
private val resultCollector: CandidateCollector get() = callResolutionContext.resultCollector
private val towerResolver: FirTowerResolver get() = callResolutionContext.towerResolver
private fun enqueueResolverTask(group: TowerGroup = TowerGroup.Start, task: suspend () -> Unit) =
manager.enqueueResolverTask(group, task)
@@ -55,7 +55,7 @@ internal class LevelHandler(
private fun createExplicitReceiverForInvoke(candidate: Candidate): FirQualifiedAccessExpressionBuilder {
val (name, typeRef) = when (val symbol = candidate.symbol) {
is FirCallableSymbol<*> -> {
symbol.callableId.callableName to towerResolver.typeCalculator.tryCalculateReturnType(symbol.firUnsafe())
symbol.callableId.callableName to components.returnTypeCalculator.tryCalculateReturnType(symbol.firUnsafe())
}
is FirRegularClassSymbol -> {
symbol.classId.shortClassName to buildResolvedTypeRef {
@@ -170,7 +170,7 @@ internal class LevelHandler(
if (symbol !is FirCallableSymbol<*> && symbol !is FirRegularClassSymbol) continue
val isExtensionFunctionType =
(symbol as? FirCallableSymbol<*>)?.fir?.returnTypeRef?.isExtensionFunctionType(towerResolver.components.session) == true
(symbol as? FirCallableSymbol<*>)?.fir?.returnTypeRef?.isExtensionFunctionType(components.session) == true
if (invokeBuiltinExtensionMode && !isExtensionFunctionType) {
continue
@@ -188,7 +188,7 @@ internal class LevelHandler(
it.explicitReceiver = info.explicitReceiver
it.safe = info.isSafeCall
}
towerResolver.components.transformQualifiedAccessUsingSmartcastInfo(it.build())
components.transformQualifiedAccessUsingSmartcastInfo(it.build())
}
val invokeFunctionInfo =
@@ -200,7 +200,7 @@ internal class LevelHandler(
}
val explicitReceiver = ExpressionReceiverValue(invokeReceiverExpression)
callResolutionContext.invokeOnGivenReceiverCandidateFactory = CandidateFactory(towerResolver.components, invokeFunctionInfo)
callResolutionContext.invokeOnGivenReceiverCandidateFactory = CandidateFactory(components, invokeFunctionInfo)
when {
invokeBuiltinExtensionMode -> {
enqueueResolverTask {