FIR: don't recreate tower resolver / conflict resolver / call completer

This commit is contained in:
Mikhail Glukhikh
2019-10-07 10:54:33 +03:00
parent 9801e06eac
commit 708d914224
3 changed files with 20 additions and 17 deletions
@@ -32,12 +32,19 @@ import org.jetbrains.kotlin.resolve.calls.results.TypeSpecificityComparator
class FirCallResolver(
private val transformer: FirBodyResolveTransformer,
private val topLevelScopes: List<FirScope>,
private val localScopes: List<FirLocalScope>,
topLevelScopes: List<FirScope>,
localScopes: List<FirLocalScope>,
override val implicitReceiverStack: ImplicitReceiverStack,
private val qualifiedResolver: FirQualifiedNameResolver
) : BodyResolveComponents by transformer {
private val towerResolver = FirTowerResolver(
returnTypeCalculator, this, resolutionStageRunner,
topLevelScopes = topLevelScopes.asReversed(),
localScopes = localScopes.asReversed()
)
private val conflictResolver = ConeOverloadConflictResolver(TypeSpecificityComparator.NONE, inferenceComponents)
fun resolveCallAndSelectCandidate(functionCall: FirFunctionCall, expectedTypeRef: FirTypeRef?, file: FirFile): FirFunctionCall {
qualifiedResolver.reset()
@Suppress("NAME_SHADOWING")
@@ -60,11 +67,7 @@ class FirCallResolver(
file,
transformer.container
) { it.resultType }
val towerResolver = FirTowerResolver(
returnTypeCalculator, this, resolutionStageRunner,
topLevelScopes = topLevelScopes.asReversed(),
localScopes = localScopes.asReversed()
)
towerResolver.reset()
val consumer = createFunctionConsumer(session, name, info, this, towerResolver.collector, towerResolver)
val result = towerResolver.runResolver(consumer, implicitReceiverStack.receiversAsReversed())
@@ -72,8 +75,7 @@ class FirCallResolver(
val reducedCandidates = if (result.currentApplicability < CandidateApplicability.SYNTHETIC_RESOLVED) {
bestCandidates.toSet()
} else {
ConeOverloadConflictResolver(TypeSpecificityComparator.NONE, inferenceComponents)
.chooseMaximallySpecificCandidates(bestCandidates, discriminateGenerics = false)
conflictResolver.chooseMaximallySpecificCandidates(bestCandidates, discriminateGenerics = false)
}
@@ -154,11 +156,7 @@ class FirCallResolver(
file,
transformer.container
) { it.resultType }
val towerResolver = FirTowerResolver(
returnTypeCalculator, this, resolutionStageRunner,
topLevelScopes = topLevelScopes.asReversed(),
localScopes = localScopes.asReversed()
)
towerResolver.reset()
val consumer = createVariableAndObjectConsumer(
session,
@@ -22,7 +22,7 @@ enum class TowerDataKind {
class FirTowerResolver(
val typeCalculator: ReturnTypeCalculator,
val components: BodyResolveComponents,
private val resolutionStageRunner: ResolutionStageRunner,
resolutionStageRunner: ResolutionStageRunner,
val topLevelScopes: List<FirScope>,
val localScopes: List<FirLocalScope>
) {
@@ -137,7 +137,11 @@ class FirTowerResolver(
return group
}
val collector by lazy { CandidateCollector(components, resolutionStageRunner) }
fun reset() {
collector.newDataSet()
}
val collector = CandidateCollector(components, resolutionStageRunner)
private lateinit var towerDataConsumer: TowerDataConsumer
private lateinit var implicitReceiverValues: List<ImplicitReceiverValue<*>>
@@ -36,6 +36,8 @@ import org.jetbrains.kotlin.types.model.TypeVariableMarker
class FirCallCompleter(
private val transformer: FirBodyResolveTransformer
) : BodyResolveComponents by transformer {
private val completer = ConstraintSystemCompleter(inferenceComponents)
fun <T : FirResolvable> completeCall(call: T, expectedTypeRef: FirTypeRef?): T {
val typeRef = typeFromCallee(call)
if (typeRef.type is ConeKotlinErrorType) {
@@ -58,7 +60,6 @@ class FirCallCompleter(
}
val completionMode = candidate.computeCompletionMode(inferenceComponents, expectedTypeRef, initialType)
val completer = ConstraintSystemCompleter(inferenceComponents)
val replacements = mutableMapOf<FirExpression, FirExpression>()
val analyzer = PostponedArgumentsAnalyzer(LambdaAnalyzerImpl(replacements), { it.resultType }, inferenceComponents)