From 0bf81aeec0171be014698927825247d903055a1a Mon Sep 17 00:00:00 2001 From: Dmitry Petrov Date: Mon, 26 Jun 2017 11:14:10 +0300 Subject: [PATCH] [NI] Extract InferenceStepResolver into a separate component --- .../calls/components/KotlinCallCompleter.kt | 24 ++--------- .../components/InferenceStepResolver.kt | 43 +++++++++++++++++++ 2 files changed, 47 insertions(+), 20 deletions(-) create mode 100644 compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/inference/components/InferenceStepResolver.kt 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 99381e8a61b..7f7764394aa 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 @@ -20,14 +20,10 @@ import org.jetbrains.kotlin.descriptors.CallableDescriptor import org.jetbrains.kotlin.descriptors.FunctionDescriptor import org.jetbrains.kotlin.descriptors.PropertyDescriptor import org.jetbrains.kotlin.resolve.calls.inference.ConstraintSystemBuilder -import org.jetbrains.kotlin.resolve.calls.inference.components.ConstraintInjector -import org.jetbrains.kotlin.resolve.calls.inference.components.FixationOrderCalculator -import org.jetbrains.kotlin.resolve.calls.inference.components.NewTypeSubstitutor -import org.jetbrains.kotlin.resolve.calls.inference.components.ResultTypeResolver +import org.jetbrains.kotlin.resolve.calls.inference.components.* import org.jetbrains.kotlin.resolve.calls.inference.model.ExpectedTypeConstraintPosition import org.jetbrains.kotlin.resolve.calls.inference.model.LambdaArgumentConstraintPosition import org.jetbrains.kotlin.resolve.calls.inference.model.NewTypeVariable -import org.jetbrains.kotlin.resolve.calls.inference.model.NotEnoughInformationForTypeParameter import org.jetbrains.kotlin.resolve.calls.inference.returnTypeOrNothing import org.jetbrains.kotlin.resolve.calls.inference.substituteAndApproximateCapturedTypes import org.jetbrains.kotlin.resolve.calls.model.* @@ -41,9 +37,9 @@ import org.jetbrains.kotlin.types.typeUtil.builtIns import org.jetbrains.kotlin.types.typeUtil.contains class KotlinCallCompleter( - private val resultTypeResolver: ResultTypeResolver, private val fixationOrderCalculator: FixationOrderCalculator, - private val additionalDiagnosticReporter: AdditionalDiagnosticReporter + private val additionalDiagnosticReporter: AdditionalDiagnosticReporter, + private val inferenceStepResolver: InferenceStepResolver ) { interface Context { val innerCalls: List @@ -194,19 +190,7 @@ class KotlinCallCompleter( } val completionOrder = fixationOrderCalculator.computeCompletionOrder(c.asFixationOrderCalculatorContext(), descriptorWithFreshTypes.returnTypeOrNothing) - for ((variableWithConstraints, direction) in completionOrder) { - if (c.hasContradiction) return true - val variable = variableWithConstraints.typeVariable - - val resultType = resultTypeResolver.findResultType(c.asResultTypeResolverContext(), variableWithConstraints, direction) - if (resultType == null) { - c.addError(NotEnoughInformationForTypeParameter(variable)) - break - } - c.fixVariable(variable, resultType) - return false - } - return true + return inferenceStepResolver.resolveVariables(c, completionOrder) } private fun analyzeLambda(c: Context, resolutionCallbacks: KotlinResolutionCallbacks, lambda: PostponedLambdaArgument) { diff --git a/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/inference/components/InferenceStepResolver.kt b/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/inference/components/InferenceStepResolver.kt new file mode 100644 index 00000000000..c4e0546bf2e --- /dev/null +++ b/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/inference/components/InferenceStepResolver.kt @@ -0,0 +1,43 @@ +/* + * Copyright 2010-2017 JetBrains s.r.o. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.jetbrains.kotlin.resolve.calls.inference.components + +import org.jetbrains.kotlin.resolve.calls.components.KotlinCallCompleter +import org.jetbrains.kotlin.resolve.calls.inference.model.NotEnoughInformationForTypeParameter + +class InferenceStepResolver( + private val resultTypeResolver: ResultTypeResolver +) { + /** + * Resolves one or more of the `variables`. + * Returns `true` if type variable resolution should stop. + */ + fun resolveVariables(c: KotlinCallCompleter.Context, variables: List): Boolean { + for ((variableWithConstraints, direction) in variables) { + if (c.hasContradiction) return true + val variable = variableWithConstraints.typeVariable + val resultType = resultTypeResolver.findResultType(c.asResultTypeResolverContext(), variableWithConstraints, direction) + if (resultType == null) { + c.addError(NotEnoughInformationForTypeParameter(variable)) + break + } + c.fixVariable(variable, resultType) + return false + } + return true + } +} \ No newline at end of file