FIR: Get rid of lateinit property in CandidateFactoriesAndCollectors

This commit is contained in:
Denis Zharkov
2020-03-30 10:10:04 +03:00
parent 80c64207f7
commit 90d82e201e
2 changed files with 28 additions and 24 deletions
@@ -86,7 +86,8 @@ class FirTowerResolverSession internal constructor(
callInfo: CallInfo, callInfo: CallInfo,
group: TowerGroup, group: TowerGroup,
explicitReceiverKind: ExplicitReceiverKind = ExplicitReceiverKind.NO_EXPLICIT_RECEIVER, explicitReceiverKind: ExplicitReceiverKind = ExplicitReceiverKind.NO_EXPLICIT_RECEIVER,
invokeResolveMode: InvokeResolveMode? = null invokeResolveMode: InvokeResolveMode? = null,
candidateFactory: CandidateFactory = candidateFactoriesAndCollectors.candidateFactory
): ProcessorAction { ): ProcessorAction {
manager.requestGroup(group) manager.requestGroup(group)
@@ -96,7 +97,7 @@ class FirTowerResolverSession internal constructor(
return levelHandler.handleLevel( return levelHandler.handleLevel(
callInfo, explicitReceiverKind, group, callInfo, explicitReceiverKind, group,
candidateFactoriesAndCollectors, towerLevel, invokeResolveMode candidateFactoriesAndCollectors, towerLevel, invokeResolveMode, candidateFactory
) { ) {
enqueueResolverTasksForInvokeReceiverCandidates( enqueueResolverTasksForInvokeReceiverCandidates(
invokeResolveMode, callInfo invokeResolveMode, callInfo
@@ -475,13 +476,15 @@ class FirTowerResolverSession internal constructor(
private suspend fun runResolverForInvoke( private suspend fun runResolverForInvoke(
info: CallInfo, info: CallInfo,
invokeReceiverValue: ExpressionReceiverValue invokeReceiverValue: ExpressionReceiverValue,
invokeOnGivenReceiverCandidateFactory: CandidateFactory
) { ) {
processLevel( processLevel(
invokeReceiverValue.toMemberScopeTowerLevel(), invokeReceiverValue.toMemberScopeTowerLevel(),
info, TowerGroup.Member, info, TowerGroup.Member,
ExplicitReceiverKind.DISPATCH_RECEIVER, ExplicitReceiverKind.DISPATCH_RECEIVER,
InvokeResolveMode.IMPLICIT_CALL_ON_GIVEN_RECEIVER InvokeResolveMode.IMPLICIT_CALL_ON_GIVEN_RECEIVER,
invokeOnGivenReceiverCandidateFactory
) )
for ((index, localScope) in localScopes.withIndex()) { for ((index, localScope) in localScopes.withIndex()) {
@@ -489,7 +492,8 @@ class FirTowerResolverSession internal constructor(
localScope.toScopeTowerLevel(extensionReceiver = invokeReceiverValue), localScope.toScopeTowerLevel(extensionReceiver = invokeReceiverValue),
info, TowerGroup.Local(index), info, TowerGroup.Local(index),
ExplicitReceiverKind.EXTENSION_RECEIVER, ExplicitReceiverKind.EXTENSION_RECEIVER,
InvokeResolveMode.IMPLICIT_CALL_ON_GIVEN_RECEIVER InvokeResolveMode.IMPLICIT_CALL_ON_GIVEN_RECEIVER,
invokeOnGivenReceiverCandidateFactory
) )
} }
@@ -500,7 +504,8 @@ class FirTowerResolverSession internal constructor(
implicitReceiverValue.toMemberScopeTowerLevel(extensionReceiver = invokeReceiverValue), implicitReceiverValue.toMemberScopeTowerLevel(extensionReceiver = invokeReceiverValue),
info, parentGroup.Member, info, parentGroup.Member,
ExplicitReceiverKind.EXTENSION_RECEIVER, ExplicitReceiverKind.EXTENSION_RECEIVER,
InvokeResolveMode.IMPLICIT_CALL_ON_GIVEN_RECEIVER InvokeResolveMode.IMPLICIT_CALL_ON_GIVEN_RECEIVER,
invokeOnGivenReceiverCandidateFactory
) )
} }
@@ -509,7 +514,8 @@ class FirTowerResolverSession internal constructor(
topLevelScope.toScopeTowerLevel(extensionReceiver = invokeReceiverValue), topLevelScope.toScopeTowerLevel(extensionReceiver = invokeReceiverValue),
info, TowerGroup.Top(index), info, TowerGroup.Top(index),
ExplicitReceiverKind.EXTENSION_RECEIVER, ExplicitReceiverKind.EXTENSION_RECEIVER,
InvokeResolveMode.IMPLICIT_CALL_ON_GIVEN_RECEIVER InvokeResolveMode.IMPLICIT_CALL_ON_GIVEN_RECEIVER,
invokeOnGivenReceiverCandidateFactory
) )
} }
} }
@@ -517,20 +523,23 @@ class FirTowerResolverSession internal constructor(
// Here we already know extension receiver for invoke, and it's stated in info as first argument // Here we already know extension receiver for invoke, and it's stated in info as first argument
private suspend fun runResolverForBuiltinInvokeExtensionWithExplicitArgument( private suspend fun runResolverForBuiltinInvokeExtensionWithExplicitArgument(
info: CallInfo, info: CallInfo,
invokeReceiverValue: ExpressionReceiverValue invokeReceiverValue: ExpressionReceiverValue,
invokeOnGivenReceiverCandidateFactory: CandidateFactory
) { ) {
processLevel( processLevel(
invokeReceiverValue.toMemberScopeTowerLevel(), invokeReceiverValue.toMemberScopeTowerLevel(),
info, TowerGroup.Member, info, TowerGroup.Member,
ExplicitReceiverKind.DISPATCH_RECEIVER, ExplicitReceiverKind.DISPATCH_RECEIVER,
InvokeResolveMode.IMPLICIT_CALL_ON_GIVEN_RECEIVER InvokeResolveMode.IMPLICIT_CALL_ON_GIVEN_RECEIVER,
invokeOnGivenReceiverCandidateFactory
) )
} }
// Here we don't know extension receiver for invoke, assuming it's one of implicit receivers // Here we don't know extension receiver for invoke, assuming it's one of implicit receivers
private suspend fun runResolverForBuiltinInvokeExtensionWithImplicitArgument( private suspend fun runResolverForBuiltinInvokeExtensionWithImplicitArgument(
info: CallInfo, info: CallInfo,
invokeReceiverValue: ExpressionReceiverValue invokeReceiverValue: ExpressionReceiverValue,
invokeOnGivenReceiverCandidateFactory: CandidateFactory
) { ) {
for ((implicitReceiverValue, depth) in implicitReceiversUsableAsValues) { for ((implicitReceiverValue, depth) in implicitReceiversUsableAsValues) {
val parentGroup = TowerGroup.Implicit(depth) val parentGroup = TowerGroup.Implicit(depth)
@@ -541,7 +550,8 @@ class FirTowerResolverSession internal constructor(
), ),
info, parentGroup.InvokeExtension, info, parentGroup.InvokeExtension,
ExplicitReceiverKind.DISPATCH_RECEIVER, ExplicitReceiverKind.DISPATCH_RECEIVER,
InvokeResolveMode.IMPLICIT_CALL_ON_GIVEN_RECEIVER InvokeResolveMode.IMPLICIT_CALL_ON_GIVEN_RECEIVER,
invokeOnGivenReceiverCandidateFactory
) )
} }
} }
@@ -587,7 +597,6 @@ class FirTowerResolverSession internal constructor(
} }
val explicitReceiver = ExpressionReceiverValue(invokeReceiverExpression) val explicitReceiver = ExpressionReceiverValue(invokeReceiverExpression)
candidateFactoriesAndCollectors.invokeOnGivenReceiverCandidateFactory = CandidateFactory(components, invokeFunctionInfo)
enqueueResolverTasksForInvoke( enqueueResolverTasksForInvoke(
invokeFunctionInfo, invokeFunctionInfo,
explicitReceiver, explicitReceiver,
@@ -603,10 +612,11 @@ class FirTowerResolverSession internal constructor(
invokeBuiltinExtensionMode: Boolean, invokeBuiltinExtensionMode: Boolean,
useImplicitReceiverAsBuiltinInvokeArgument: Boolean useImplicitReceiverAsBuiltinInvokeArgument: Boolean
) { ) {
val invokeOnGivenReceiverCandidateFactory = CandidateFactory(components, invokeFunctionInfo)
if (invokeBuiltinExtensionMode) { if (invokeBuiltinExtensionMode) {
manager.enqueueResolverTask { manager.enqueueResolverTask {
runResolverForBuiltinInvokeExtensionWithExplicitArgument( runResolverForBuiltinInvokeExtensionWithExplicitArgument(
invokeFunctionInfo, explicitReceiver invokeFunctionInfo, explicitReceiver, invokeOnGivenReceiverCandidateFactory
) )
} }
@@ -616,14 +626,14 @@ class FirTowerResolverSession internal constructor(
if (useImplicitReceiverAsBuiltinInvokeArgument) { if (useImplicitReceiverAsBuiltinInvokeArgument) {
manager.enqueueResolverTask { manager.enqueueResolverTask {
runResolverForBuiltinInvokeExtensionWithImplicitArgument( runResolverForBuiltinInvokeExtensionWithImplicitArgument(
invokeFunctionInfo, explicitReceiver invokeFunctionInfo, explicitReceiver, invokeOnGivenReceiverCandidateFactory
) )
} }
} }
manager.enqueueResolverTask { manager.enqueueResolverTask {
runResolverForInvoke( runResolverForInvoke(
invokeFunctionInfo, explicitReceiver invokeFunctionInfo, explicitReceiver, invokeOnGivenReceiverCandidateFactory
) )
} }
} }
@@ -24,10 +24,7 @@ internal class CandidateFactoriesAndCollectors(
val invokeReceiverCandidateFactory: CandidateFactory?, val invokeReceiverCandidateFactory: CandidateFactory?,
val invokeReceiverCollector: CandidateCollector?, val invokeReceiverCollector: CandidateCollector?,
val invokeBuiltinExtensionReceiverCandidateFactory: CandidateFactory? val invokeBuiltinExtensionReceiverCandidateFactory: CandidateFactory?
) { )
// TODO: Get rid of the property, storing state here looks like a hack
internal lateinit var invokeOnGivenReceiverCandidateFactory: CandidateFactory
}
typealias EnqueueTasksForInvokeReceiverCandidates = () -> Unit typealias EnqueueTasksForInvokeReceiverCandidates = () -> Unit
@@ -43,6 +40,7 @@ internal class LevelHandler {
candidateFactoriesAndCollectors: CandidateFactoriesAndCollectors, candidateFactoriesAndCollectors: CandidateFactoriesAndCollectors,
towerLevel: SessionBasedTowerLevel, towerLevel: SessionBasedTowerLevel,
invokeResolveMode: InvokeResolveMode?, invokeResolveMode: InvokeResolveMode?,
candidateFactory: CandidateFactory,
enqueueResolverTasksForInvokeReceiverCandidates: EnqueueTasksForInvokeReceiverCandidates enqueueResolverTasksForInvokeReceiverCandidates: EnqueueTasksForInvokeReceiverCandidates
): ProcessorAction { ): ProcessorAction {
val resultCollector = candidateFactoriesAndCollectors.resultCollector val resultCollector = candidateFactoriesAndCollectors.resultCollector
@@ -51,11 +49,7 @@ internal class LevelHandler {
info.explicitReceiver, info.explicitReceiver,
explicitReceiverKind, explicitReceiverKind,
resultCollector, resultCollector,
// TODO: performance? candidateFactory,
if (invokeResolveMode == InvokeResolveMode.IMPLICIT_CALL_ON_GIVEN_RECEIVER)
candidateFactoriesAndCollectors.invokeOnGivenReceiverCandidateFactory
else
candidateFactoriesAndCollectors.candidateFactory,
group group
) )
when (info.callKind) { when (info.callKind) {