FIR: don't recreate tower resolver / conflict resolver / call completer
This commit is contained in:
@@ -32,12 +32,19 @@ import org.jetbrains.kotlin.resolve.calls.results.TypeSpecificityComparator
|
|||||||
|
|
||||||
class FirCallResolver(
|
class FirCallResolver(
|
||||||
private val transformer: FirBodyResolveTransformer,
|
private val transformer: FirBodyResolveTransformer,
|
||||||
private val topLevelScopes: List<FirScope>,
|
topLevelScopes: List<FirScope>,
|
||||||
private val localScopes: List<FirLocalScope>,
|
localScopes: List<FirLocalScope>,
|
||||||
override val implicitReceiverStack: ImplicitReceiverStack,
|
override val implicitReceiverStack: ImplicitReceiverStack,
|
||||||
private val qualifiedResolver: FirQualifiedNameResolver
|
private val qualifiedResolver: FirQualifiedNameResolver
|
||||||
) : BodyResolveComponents by transformer {
|
) : 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 {
|
fun resolveCallAndSelectCandidate(functionCall: FirFunctionCall, expectedTypeRef: FirTypeRef?, file: FirFile): FirFunctionCall {
|
||||||
qualifiedResolver.reset()
|
qualifiedResolver.reset()
|
||||||
@Suppress("NAME_SHADOWING")
|
@Suppress("NAME_SHADOWING")
|
||||||
@@ -60,11 +67,7 @@ class FirCallResolver(
|
|||||||
file,
|
file,
|
||||||
transformer.container
|
transformer.container
|
||||||
) { it.resultType }
|
) { it.resultType }
|
||||||
val towerResolver = FirTowerResolver(
|
towerResolver.reset()
|
||||||
returnTypeCalculator, this, resolutionStageRunner,
|
|
||||||
topLevelScopes = topLevelScopes.asReversed(),
|
|
||||||
localScopes = localScopes.asReversed()
|
|
||||||
)
|
|
||||||
|
|
||||||
val consumer = createFunctionConsumer(session, name, info, this, towerResolver.collector, towerResolver)
|
val consumer = createFunctionConsumer(session, name, info, this, towerResolver.collector, towerResolver)
|
||||||
val result = towerResolver.runResolver(consumer, implicitReceiverStack.receiversAsReversed())
|
val result = towerResolver.runResolver(consumer, implicitReceiverStack.receiversAsReversed())
|
||||||
@@ -72,8 +75,7 @@ class FirCallResolver(
|
|||||||
val reducedCandidates = if (result.currentApplicability < CandidateApplicability.SYNTHETIC_RESOLVED) {
|
val reducedCandidates = if (result.currentApplicability < CandidateApplicability.SYNTHETIC_RESOLVED) {
|
||||||
bestCandidates.toSet()
|
bestCandidates.toSet()
|
||||||
} else {
|
} else {
|
||||||
ConeOverloadConflictResolver(TypeSpecificityComparator.NONE, inferenceComponents)
|
conflictResolver.chooseMaximallySpecificCandidates(bestCandidates, discriminateGenerics = false)
|
||||||
.chooseMaximallySpecificCandidates(bestCandidates, discriminateGenerics = false)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -154,11 +156,7 @@ class FirCallResolver(
|
|||||||
file,
|
file,
|
||||||
transformer.container
|
transformer.container
|
||||||
) { it.resultType }
|
) { it.resultType }
|
||||||
val towerResolver = FirTowerResolver(
|
towerResolver.reset()
|
||||||
returnTypeCalculator, this, resolutionStageRunner,
|
|
||||||
topLevelScopes = topLevelScopes.asReversed(),
|
|
||||||
localScopes = localScopes.asReversed()
|
|
||||||
)
|
|
||||||
|
|
||||||
val consumer = createVariableAndObjectConsumer(
|
val consumer = createVariableAndObjectConsumer(
|
||||||
session,
|
session,
|
||||||
|
|||||||
@@ -22,7 +22,7 @@ enum class TowerDataKind {
|
|||||||
class FirTowerResolver(
|
class FirTowerResolver(
|
||||||
val typeCalculator: ReturnTypeCalculator,
|
val typeCalculator: ReturnTypeCalculator,
|
||||||
val components: BodyResolveComponents,
|
val components: BodyResolveComponents,
|
||||||
private val resolutionStageRunner: ResolutionStageRunner,
|
resolutionStageRunner: ResolutionStageRunner,
|
||||||
val topLevelScopes: List<FirScope>,
|
val topLevelScopes: List<FirScope>,
|
||||||
val localScopes: List<FirLocalScope>
|
val localScopes: List<FirLocalScope>
|
||||||
) {
|
) {
|
||||||
@@ -137,7 +137,11 @@ class FirTowerResolver(
|
|||||||
return group
|
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 towerDataConsumer: TowerDataConsumer
|
||||||
private lateinit var implicitReceiverValues: List<ImplicitReceiverValue<*>>
|
private lateinit var implicitReceiverValues: List<ImplicitReceiverValue<*>>
|
||||||
|
|
||||||
|
|||||||
+2
-1
@@ -36,6 +36,8 @@ import org.jetbrains.kotlin.types.model.TypeVariableMarker
|
|||||||
class FirCallCompleter(
|
class FirCallCompleter(
|
||||||
private val transformer: FirBodyResolveTransformer
|
private val transformer: FirBodyResolveTransformer
|
||||||
) : BodyResolveComponents by transformer {
|
) : BodyResolveComponents by transformer {
|
||||||
|
private val completer = ConstraintSystemCompleter(inferenceComponents)
|
||||||
|
|
||||||
fun <T : FirResolvable> completeCall(call: T, expectedTypeRef: FirTypeRef?): T {
|
fun <T : FirResolvable> completeCall(call: T, expectedTypeRef: FirTypeRef?): T {
|
||||||
val typeRef = typeFromCallee(call)
|
val typeRef = typeFromCallee(call)
|
||||||
if (typeRef.type is ConeKotlinErrorType) {
|
if (typeRef.type is ConeKotlinErrorType) {
|
||||||
@@ -58,7 +60,6 @@ class FirCallCompleter(
|
|||||||
}
|
}
|
||||||
|
|
||||||
val completionMode = candidate.computeCompletionMode(inferenceComponents, expectedTypeRef, initialType)
|
val completionMode = candidate.computeCompletionMode(inferenceComponents, expectedTypeRef, initialType)
|
||||||
val completer = ConstraintSystemCompleter(inferenceComponents)
|
|
||||||
val replacements = mutableMapOf<FirExpression, FirExpression>()
|
val replacements = mutableMapOf<FirExpression, FirExpression>()
|
||||||
|
|
||||||
val analyzer = PostponedArgumentsAnalyzer(LambdaAnalyzerImpl(replacements), { it.resultType }, inferenceComponents)
|
val analyzer = PostponedArgumentsAnalyzer(LambdaAnalyzerImpl(replacements), { it.resultType }, inferenceComponents)
|
||||||
|
|||||||
Reference in New Issue
Block a user