Introduce TowerResolver.Task class

Its main purpose is code simplification: ImplicitScopeTower::run
contains a lot of local functions that are needed because of
lots of shared state

So, we're moving the state to the Task class instead

NB: This change doesn't change the code of `run`, it will be done
in further commits
This commit is contained in:
Denis Zharkov
2017-08-24 15:40:45 +03:00
parent b77cc54122
commit c7fda42ccc
@@ -93,11 +93,21 @@ class TowerResolver {
): Collection<C> ): Collection<C>
= scopeTower.run(processor, AllCandidatesCollector(), false, name) = scopeTower.run(processor, AllCandidatesCollector(), false, name)
fun <C : Candidate> ImplicitScopeTower.run(
processor: ScopeTowerProcessor<C>,
resultCollector: ResultCollector<C>,
useOrder: Boolean,
name: Name
): Collection<C> = with(Task()) {
this@run.run(processor, resultCollector, useOrder, name)
}
private data class ScopeLevelsAndSkippedForLookups( private data class ScopeLevelsAndSkippedForLookups(
val levelsToProcess: Collection<ScopeTowerLevel>, val levelsToProcess: Collection<ScopeTowerLevel>,
val levelsToSkip: Collection<ScopeTowerLevel> val levelsToSkip: Collection<ScopeTowerLevel>
) )
private inner class Task {
private fun ImplicitScopeTower.createNonLocalLevels(name: Name): ScopeLevelsAndSkippedForLookups { private fun ImplicitScopeTower.createNonLocalLevels(name: Name): ScopeLevelsAndSkippedForLookups {
val mainResult = mutableListOf<ScopeTowerLevel>() val mainResult = mutableListOf<ScopeTowerLevel>()
val skippedLevels = mutableListOf<ScopeTowerLevel>() val skippedLevels = mutableListOf<ScopeTowerLevel>()
@@ -138,7 +148,7 @@ class TowerResolver {
return ScopeLevelsAndSkippedForLookups(mainResult, skippedLevels) return ScopeLevelsAndSkippedForLookups(mainResult, skippedLevels)
} }
private fun <C : Candidate> ImplicitScopeTower.run( fun <C : Candidate> ImplicitScopeTower.run(
processor: ScopeTowerProcessor<C>, processor: ScopeTowerProcessor<C>,
resultCollector: ResultCollector<C>, resultCollector: ResultCollector<C>,
useOrder: Boolean, useOrder: Boolean,
@@ -253,6 +263,7 @@ class TowerResolver {
private fun ResolutionScope.mayFitForName(name: Name) = private fun ResolutionScope.mayFitForName(name: Name) =
!definitelyDoesNotContainName(name) || !definitelyDoesNotContainName(OperatorNameConventions.INVOKE) !definitelyDoesNotContainName(name) || !definitelyDoesNotContainName(OperatorNameConventions.INVOKE)
}
fun <C : Candidate> runWithEmptyTowerData( fun <C : Candidate> runWithEmptyTowerData(
processor: ScopeTowerProcessor<C>, processor: ScopeTowerProcessor<C>,