From b15f847943c3fc7467e35522c59e9c1e910ae6cd Mon Sep 17 00:00:00 2001 From: Dmitriy Novozhilov Date: Wed, 26 Aug 2020 11:28:08 +0300 Subject: [PATCH] [NI] Extract common parts from KotlinConstraintSystemCompleter --- .../inference/CompletionModeCalculator.kt | 6 +-- .../inference/ConstraintSystemCompleter.kt | 19 +++---- .../inference/FirBuilderInferenceSession.kt | 4 +- .../fir/resolve/inference/FirCallCompleter.kt | 2 +- .../FirDelegatedPropertyInferenceSession.kt | 5 +- .../DelegatedPropertyInferenceSession.kt | 7 +-- .../inference/CoroutineInferenceSession.kt | 3 +- .../calls/tower/ManyCandidatesResolver.kt | 3 +- .../components/CompletionModeCalculator.kt | 7 +-- .../calls/components/InferenceSession.kt | 10 ++-- .../calls/components/KotlinCallCompleter.kt | 2 +- .../components/PostponedArgumentsAnalyzer.kt | 8 +-- .../calls/inference/NewConstraintSystem.kt | 4 +- .../ConstraintSystemCompletionContext.kt | 34 ++++++++++++ .../ConstraintSystemCompletionMode.kt | 12 +++++ .../KotlinConstraintSystemCompleter.kt | 54 +++++-------------- .../PostponedArgumentInputTypesResolver.kt | 8 +-- .../components/VariableFixationFinder.kt | 3 +- .../model/NewConstraintSystemImpl.kt | 7 +-- 19 files changed, 107 insertions(+), 91 deletions(-) create mode 100644 compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/inference/components/ConstraintSystemCompletionContext.kt create mode 100644 compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/inference/components/ConstraintSystemCompletionMode.kt diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/inference/CompletionModeCalculator.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/inference/CompletionModeCalculator.kt index bf75cdec2e2..fdf1d1570f5 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/inference/CompletionModeCalculator.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/inference/CompletionModeCalculator.kt @@ -9,8 +9,8 @@ import org.jetbrains.kotlin.fir.resolve.calls.Candidate import org.jetbrains.kotlin.fir.types.ConeIntegerLiteralType import org.jetbrains.kotlin.fir.types.ConeKotlinType import org.jetbrains.kotlin.fir.types.FirTypeRef -import org.jetbrains.kotlin.resolve.calls.inference.components.KotlinConstraintSystemCompleter.ConstraintSystemCompletionMode -import org.jetbrains.kotlin.resolve.calls.inference.components.KotlinConstraintSystemCompleter.Context +import org.jetbrains.kotlin.resolve.calls.inference.components.ConstraintSystemCompletionMode +import org.jetbrains.kotlin.resolve.calls.inference.components.ConstraintSystemCompletionContext import org.jetbrains.kotlin.resolve.calls.inference.components.TrivialConstraintTypeInferenceOracle import org.jetbrains.kotlin.resolve.calls.inference.model.Constraint import org.jetbrains.kotlin.resolve.calls.inference.model.VariableWithConstraints @@ -40,7 +40,7 @@ fun Candidate.computeCompletionMode( } } -private typealias CsCompleterContext = Context +private typealias CsCompleterContext = ConstraintSystemCompletionContext private class CalculatorForNestedCall( private val candidate: Candidate, diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/inference/ConstraintSystemCompleter.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/inference/ConstraintSystemCompleter.kt index b495049b721..f4ca586c4a9 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/inference/ConstraintSystemCompleter.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/inference/ConstraintSystemCompleter.kt @@ -13,10 +13,7 @@ import org.jetbrains.kotlin.fir.returnExpressions import org.jetbrains.kotlin.fir.types.* import org.jetbrains.kotlin.fir.types.impl.ConeClassLikeTypeImpl import org.jetbrains.kotlin.resolve.calls.inference.ConstraintSystemBuilder -import org.jetbrains.kotlin.resolve.calls.inference.components.KotlinConstraintSystemCompleter -import org.jetbrains.kotlin.resolve.calls.inference.components.KotlinConstraintSystemCompleter.ConstraintSystemCompletionMode -import org.jetbrains.kotlin.resolve.calls.inference.components.TypeVariableDirectionCalculator -import org.jetbrains.kotlin.resolve.calls.inference.components.VariableFixationFinder +import org.jetbrains.kotlin.resolve.calls.inference.components.* import org.jetbrains.kotlin.resolve.calls.inference.model.NewConstraintSystemImpl import org.jetbrains.kotlin.resolve.calls.inference.model.SimpleConstraintSystemConstraintPosition import org.jetbrains.kotlin.resolve.calls.inference.model.VariableWithConstraints @@ -31,7 +28,7 @@ class ConstraintSystemCompleter(private val components: BodyResolveComponents) { val variableFixationFinder = VariableFixationFinder(components.inferenceComponents.trivialConstraintTypeInferenceOracle) fun complete( - c: KotlinConstraintSystemCompleter.Context, + c: ConstraintSystemCompletionContext, completionMode: ConstraintSystemCompletionMode, topLevelAtoms: List, candidateReturnType: ConeKotlinType, @@ -77,7 +74,7 @@ class ConstraintSystemCompleter(private val components: BodyResolveComponents) { } private fun resolveLambdaOrCallableReferenceWithTypeVariableAsExpectedType( - c: KotlinConstraintSystemCompleter.Context, + c: ConstraintSystemCompletionContext, variableForFixation: VariableFixationFinder.VariableForFixation, postponedAtoms: List, /*diagnosticsHolder: KotlinDiagnosticsHolder,*/ @@ -122,7 +119,7 @@ class ConstraintSystemCompleter(private val components: BodyResolveComponents) { } private inline fun T.preparePostponedAtomWithTypeVariableAsExpectedType( - c: KotlinConstraintSystemCompleter.Context, + c: ConstraintSystemCompletionContext, csBuilder: ConstraintSystemBuilder, variable: ConeTypeVariable, parameterTypes: Array?, @@ -161,7 +158,7 @@ class ConstraintSystemCompleter(private val components: BodyResolveComponents) { private fun getOrderedAllTypeVariables( - c: KotlinConstraintSystemCompleter.Context, + c: ConstraintSystemCompletionContext, topLevelAtoms: List, collectVariablesFromContext: Boolean ): List { @@ -199,7 +196,7 @@ class ConstraintSystemCompleter(private val components: BodyResolveComponents) { } private fun fixVariable( - c: KotlinConstraintSystemCompleter.Context, + c: ConstraintSystemCompletionContext, topLevelType: KotlinTypeMarker, variableWithConstraints: VariableWithConstraints, postponedResolveKtPrimitives: List @@ -210,7 +207,7 @@ class ConstraintSystemCompleter(private val components: BodyResolveComponents) { } private fun analyzePostponeArgumentIfPossible( - c: KotlinConstraintSystemCompleter.Context, + c: ConstraintSystemCompletionContext, topLevelAtoms: List, analyze: (PostponedResolvedAtom) -> Unit ): Boolean { @@ -240,7 +237,7 @@ class ConstraintSystemCompleter(private val components: BodyResolveComponents) { return notAnalyzedArguments } - private fun canWeAnalyzeIt(c: KotlinConstraintSystemCompleter.Context, argument: PostponedResolvedAtomMarker): Boolean { + private fun canWeAnalyzeIt(c: ConstraintSystemCompletionContext, argument: PostponedResolvedAtomMarker): Boolean { if (argument.analyzed) return false return argument.inputTypes.all { c.containsOnlyFixedOrPostponedVariables(it) } } diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/inference/FirBuilderInferenceSession.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/inference/FirBuilderInferenceSession.kt index 25398eba5f9..68f5724b965 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/inference/FirBuilderInferenceSession.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/inference/FirBuilderInferenceSession.kt @@ -16,7 +16,7 @@ import org.jetbrains.kotlin.fir.types.ConeTypeVariable import org.jetbrains.kotlin.fir.types.ConeTypeVariableTypeConstructor import org.jetbrains.kotlin.fir.visitors.transformSingle import org.jetbrains.kotlin.resolve.calls.inference.buildAbstractResultingSubstitutor -import org.jetbrains.kotlin.resolve.calls.inference.components.KotlinConstraintSystemCompleter +import org.jetbrains.kotlin.resolve.calls.inference.components.ConstraintSystemCompletionMode import org.jetbrains.kotlin.resolve.calls.inference.model.ConstraintKind import org.jetbrains.kotlin.resolve.calls.inference.model.ConstraintStorage import org.jetbrains.kotlin.resolve.calls.inference.model.CoroutinePosition @@ -94,7 +94,7 @@ class FirBuilderInferenceSession( @Suppress("UNCHECKED_CAST") components.callCompleter.completer.complete( context, - KotlinConstraintSystemCompleter.ConstraintSystemCompletionMode.FULL, + ConstraintSystemCompletionMode.FULL, partiallyResolvedCalls.map { it.first as FirStatement }, components.session.builtinTypes.unitType.type, collectVariablesFromContext = true 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 1b56c3ec380..79115057883 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 @@ -28,7 +28,7 @@ import org.jetbrains.kotlin.fir.types.builder.buildResolvedTypeRef import org.jetbrains.kotlin.fir.visitors.transformSingle import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.resolve.calls.inference.buildAbstractResultingSubstitutor -import org.jetbrains.kotlin.resolve.calls.inference.components.KotlinConstraintSystemCompleter.ConstraintSystemCompletionMode +import org.jetbrains.kotlin.resolve.calls.inference.components.ConstraintSystemCompletionMode import org.jetbrains.kotlin.resolve.calls.inference.model.SimpleConstraintSystemConstraintPosition import org.jetbrains.kotlin.types.TypeApproximatorConfiguration import org.jetbrains.kotlin.types.model.StubTypeMarker diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/inference/FirDelegatedPropertyInferenceSession.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/inference/FirDelegatedPropertyInferenceSession.kt index 547ed04ccd7..7d5d0bf5336 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/inference/FirDelegatedPropertyInferenceSession.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/inference/FirDelegatedPropertyInferenceSession.kt @@ -23,6 +23,7 @@ import org.jetbrains.kotlin.fir.types.* import org.jetbrains.kotlin.resolve.calls.inference.ConstraintSystemBuilder import org.jetbrains.kotlin.resolve.calls.inference.NewConstraintSystem import org.jetbrains.kotlin.resolve.calls.inference.buildAbstractResultingSubstitutor +import org.jetbrains.kotlin.resolve.calls.inference.components.ConstraintSystemCompletionMode import org.jetbrains.kotlin.resolve.calls.inference.components.KotlinConstraintSystemCompleter import org.jetbrains.kotlin.resolve.calls.inference.model.ConstraintStorage import org.jetbrains.kotlin.resolve.calls.inference.model.SimpleConstraintSystemConstraintPosition @@ -69,7 +70,7 @@ class FirDelegatedPropertyInferenceSession( @Suppress("UNCHECKED_CAST") components.callCompleter.completer.complete( commonSystem.asConstraintSystemCompleterContext(), - KotlinConstraintSystemCompleter.ConstraintSystemCompletionMode.FULL, + ConstraintSystemCompletionMode.FULL, resolvedCalls as List, unitType ) { @@ -137,4 +138,4 @@ class FirDelegatedPropertyInferenceSession( } override fun writeOnlyStubs(call: T): Boolean where T : FirResolvable, T : FirStatement = false -} \ No newline at end of file +} diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/DelegatedPropertyInferenceSession.kt b/compiler/frontend/src/org/jetbrains/kotlin/resolve/DelegatedPropertyInferenceSession.kt index 718f667d4c0..bd9d9347260 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/DelegatedPropertyInferenceSession.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/DelegatedPropertyInferenceSession.kt @@ -12,6 +12,7 @@ import org.jetbrains.kotlin.descriptors.VariableDescriptorWithAccessors import org.jetbrains.kotlin.resolve.calls.components.* import org.jetbrains.kotlin.resolve.calls.inference.ConstraintSystemBuilder import org.jetbrains.kotlin.resolve.calls.inference.NewConstraintSystem +import org.jetbrains.kotlin.resolve.calls.inference.components.ConstraintSystemCompletionMode import org.jetbrains.kotlin.resolve.calls.inference.components.KotlinConstraintSystemCompleter import org.jetbrains.kotlin.resolve.calls.inference.model.ConstraintStorage import org.jetbrains.kotlin.resolve.calls.inference.model.DelegatedPropertyConstraintPositionImpl @@ -82,7 +83,7 @@ class DelegatedPropertyInferenceSession( override fun inferPostponedVariables( lambda: ResolvedLambdaAtom, initialStorage: ConstraintStorage, - completionMode: KotlinConstraintSystemCompleter.ConstraintSystemCompletionMode, + completionMode: ConstraintSystemCompletionMode, diagnosticsHolder: KotlinDiagnosticsHolder ): Map = emptyMap() @@ -104,7 +105,7 @@ class InferenceSessionForExistingCandidates(private val resolveReceiverIndepende override fun inferPostponedVariables( lambda: ResolvedLambdaAtom, initialStorage: ConstraintStorage, - completionMode: KotlinConstraintSystemCompleter.ConstraintSystemCompletionMode, + completionMode: ConstraintSystemCompletionMode, diagnosticsHolder: KotlinDiagnosticsHolder ): Map = emptyMap() @@ -116,7 +117,7 @@ class InferenceSessionForExistingCandidates(private val resolveReceiverIndepende override fun computeCompletionMode( candidate: KotlinResolutionCandidate - ): KotlinConstraintSystemCompleter.ConstraintSystemCompletionMode? = null + ): ConstraintSystemCompletionMode? = null override fun resolveReceiverIndependently(): Boolean = resolveReceiverIndependently } diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/inference/CoroutineInferenceSession.kt b/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/inference/CoroutineInferenceSession.kt index 56b5e677651..4b5dbdbd5b4 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/inference/CoroutineInferenceSession.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/inference/CoroutineInferenceSession.kt @@ -20,6 +20,7 @@ import org.jetbrains.kotlin.resolve.calls.components.NewConstraintSystemImpl import org.jetbrains.kotlin.resolve.calls.components.PostponedArgumentsAnalyzer import org.jetbrains.kotlin.resolve.calls.components.stableType import org.jetbrains.kotlin.resolve.calls.context.BasicCallResolutionContext +import org.jetbrains.kotlin.resolve.calls.inference.components.ConstraintSystemCompletionMode import org.jetbrains.kotlin.resolve.calls.inference.components.KotlinConstraintSystemCompleter import org.jetbrains.kotlin.resolve.calls.inference.components.NewTypeSubstitutor import org.jetbrains.kotlin.resolve.calls.inference.components.NewTypeSubstitutorByConstructorMap @@ -169,7 +170,7 @@ class CoroutineInferenceSession( override fun inferPostponedVariables( lambda: ResolvedLambdaAtom, initialStorage: ConstraintStorage, - completionMode: KotlinConstraintSystemCompleter.ConstraintSystemCompletionMode, + completionMode: ConstraintSystemCompletionMode, diagnosticsHolder: KotlinDiagnosticsHolder, ): Map? { val (commonSystem, effectivelyEmptyConstraintSystem) = buildCommonSystem(initialStorage) diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/tower/ManyCandidatesResolver.kt b/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/tower/ManyCandidatesResolver.kt index 98a31e852df..53d9c1c9937 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/tower/ManyCandidatesResolver.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/tower/ManyCandidatesResolver.kt @@ -10,6 +10,7 @@ import org.jetbrains.kotlin.descriptors.CallableDescriptor import org.jetbrains.kotlin.resolve.calls.components.* import org.jetbrains.kotlin.resolve.calls.context.BasicCallResolutionContext import org.jetbrains.kotlin.resolve.calls.inference.NewConstraintSystem +import org.jetbrains.kotlin.resolve.calls.inference.components.ConstraintSystemCompletionMode import org.jetbrains.kotlin.resolve.calls.inference.components.KotlinConstraintSystemCompleter import org.jetbrains.kotlin.resolve.calls.inference.model.ConstraintStorage import org.jetbrains.kotlin.resolve.calls.inference.model.SimpleConstraintSystemConstraintPosition @@ -81,7 +82,7 @@ abstract class ManyCandidatesResolver( } fun runCompletion(constraintSystem: NewConstraintSystem, atoms: List) { - val completionMode = KotlinConstraintSystemCompleter.ConstraintSystemCompletionMode.FULL + val completionMode = ConstraintSystemCompletionMode.FULL kotlinConstraintSystemCompleter.runCompletion( constraintSystem.asConstraintSystemCompleterContext(), completionMode, diff --git a/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/components/CompletionModeCalculator.kt b/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/components/CompletionModeCalculator.kt index af2503cc5fb..d97f7389295 100644 --- a/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/components/CompletionModeCalculator.kt +++ b/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/components/CompletionModeCalculator.kt @@ -5,8 +5,9 @@ package org.jetbrains.kotlin.resolve.calls.components +import org.jetbrains.kotlin.resolve.calls.inference.components.ConstraintSystemCompletionContext import org.jetbrains.kotlin.resolve.calls.inference.components.KotlinConstraintSystemCompleter -import org.jetbrains.kotlin.resolve.calls.inference.components.KotlinConstraintSystemCompleter.ConstraintSystemCompletionMode +import org.jetbrains.kotlin.resolve.calls.inference.components.ConstraintSystemCompletionMode import org.jetbrains.kotlin.resolve.calls.inference.components.TrivialConstraintTypeInferenceOracle import org.jetbrains.kotlin.resolve.calls.inference.model.Constraint import org.jetbrains.kotlin.resolve.calls.inference.model.VariableWithConstraints @@ -18,7 +19,7 @@ import org.jetbrains.kotlin.types.model.* import org.jetbrains.kotlin.utils.newLinkedHashMapWithExpectedSize import java.util.* -typealias CsCompleterContext = KotlinConstraintSystemCompleter.Context +typealias CsCompleterContext = ConstraintSystemCompletionContext class CompletionModeCalculator { companion object { @@ -238,4 +239,4 @@ class CompletionModeCalculator { } } } -} \ No newline at end of file +} diff --git a/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/components/InferenceSession.kt b/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/components/InferenceSession.kt index 12115402fdf..61d6eb3c4b5 100644 --- a/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/components/InferenceSession.kt +++ b/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/components/InferenceSession.kt @@ -5,7 +5,7 @@ package org.jetbrains.kotlin.resolve.calls.components -import org.jetbrains.kotlin.resolve.calls.inference.components.KotlinConstraintSystemCompleter +import org.jetbrains.kotlin.resolve.calls.inference.components.ConstraintSystemCompletionMode import org.jetbrains.kotlin.resolve.calls.inference.model.ConstraintStorage import org.jetbrains.kotlin.resolve.calls.model.* import org.jetbrains.kotlin.types.TypeConstructor @@ -22,7 +22,7 @@ interface InferenceSession { override fun inferPostponedVariables( lambda: ResolvedLambdaAtom, initialStorage: ConstraintStorage, - completionMode: KotlinConstraintSystemCompleter.ConstraintSystemCompletionMode, + completionMode: ConstraintSystemCompletionMode, diagnosticsHolder: KotlinDiagnosticsHolder ): Map = emptyMap() @@ -31,7 +31,7 @@ interface InferenceSession { override fun shouldCompleteResolvedSubAtomsOf(resolvedCallAtom: ResolvedCallAtom) = true override fun computeCompletionMode( candidate: KotlinResolutionCandidate - ): KotlinConstraintSystemCompleter.ConstraintSystemCompletionMode? = null + ): ConstraintSystemCompletionMode? = null override fun resolveReceiverIndependently(): Boolean = false } @@ -45,14 +45,14 @@ interface InferenceSession { fun inferPostponedVariables( lambda: ResolvedLambdaAtom, initialStorage: ConstraintStorage, - completionMode: KotlinConstraintSystemCompleter.ConstraintSystemCompletionMode, + completionMode: ConstraintSystemCompletionMode, diagnosticsHolder: KotlinDiagnosticsHolder ): Map? fun writeOnlyStubs(callInfo: SingleCallResolutionResult): Boolean fun callCompleted(resolvedAtom: ResolvedAtom): Boolean fun shouldCompleteResolvedSubAtomsOf(resolvedCallAtom: ResolvedCallAtom): Boolean - fun computeCompletionMode(candidate: KotlinResolutionCandidate): KotlinConstraintSystemCompleter.ConstraintSystemCompletionMode? + fun computeCompletionMode(candidate: KotlinResolutionCandidate): ConstraintSystemCompletionMode? fun resolveReceiverIndependently(): Boolean } diff --git a/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/components/KotlinCallCompleter.kt b/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/components/KotlinCallCompleter.kt index ab702458227..c0a7a44e4ea 100644 --- a/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/components/KotlinCallCompleter.kt +++ b/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/components/KotlinCallCompleter.kt @@ -12,7 +12,7 @@ import org.jetbrains.kotlin.descriptors.synthetic.SyntheticMemberDescriptor import org.jetbrains.kotlin.resolve.calls.inference.NewConstraintSystem import org.jetbrains.kotlin.resolve.calls.inference.addEqualityConstraintIfCompatible import org.jetbrains.kotlin.resolve.calls.inference.components.KotlinConstraintSystemCompleter -import org.jetbrains.kotlin.resolve.calls.inference.components.KotlinConstraintSystemCompleter.ConstraintSystemCompletionMode +import org.jetbrains.kotlin.resolve.calls.inference.components.ConstraintSystemCompletionMode import org.jetbrains.kotlin.resolve.calls.inference.components.TrivialConstraintTypeInferenceOracle import org.jetbrains.kotlin.resolve.calls.inference.model.ConstraintStorage.Empty.hasContradiction import org.jetbrains.kotlin.resolve.calls.inference.model.ExpectedTypeConstraintPositionImpl diff --git a/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/components/PostponedArgumentsAnalyzer.kt b/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/components/PostponedArgumentsAnalyzer.kt index 0dc0f4c58cf..929ca7905e0 100644 --- a/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/components/PostponedArgumentsAnalyzer.kt +++ b/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/components/PostponedArgumentsAnalyzer.kt @@ -13,7 +13,7 @@ import org.jetbrains.kotlin.descriptors.annotations.Annotations import org.jetbrains.kotlin.descriptors.annotations.FilteredAnnotations import org.jetbrains.kotlin.resolve.calls.inference.ConstraintSystemBuilder import org.jetbrains.kotlin.resolve.calls.inference.addSubsystemFromArgument -import org.jetbrains.kotlin.resolve.calls.inference.components.KotlinConstraintSystemCompleter +import org.jetbrains.kotlin.resolve.calls.inference.components.ConstraintSystemCompletionMode import org.jetbrains.kotlin.resolve.calls.inference.model.ConstraintStorage import org.jetbrains.kotlin.resolve.calls.inference.model.CoroutinePosition import org.jetbrains.kotlin.resolve.calls.inference.model.LambdaArgumentConstraintPositionImpl @@ -47,7 +47,7 @@ class PostponedArgumentsAnalyzer( c: Context, resolutionCallbacks: KotlinResolutionCallbacks, argument: ResolvedAtom, - completionMode: KotlinConstraintSystemCompleter.ConstraintSystemCompletionMode, + completionMode: ConstraintSystemCompletionMode, diagnosticsHolder: KotlinDiagnosticsHolder ) { when (argument) { @@ -89,7 +89,7 @@ class PostponedArgumentsAnalyzer( c: Context, resolutionCallbacks: KotlinResolutionCallbacks, lambda: ResolvedLambdaAtom, - completionMode: KotlinConstraintSystemCompleter.ConstraintSystemCompletionMode, + completionMode: ConstraintSystemCompletionMode, diagnosticHolder: KotlinDiagnosticsHolder, ): ReturnArgumentsAnalysisResult { val substitutorAndStubsForLambdaAnalysis = c.createSubstituteFunctorForLambdaAnalysis() @@ -156,7 +156,7 @@ class PostponedArgumentsAnalyzer( c: Context, lambda: ResolvedLambdaAtom, returnArgumentsAnalysisResult: ReturnArgumentsAnalysisResult, - completionMode: KotlinConstraintSystemCompleter.ConstraintSystemCompletionMode, + completionMode: ConstraintSystemCompletionMode, diagnosticHolder: KotlinDiagnosticsHolder, substitute: (KotlinType) -> UnwrappedType = c.createSubstituteFunctorForLambdaAnalysis().substitute ) { diff --git a/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/inference/NewConstraintSystem.kt b/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/inference/NewConstraintSystem.kt index 9cbf30f8713..3b8499253ab 100644 --- a/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/inference/NewConstraintSystem.kt +++ b/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/inference/NewConstraintSystem.kt @@ -17,7 +17,7 @@ package org.jetbrains.kotlin.resolve.calls.inference import org.jetbrains.kotlin.resolve.calls.components.PostponedArgumentsAnalyzer -import org.jetbrains.kotlin.resolve.calls.inference.components.KotlinConstraintSystemCompleter +import org.jetbrains.kotlin.resolve.calls.inference.components.ConstraintSystemCompletionContext import org.jetbrains.kotlin.resolve.calls.inference.components.PostponedArgumentInputTypesResolver import org.jetbrains.kotlin.resolve.calls.inference.model.ConstraintStorage import org.jetbrains.kotlin.resolve.calls.inference.model.ConstraintSystemError @@ -31,7 +31,7 @@ interface NewConstraintSystem { // after this method we shouldn't mutate system via ConstraintSystemBuilder fun asReadOnlyStorage(): ConstraintStorage - fun asConstraintSystemCompleterContext(): KotlinConstraintSystemCompleter.Context + fun asConstraintSystemCompleterContext(): ConstraintSystemCompletionContext fun asPostponedArgumentsAnalyzerContext(): PostponedArgumentsAnalyzer.Context fun asPostponedArgumentInputTypesResolverContext(): PostponedArgumentInputTypesResolver.Context } diff --git a/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/inference/components/ConstraintSystemCompletionContext.kt b/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/inference/components/ConstraintSystemCompletionContext.kt new file mode 100644 index 00000000000..6d41c070431 --- /dev/null +++ b/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/inference/components/ConstraintSystemCompletionContext.kt @@ -0,0 +1,34 @@ +/* + * Copyright 2010-2020 JetBrains s.r.o. and Kotlin Programming Language contributors. + * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file. + */ + +package org.jetbrains.kotlin.resolve.calls.inference.components + +import org.jetbrains.kotlin.resolve.calls.inference.ConstraintSystemBuilder +import org.jetbrains.kotlin.resolve.calls.inference.model.ConstraintSystemError +import org.jetbrains.kotlin.resolve.calls.inference.model.VariableWithConstraints +import org.jetbrains.kotlin.resolve.calls.model.ResolvedAtom +import org.jetbrains.kotlin.types.model.KotlinTypeMarker +import org.jetbrains.kotlin.types.model.TypeConstructorMarker +import org.jetbrains.kotlin.types.model.TypeVariableMarker + +interface ConstraintSystemCompletionContext : VariableFixationFinder.Context, ResultTypeResolver.Context { + val allTypeVariables: Map + override val notFixedTypeVariables: Map + override val postponedTypeVariables: List + + fun getBuilder(): ConstraintSystemBuilder + + // type can be proper if it not contains not fixed type variables + fun canBeProper(type: KotlinTypeMarker): Boolean + + fun containsOnlyFixedOrPostponedVariables(type: KotlinTypeMarker): Boolean + + // mutable operations + fun addError(error: ConstraintSystemError) + + fun fixVariable(variable: TypeVariableMarker, resultType: KotlinTypeMarker, atom: ResolvedAtom?) + + fun asPostponedArgumentInputTypesResolverContext(): PostponedArgumentInputTypesResolver.Context +} diff --git a/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/inference/components/ConstraintSystemCompletionMode.kt b/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/inference/components/ConstraintSystemCompletionMode.kt new file mode 100644 index 00000000000..444d1a22008 --- /dev/null +++ b/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/inference/components/ConstraintSystemCompletionMode.kt @@ -0,0 +1,12 @@ +/* + * Copyright 2010-2020 JetBrains s.r.o. and Kotlin Programming Language contributors. + * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file. + */ + +package org.jetbrains.kotlin.resolve.calls.inference.components + +enum class ConstraintSystemCompletionMode { + FULL, + PARTIAL, + UNTIL_FIRST_LAMBDA +} diff --git a/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/inference/components/KotlinConstraintSystemCompleter.kt b/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/inference/components/KotlinConstraintSystemCompleter.kt index 081b31632b5..884a54c8221 100644 --- a/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/inference/components/KotlinConstraintSystemCompleter.kt +++ b/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/inference/components/KotlinConstraintSystemCompleter.kt @@ -6,11 +6,9 @@ package org.jetbrains.kotlin.resolve.calls.inference.components import org.jetbrains.kotlin.resolve.calls.components.transformToResolvedLambda -import org.jetbrains.kotlin.resolve.calls.inference.ConstraintSystemBuilder import org.jetbrains.kotlin.resolve.calls.inference.model.* import org.jetbrains.kotlin.resolve.calls.model.* import org.jetbrains.kotlin.types.* -import org.jetbrains.kotlin.types.model.KotlinTypeMarker import org.jetbrains.kotlin.types.model.TypeConstructorMarker import org.jetbrains.kotlin.types.model.TypeVariableMarker import org.jetbrains.kotlin.types.model.safeSubstitute @@ -24,34 +22,8 @@ class KotlinConstraintSystemCompleter( ) { private val postponedArgumentInputTypesResolver = PostponedArgumentInputTypesResolver(resultTypeResolver, variableFixationFinder) - enum class ConstraintSystemCompletionMode { - FULL, - PARTIAL, - UNTIL_FIRST_LAMBDA - } - - interface Context : VariableFixationFinder.Context, ResultTypeResolver.Context { - val allTypeVariables: Map - override val notFixedTypeVariables: Map - override val postponedTypeVariables: List - - fun getBuilder(): ConstraintSystemBuilder - - // type can be proper if it not contains not fixed type variables - fun canBeProper(type: KotlinTypeMarker): Boolean - - fun containsOnlyFixedOrPostponedVariables(type: KotlinTypeMarker): Boolean - - // mutable operations - fun addError(error: ConstraintSystemError) - - fun fixVariable(variable: TypeVariableMarker, resultType: KotlinTypeMarker, atom: ResolvedAtom?) - - fun asPostponedArgumentInputTypesResolverContext(): PostponedArgumentInputTypesResolver.Context - } - fun runCompletion( - c: Context, + c: ConstraintSystemCompletionContext, completionMode: ConstraintSystemCompletionMode, topLevelAtoms: List, topLevelType: UnwrappedType, @@ -69,7 +41,7 @@ class KotlinConstraintSystemCompleter( } fun completeConstraintSystem( - c: Context, + c: ConstraintSystemCompletionContext, topLevelType: UnwrappedType, topLevelAtoms: List, completionMode: ConstraintSystemCompletionMode, @@ -86,7 +58,7 @@ class KotlinConstraintSystemCompleter( } } - private fun Context.runCompletion( + private fun ConstraintSystemCompletionContext.runCompletion( completionMode: ConstraintSystemCompletionMode, topLevelAtoms: List, topLevelType: UnwrappedType, @@ -171,7 +143,7 @@ class KotlinConstraintSystemCompleter( } } - private fun Context.analyzeArgumentWithFixedParameterTypes( + private fun ConstraintSystemCompletionContext.analyzeArgumentWithFixedParameterTypes( postponedArguments: List, analyze: (PostponedResolvedAtom) -> Unit ): Boolean { @@ -185,7 +157,7 @@ class KotlinConstraintSystemCompleter( return false } - private fun Context.analyzeNextReadyPostponedArgument( + private fun ConstraintSystemCompletionContext.analyzeNextReadyPostponedArgument( postponedArguments: List, completionMode: ConstraintSystemCompletionMode, analyze: (PostponedResolvedAtom) -> Unit @@ -239,7 +211,7 @@ class KotlinConstraintSystemCompleter( return atom.transformToResolvedLambda(csBuilder, diagnosticsHolder, expectedType, returnVariable) } - private fun Context.hasLambdaToAnalyze( + private fun ConstraintSystemCompletionContext.hasLambdaToAnalyze( postponedArguments: List ): Boolean { return analyzeArgumentWithFixedParameterTypes(postponedArguments) {} @@ -248,11 +220,11 @@ class KotlinConstraintSystemCompleter( private fun findPostponedArgumentWithRevisableExpectedType(postponedArguments: List) = postponedArguments.firstOrNull { argument -> argument is PostponedAtomWithRevisableExpectedType } - private fun Context.findPostponedArgumentWithFixedOrPostponedInputTypes(postponedArguments: List) = + private fun ConstraintSystemCompletionContext.findPostponedArgumentWithFixedOrPostponedInputTypes(postponedArguments: List) = postponedArguments.firstOrNull { argument -> argument.inputTypes.all { containsOnlyFixedOrPostponedVariables(it) } } private fun fixVariable( - c: Context, + c: ConstraintSystemCompletionContext, variableWithConstraints: VariableWithConstraints, topLevelAtoms: List ) { @@ -260,7 +232,7 @@ class KotlinConstraintSystemCompleter( } private fun fixVariable( - c: Context, + c: ConstraintSystemCompletionContext, variableWithConstraints: VariableWithConstraints, direction: TypeVariableDirectionCalculator.ResolveDirection, topLevelAtoms: List @@ -270,7 +242,7 @@ class KotlinConstraintSystemCompleter( c.fixVariable(variableWithConstraints.typeVariable, resultType, resolvedAtom) } - private fun Context.fixVariablesOrReportNotEnoughInformation( + private fun ConstraintSystemCompletionContext.fixVariablesOrReportNotEnoughInformation( completionMode: ConstraintSystemCompletionMode, topLevelAtoms: List, topLevelType: UnwrappedType, @@ -304,7 +276,7 @@ class KotlinConstraintSystemCompleter( } private fun processVariableWhenNotEnoughInformation( - c: Context, + c: ConstraintSystemCompletionContext, variableWithConstraints: VariableWithConstraints, topLevelAtoms: List, diagnosticsHolder: KotlinDiagnosticsHolder @@ -331,7 +303,7 @@ class KotlinConstraintSystemCompleter( c.fixVariable(typeVariable, resultErrorType, resolvedAtom) } - private fun Context.getOrderedAllTypeVariables( + private fun ConstraintSystemCompletionContext.getOrderedAllTypeVariables( collectVariablesFromContext: Boolean, topLevelAtoms: List ): List { @@ -383,7 +355,7 @@ class KotlinConstraintSystemCompleter( return result.toList() } - private fun Context.isThereAnyReadyForFixationVariable( + private fun ConstraintSystemCompletionContext.isThereAnyReadyForFixationVariable( completionMode: ConstraintSystemCompletionMode, topLevelAtoms: List, topLevelType: UnwrappedType, diff --git a/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/inference/components/PostponedArgumentInputTypesResolver.kt b/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/inference/components/PostponedArgumentInputTypesResolver.kt index c3567e14415..4f1c8371142 100644 --- a/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/inference/components/PostponedArgumentInputTypesResolver.kt +++ b/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/inference/components/PostponedArgumentInputTypesResolver.kt @@ -20,7 +20,7 @@ class PostponedArgumentInputTypesResolver( private val resultTypeResolver: ResultTypeResolver, private val variableFixationFinder: VariableFixationFinder ) { - interface Context : KotlinConstraintSystemCompleter.Context + interface Context : ConstraintSystemCompletionContext private class ParameterTypesInfo( val parametersFromDeclaration: List?, @@ -339,7 +339,7 @@ class PostponedArgumentInputTypesResolver( fun collectParameterTypesAndBuildNewExpectedTypes( c: Context, postponedArguments: List, - completionMode: KotlinConstraintSystemCompleter.ConstraintSystemCompletionMode, + completionMode: ConstraintSystemCompletionMode, dependencyProvider: TypeVariableDependencyInformationProvider ): Boolean { // We can collect parameter types from declaration in any mode, they can't change during completion. @@ -357,7 +357,7 @@ class PostponedArgumentInputTypesResolver( * * TODO: investigate why we can't do it for anonymous functions in full mode always (see `diagnostics/tests/resolve/resolveWithSpecifiedFunctionLiteralWithId.kt`) */ - if (completionMode == KotlinConstraintSystemCompleter.ConstraintSystemCompletionMode.PARTIAL && !isAnonymousFunction(argument)) + if (completionMode == ConstraintSystemCompletionMode.PARTIAL && !isAnonymousFunction(argument)) return@any false if (argument.revisedExpectedType != null) return@any false val parameterTypesInfo = @@ -459,7 +459,7 @@ class PostponedArgumentInputTypesResolver( val relatedVariables = type.getPureArgumentsForFunctionalTypeOrSubtype() .flatMap { getAllDeeplyRelatedTypeVariables(it, dependencyProvider) } val variableForFixation = variableFixationFinder.findFirstVariableForFixation( - this, relatedVariables, postponedArguments, KotlinConstraintSystemCompleter.ConstraintSystemCompletionMode.FULL, topLevelType + this, relatedVariables, postponedArguments, ConstraintSystemCompletionMode.FULL, topLevelType ) if (variableForFixation == null || !variableForFixation.hasProperConstraint) diff --git a/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/inference/components/VariableFixationFinder.kt b/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/inference/components/VariableFixationFinder.kt index 83f43104143..10f275bd194 100644 --- a/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/inference/components/VariableFixationFinder.kt +++ b/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/inference/components/VariableFixationFinder.kt @@ -16,8 +16,7 @@ package org.jetbrains.kotlin.resolve.calls.inference.components -import org.jetbrains.kotlin.resolve.calls.inference.components.KotlinConstraintSystemCompleter.ConstraintSystemCompletionMode -import org.jetbrains.kotlin.resolve.calls.inference.components.KotlinConstraintSystemCompleter.ConstraintSystemCompletionMode.PARTIAL +import org.jetbrains.kotlin.resolve.calls.inference.components.ConstraintSystemCompletionMode.PARTIAL import org.jetbrains.kotlin.resolve.calls.inference.model.Constraint import org.jetbrains.kotlin.resolve.calls.inference.model.DeclaredUpperBoundConstraintPosition import org.jetbrains.kotlin.resolve.calls.inference.model.VariableWithConstraints diff --git a/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/inference/model/NewConstraintSystemImpl.kt b/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/inference/model/NewConstraintSystemImpl.kt index a83ff48644e..494308f9a4b 100644 --- a/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/inference/model/NewConstraintSystemImpl.kt +++ b/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/inference/model/NewConstraintSystemImpl.kt @@ -7,10 +7,7 @@ package org.jetbrains.kotlin.resolve.calls.inference.model import org.jetbrains.kotlin.resolve.calls.components.PostponedArgumentsAnalyzer import org.jetbrains.kotlin.resolve.calls.inference.* -import org.jetbrains.kotlin.resolve.calls.inference.components.ConstraintInjector -import org.jetbrains.kotlin.resolve.calls.inference.components.KotlinConstraintSystemCompleter -import org.jetbrains.kotlin.resolve.calls.inference.components.PostponedArgumentInputTypesResolver -import org.jetbrains.kotlin.resolve.calls.inference.components.ResultTypeResolver +import org.jetbrains.kotlin.resolve.calls.inference.components.* import org.jetbrains.kotlin.resolve.calls.model.ResolvedAtom import org.jetbrains.kotlin.types.* import org.jetbrains.kotlin.types.checker.NewKotlinTypeChecker @@ -30,7 +27,7 @@ class NewConstraintSystemImpl( ConstraintSystemBuilder, ConstraintInjector.Context, ResultTypeResolver.Context, - KotlinConstraintSystemCompleter.Context, + ConstraintSystemCompletionContext, PostponedArgumentInputTypesResolver.Context, PostponedArgumentsAnalyzer.Context { private val storage = MutableConstraintStorage()