diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/FirCallResolver.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/FirCallResolver.kt index f163ad0c966..772fd66164c 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/FirCallResolver.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/FirCallResolver.kt @@ -32,12 +32,19 @@ import org.jetbrains.kotlin.resolve.calls.results.TypeSpecificityComparator class FirCallResolver( private val transformer: FirBodyResolveTransformer, - private val topLevelScopes: List, - private val localScopes: List, + topLevelScopes: List, + localScopes: List, 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, diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/FirTowerResolver.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/FirTowerResolver.kt index ec86ffc19b3..53a5649e5e0 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/FirTowerResolver.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/FirTowerResolver.kt @@ -22,7 +22,7 @@ enum class TowerDataKind { class FirTowerResolver( val typeCalculator: ReturnTypeCalculator, val components: BodyResolveComponents, - private val resolutionStageRunner: ResolutionStageRunner, + resolutionStageRunner: ResolutionStageRunner, val topLevelScopes: List, val localScopes: List ) { @@ -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> diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/inference/FirCallCompleter.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/inference/FirCallCompleter.kt index 37409a83592..f3aa861ef0d 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/inference/FirCallCompleter.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/inference/FirCallCompleter.kt @@ -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 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() val analyzer = PostponedArgumentsAnalyzer(LambdaAnalyzerImpl(replacements), { it.resultType }, inferenceComponents)