From 9149668286040c544a815501e74d1c6e795e3c50 Mon Sep 17 00:00:00 2001 From: Alexander Udalov Date: Tue, 27 Oct 2015 18:21:57 +0300 Subject: [PATCH] Add ConstraintSystem#copy to minimize usages of ConstraintSystemImpl --- .../kotlin/diagnostics/rendering/Renderers.kt | 2 +- .../jetbrains/kotlin/resolve/calls/CallCompleter.kt | 10 +++++----- .../kotlin/resolve/calls/inference/ConstraintSystem.kt | 8 ++++++++ .../resolve/calls/inference/ConstraintSystemImpl.kt | 10 +--------- .../resolve/calls/tasks/AbstractTracingStrategy.java | 5 ++--- .../kotlin/idea/quickfix/AddGenericUpperBoundFix.kt | 6 ++---- 6 files changed, 19 insertions(+), 22 deletions(-) diff --git a/compiler/frontend/src/org/jetbrains/kotlin/diagnostics/rendering/Renderers.kt b/compiler/frontend/src/org/jetbrains/kotlin/diagnostics/rendering/Renderers.kt index 1feeb8332f3..5dcadbfba12 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/diagnostics/rendering/Renderers.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/diagnostics/rendering/Renderers.kt @@ -249,7 +249,7 @@ public object Renderers { public fun renderUpperBoundViolatedInferenceError( inferenceErrorData: InferenceErrorData, result: TabledDescriptorRenderer ): TabledDescriptorRenderer { - val constraintSystem = inferenceErrorData.constraintSystem as ConstraintSystemImpl + val constraintSystem = inferenceErrorData.constraintSystem val status = constraintSystem.getStatus() LOG.assertTrue(status.hasViolatedUpperBound(), renderDebugMessage("Upper bound violated renderer is applied for incorrect status", inferenceErrorData)) diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/CallCompleter.kt b/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/CallCompleter.kt index c3485b3531c..890b496c658 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/CallCompleter.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/CallCompleter.kt @@ -30,11 +30,11 @@ import org.jetbrains.kotlin.resolve.calls.checkers.CallChecker import org.jetbrains.kotlin.resolve.calls.context.BasicCallResolutionContext import org.jetbrains.kotlin.resolve.calls.context.CallCandidateResolutionContext import org.jetbrains.kotlin.resolve.calls.context.CheckArgumentTypesMode +import org.jetbrains.kotlin.resolve.calls.inference.ConstraintSystem import org.jetbrains.kotlin.resolve.calls.inference.ConstraintSystemImpl import org.jetbrains.kotlin.resolve.calls.inference.InferenceErrorData -import org.jetbrains.kotlin.resolve.calls.inference.constraintPosition.ConstraintPositionKind.EXPECTED_TYPE_POSITION -import org.jetbrains.kotlin.resolve.calls.inference.constraintPosition.ConstraintPositionKind.FROM_COMPLETER -import org.jetbrains.kotlin.resolve.calls.inference.constraintPosition.ConstraintPositionKind.TYPE_BOUND_POSITION +import org.jetbrains.kotlin.resolve.calls.inference.constraintPosition.ConstraintPositionKind.* +import org.jetbrains.kotlin.resolve.calls.inference.filterConstraintsOut import org.jetbrains.kotlin.resolve.calls.model.* import org.jetbrains.kotlin.resolve.calls.results.OverloadResolutionResultsImpl import org.jetbrains.kotlin.resolve.calls.results.ResolutionStatus @@ -140,8 +140,8 @@ public class CallCompleter( expectedType: KotlinType, trace: BindingTrace ) { - fun updateSystemIfSuccessful(update: (ConstraintSystemImpl) -> Boolean) { - val copy = (getConstraintSystem() as ConstraintSystemImpl).copy() as ConstraintSystemImpl + fun updateSystemIfSuccessful(update: (ConstraintSystem) -> Boolean) { + val copy = constraintSystem!!.copy() if (update(copy)) { setConstraintSystem(copy) } diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/inference/ConstraintSystem.kt b/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/inference/ConstraintSystem.kt index 09603e4f607..a4f3d63939b 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/inference/ConstraintSystem.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/inference/ConstraintSystem.kt @@ -18,6 +18,8 @@ package org.jetbrains.kotlin.resolve.calls.inference import org.jetbrains.kotlin.descriptors.TypeParameterDescriptor import org.jetbrains.kotlin.resolve.calls.inference.constraintPosition.ConstraintPosition +import org.jetbrains.kotlin.resolve.calls.inference.constraintPosition.ConstraintPositionKind +import org.jetbrains.kotlin.resolve.calls.inference.constraintPosition.derivedFrom import org.jetbrains.kotlin.types.KotlinType import org.jetbrains.kotlin.types.TypeSubstitutor @@ -84,4 +86,10 @@ public interface ConstraintSystem { * Returns the substitution only for type parameters that have result values, otherwise returns the type parameter itself. */ public fun getPartialSubstitutor(): TypeSubstitutor + + public fun copy(filterConstraintPosition: (ConstraintPosition) -> Boolean = { true }): ConstraintSystem +} + +fun ConstraintSystem.filterConstraintsOut(excludePositionKind: ConstraintPositionKind): ConstraintSystem { + return copy { !it.derivedFrom(excludePositionKind) } } diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/inference/ConstraintSystemImpl.kt b/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/inference/ConstraintSystemImpl.kt index 56e5aaa10f5..421706c9e4a 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/inference/ConstraintSystemImpl.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/inference/ConstraintSystemImpl.kt @@ -177,15 +177,7 @@ public class ConstraintSystemImpl : ConstraintSystem { }.filterNotNull().filter { if (original) it in originalToVariables.keySet() else it in getAllTypeVariables() } } - public fun copy(): ConstraintSystem = createNewConstraintSystemFromThis { true } - - public fun filterConstraintsOut(excludePositionKind: ConstraintPositionKind): ConstraintSystem { - return createNewConstraintSystemFromThis { !it.derivedFrom(excludePositionKind) } - } - - private fun createNewConstraintSystemFromThis( - filterConstraintPosition: (ConstraintPosition) -> Boolean - ): ConstraintSystem { + override fun copy(filterConstraintPosition: (ConstraintPosition) -> Boolean): ConstraintSystem { val newSystem = ConstraintSystemImpl() for ((typeParameter, typeBounds) in allTypeParameterBounds) { newSystem.allTypeParameterBounds.put(typeParameter, typeBounds.filter(filterConstraintPosition)) diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/tasks/AbstractTracingStrategy.java b/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/tasks/AbstractTracingStrategy.java index 0dbd9b60259..95f3c01c644 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/tasks/AbstractTracingStrategy.java +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/tasks/AbstractTracingStrategy.java @@ -30,7 +30,6 @@ import org.jetbrains.kotlin.resolve.BindingTrace; import org.jetbrains.kotlin.resolve.DescriptorUtils; import org.jetbrains.kotlin.resolve.calls.callUtil.CallUtilKt; import org.jetbrains.kotlin.resolve.calls.inference.ConstraintSystem; -import org.jetbrains.kotlin.resolve.calls.inference.ConstraintSystemImpl; import org.jetbrains.kotlin.resolve.calls.inference.ConstraintSystemStatus; import org.jetbrains.kotlin.resolve.calls.inference.InferenceErrorData; import org.jetbrains.kotlin.resolve.calls.model.ResolvedCall; @@ -47,6 +46,7 @@ import java.util.Collection; import static org.jetbrains.kotlin.diagnostics.Errors.*; import static org.jetbrains.kotlin.resolve.BindingContext.AMBIGUOUS_REFERENCE_TARGET; import static org.jetbrains.kotlin.resolve.DescriptorUtils.getFqNameFromTopLevelClass; +import static org.jetbrains.kotlin.resolve.calls.inference.ConstraintSystemKt.filterConstraintsOut; import static org.jetbrains.kotlin.resolve.calls.inference.constraintPosition.ConstraintPositionKind.EXPECTED_TYPE_POSITION; import static org.jetbrains.kotlin.types.TypeUtils.noExpectedType; @@ -219,8 +219,7 @@ public abstract class AbstractTracingStrategy implements TracingStrategy { KotlinType declaredReturnType = data.descriptor.getReturnType(); if (declaredReturnType == null) return; - ConstraintSystem systemWithoutExpectedTypeConstraint = - ((ConstraintSystemImpl) constraintSystem).filterConstraintsOut(EXPECTED_TYPE_POSITION); + ConstraintSystem systemWithoutExpectedTypeConstraint = filterConstraintsOut(constraintSystem, EXPECTED_TYPE_POSITION); KotlinType substitutedReturnType = systemWithoutExpectedTypeConstraint.getResultingSubstitutor().substitute( declaredReturnType, Variance.OUT_VARIANCE); assert substitutedReturnType != null; //todo diff --git a/idea/src/org/jetbrains/kotlin/idea/quickfix/AddGenericUpperBoundFix.kt b/idea/src/org/jetbrains/kotlin/idea/quickfix/AddGenericUpperBoundFix.kt index 22f0da5b26a..cda318c250a 100644 --- a/idea/src/org/jetbrains/kotlin/idea/quickfix/AddGenericUpperBoundFix.kt +++ b/idea/src/org/jetbrains/kotlin/idea/quickfix/AddGenericUpperBoundFix.kt @@ -29,10 +29,10 @@ import org.jetbrains.kotlin.psi.KtFile import org.jetbrains.kotlin.psi.KtPsiFactory import org.jetbrains.kotlin.psi.KtTypeParameter import org.jetbrains.kotlin.resolve.DescriptorToSourceUtils -import org.jetbrains.kotlin.resolve.calls.inference.ConstraintSystemImpl import org.jetbrains.kotlin.resolve.calls.inference.ConstraintsUtil import org.jetbrains.kotlin.resolve.calls.inference.InferenceErrorData import org.jetbrains.kotlin.resolve.calls.inference.constraintPosition.ConstraintPositionKind +import org.jetbrains.kotlin.resolve.calls.inference.filterConstraintsOut import org.jetbrains.kotlin.types.KotlinType import org.jetbrains.kotlin.types.Variance import org.jetbrains.kotlin.utils.singletonOrEmptyList @@ -77,9 +77,7 @@ public class AddGenericUpperBoundFix( } private fun createActionsByInferenceData(inferenceData: InferenceErrorData): List { - val successfulConstraintSystem = (inferenceData.constraintSystem as? ConstraintSystemImpl) - ?.filterConstraintsOut(ConstraintPositionKind.TYPE_BOUND_POSITION) - ?: return emptyList() + val successfulConstraintSystem = inferenceData.constraintSystem.filterConstraintsOut(ConstraintPositionKind.TYPE_BOUND_POSITION) if (!successfulConstraintSystem.getStatus().isSuccessful()) return emptyList()