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( private val towerResolver = FirTowerResolver(
returnTypeCalculator, components, resolutionStageRunner, components, resolutionStageRunner,
) )
private val conflictResolver = private val conflictResolver =
@@ -6,11 +6,9 @@
package org.jetbrains.kotlin.fir.resolve.calls package org.jetbrains.kotlin.fir.resolve.calls
import org.jetbrains.kotlin.fir.resolve.BodyResolveComponents import org.jetbrains.kotlin.fir.resolve.BodyResolveComponents
import org.jetbrains.kotlin.fir.resolve.transformers.ReturnTypeCalculator
class FirTowerResolver( class FirTowerResolver(
val typeCalculator: ReturnTypeCalculator, private val components: BodyResolveComponents,
val components: BodyResolveComponents,
resolutionStageRunner: ResolutionStageRunner, resolutionStageRunner: ResolutionStageRunner,
) { ) {
private val collector = CandidateCollector(components, resolutionStageRunner) private val collector = CandidateCollector(components, resolutionStageRunner)
@@ -61,8 +59,7 @@ class FirTowerResolver(
invokeReceiverCandidateFactory, invokeReceiverCandidateFactory,
invokeBuiltinExtensionReceiverCandidateFactory, invokeBuiltinExtensionReceiverCandidateFactory,
stubReceiverCandidateFactory, stubReceiverCandidateFactory,
invokeReceiverCollector, invokeReceiverCollector
this
) )
} }
@@ -83,7 +83,12 @@ class FirTowerResolverSession internal constructor(
): ProcessorAction { ): ProcessorAction {
manager.requestGroup(group) 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) 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.FirExpression
import org.jetbrains.kotlin.fir.expressions.FirResolvedQualifier import org.jetbrains.kotlin.fir.expressions.FirResolvedQualifier
import org.jetbrains.kotlin.fir.expressions.builder.FirQualifiedAccessExpressionBuilder 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.constructType
import org.jetbrains.kotlin.fir.resolve.transformQualifiedAccessUsingSmartcastInfo import org.jetbrains.kotlin.fir.resolve.transformQualifiedAccessUsingSmartcastInfo
import org.jetbrains.kotlin.fir.resolve.transformers.body.resolve.firUnsafe import org.jetbrains.kotlin.fir.resolve.transformers.body.resolve.firUnsafe
@@ -30,8 +31,7 @@ internal class CallResolutionContext(
val invokeReceiverCandidateFactory: CandidateFactory?, val invokeReceiverCandidateFactory: CandidateFactory?,
val invokeBuiltinExtensionReceiverCandidateFactory: CandidateFactory?, val invokeBuiltinExtensionReceiverCandidateFactory: CandidateFactory?,
val stubReceiverCandidateFactory: CandidateFactory?, val stubReceiverCandidateFactory: CandidateFactory?,
val invokeReceiverCollector: CandidateCollector?, val invokeReceiverCollector: CandidateCollector?
val towerResolver: FirTowerResolver
) { ) {
// TODO: Get rid of the property, storing state here looks like a hack // TODO: Get rid of the property, storing state here looks like a hack
internal lateinit var invokeOnGivenReceiverCandidateFactory: CandidateFactory internal lateinit var invokeOnGivenReceiverCandidateFactory: CandidateFactory
@@ -43,11 +43,11 @@ internal class LevelHandler(
private val group: TowerGroup, private val group: TowerGroup,
private val callResolutionContext: CallResolutionContext, private val callResolutionContext: CallResolutionContext,
private val manager: TowerResolveManager, 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 resultCollector: CandidateCollector get() = callResolutionContext.resultCollector
private val towerResolver: FirTowerResolver get() = callResolutionContext.towerResolver
private fun enqueueResolverTask(group: TowerGroup = TowerGroup.Start, task: suspend () -> Unit) = private fun enqueueResolverTask(group: TowerGroup = TowerGroup.Start, task: suspend () -> Unit) =
manager.enqueueResolverTask(group, task) manager.enqueueResolverTask(group, task)
@@ -55,7 +55,7 @@ internal class LevelHandler(
private fun createExplicitReceiverForInvoke(candidate: Candidate): FirQualifiedAccessExpressionBuilder { private fun createExplicitReceiverForInvoke(candidate: Candidate): FirQualifiedAccessExpressionBuilder {
val (name, typeRef) = when (val symbol = candidate.symbol) { val (name, typeRef) = when (val symbol = candidate.symbol) {
is FirCallableSymbol<*> -> { is FirCallableSymbol<*> -> {
symbol.callableId.callableName to towerResolver.typeCalculator.tryCalculateReturnType(symbol.firUnsafe()) symbol.callableId.callableName to components.returnTypeCalculator.tryCalculateReturnType(symbol.firUnsafe())
} }
is FirRegularClassSymbol -> { is FirRegularClassSymbol -> {
symbol.classId.shortClassName to buildResolvedTypeRef { symbol.classId.shortClassName to buildResolvedTypeRef {
@@ -170,7 +170,7 @@ internal class LevelHandler(
if (symbol !is FirCallableSymbol<*> && symbol !is FirRegularClassSymbol) continue if (symbol !is FirCallableSymbol<*> && symbol !is FirRegularClassSymbol) continue
val isExtensionFunctionType = val isExtensionFunctionType =
(symbol as? FirCallableSymbol<*>)?.fir?.returnTypeRef?.isExtensionFunctionType(towerResolver.components.session) == true (symbol as? FirCallableSymbol<*>)?.fir?.returnTypeRef?.isExtensionFunctionType(components.session) == true
if (invokeBuiltinExtensionMode && !isExtensionFunctionType) { if (invokeBuiltinExtensionMode && !isExtensionFunctionType) {
continue continue
@@ -188,7 +188,7 @@ internal class LevelHandler(
it.explicitReceiver = info.explicitReceiver it.explicitReceiver = info.explicitReceiver
it.safe = info.isSafeCall it.safe = info.isSafeCall
} }
towerResolver.components.transformQualifiedAccessUsingSmartcastInfo(it.build()) components.transformQualifiedAccessUsingSmartcastInfo(it.build())
} }
val invokeFunctionInfo = val invokeFunctionInfo =
@@ -200,7 +200,7 @@ internal class LevelHandler(
} }
val explicitReceiver = ExpressionReceiverValue(invokeReceiverExpression) val explicitReceiver = ExpressionReceiverValue(invokeReceiverExpression)
callResolutionContext.invokeOnGivenReceiverCandidateFactory = CandidateFactory(towerResolver.components, invokeFunctionInfo) callResolutionContext.invokeOnGivenReceiverCandidateFactory = CandidateFactory(components, invokeFunctionInfo)
when { when {
invokeBuiltinExtensionMode -> { invokeBuiltinExtensionMode -> {
enqueueResolverTask { enqueueResolverTask {