From c150c2247303c8a5f45c6cdea7bccf33fb9eb893 Mon Sep 17 00:00:00 2001 From: Svetlana Isakova Date: Wed, 25 Sep 2013 20:50:52 +0400 Subject: [PATCH] refactoring: register type variable together not one by one --- .../jet/lang/resolve/calls/CandidateResolver.java | 5 +++-- .../jet/lang/types/expressions/ExpressionTypingUtils.java | 5 ++++- .../lang/resolve/calls/inference/ConstraintSystem.java | 6 +++--- .../resolve/calls/inference/ConstraintSystemImpl.java | 8 ++++++-- .../src/org/jetbrains/jet/lang/types/TypeUtils.java | 4 +--- 5 files changed, 17 insertions(+), 11 deletions(-) diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/calls/CandidateResolver.java b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/calls/CandidateResolver.java index 161a5adc12f..17b6d08f46c 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/calls/CandidateResolver.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/calls/CandidateResolver.java @@ -562,10 +562,11 @@ public class CandidateResolver { // Thus, we replace the parameters of our descriptor with fresh objects (perform alpha-conversion) CallableDescriptor candidateWithFreshVariables = FunctionDescriptorUtil.alphaConvertTypeParameters(candidate); - + Map typeVariables = Maps.newLinkedHashMap(); for (TypeParameterDescriptor typeParameterDescriptor : candidateWithFreshVariables.getTypeParameters()) { - constraintSystem.registerTypeVariable(typeParameterDescriptor, Variance.INVARIANT); // TODO: variance of the occurrences + typeVariables.put(typeParameterDescriptor, Variance.INVARIANT); // TODO: variance of the occurrences } + constraintSystem.registerTypeVariables(typeVariables); TypeSubstitutor substituteDontCare = ConstraintsUtil .makeConstantSubstitutor(candidateWithFreshVariables.getTypeParameters(), DONT_CARE); diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/types/expressions/ExpressionTypingUtils.java b/compiler/frontend/src/org/jetbrains/jet/lang/types/expressions/ExpressionTypingUtils.java index 72786fd03f7..16ccee8380d 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/types/expressions/ExpressionTypingUtils.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/types/expressions/ExpressionTypingUtils.java @@ -17,6 +17,7 @@ package org.jetbrains.jet.lang.types.expressions; import com.google.common.collect.Lists; +import com.google.common.collect.Maps; import com.intellij.openapi.project.Project; import com.intellij.openapi.util.Pair; import com.intellij.psi.PsiElement; @@ -301,11 +302,13 @@ public class ExpressionTypingUtils { Set typeNamesInReceiver = collectUsedTypeNames(receiverParameter.getType()); ConstraintSystem constraintSystem = new ConstraintSystemImpl(); + Map typeVariables = Maps.newLinkedHashMap(); for (TypeParameterDescriptor typeParameterDescriptor : callableDescriptor.getTypeParameters()) { if (typeNamesInReceiver.contains(typeParameterDescriptor.getName())) { - constraintSystem.registerTypeVariable(typeParameterDescriptor, Variance.INVARIANT); + typeVariables.put(typeParameterDescriptor, Variance.INVARIANT); } } + constraintSystem.registerTypeVariables(typeVariables); constraintSystem.addSubtypeConstraint(receiverType, receiverParameter.getType(), ConstraintPosition.RECEIVER_POSITION); return constraintSystem.getStatus().isSuccessful() && ConstraintsUtil.checkBoundsAreSatisfied(constraintSystem, true); diff --git a/core/descriptors/src/org/jetbrains/jet/lang/resolve/calls/inference/ConstraintSystem.java b/core/descriptors/src/org/jetbrains/jet/lang/resolve/calls/inference/ConstraintSystem.java index 0244a0ea5ff..9a7aae168d4 100644 --- a/core/descriptors/src/org/jetbrains/jet/lang/resolve/calls/inference/ConstraintSystem.java +++ b/core/descriptors/src/org/jetbrains/jet/lang/resolve/calls/inference/ConstraintSystem.java @@ -23,15 +23,15 @@ import org.jetbrains.jet.lang.types.JetType; import org.jetbrains.jet.lang.types.TypeSubstitutor; import org.jetbrains.jet.lang.types.Variance; -import java.util.Collection; +import java.util.Map; import java.util.Set; public interface ConstraintSystem { /** - * Registers a variable in a constraint system. + * Registers variables in a constraint system. */ - void registerTypeVariable(@NotNull TypeParameterDescriptor typeVariable, @NotNull Variance positionVariance); + void registerTypeVariables(@NotNull Map typeVariables); /** * Returns a set of all registered type variables. diff --git a/core/descriptors/src/org/jetbrains/jet/lang/resolve/calls/inference/ConstraintSystemImpl.java b/core/descriptors/src/org/jetbrains/jet/lang/resolve/calls/inference/ConstraintSystemImpl.java index 9423426ac42..f9b3d689905 100644 --- a/core/descriptors/src/org/jetbrains/jet/lang/resolve/calls/inference/ConstraintSystemImpl.java +++ b/core/descriptors/src/org/jetbrains/jet/lang/resolve/calls/inference/ConstraintSystemImpl.java @@ -163,8 +163,12 @@ public class ConstraintSystemImpl implements ConstraintSystem { } @Override - public void registerTypeVariable(@NotNull TypeParameterDescriptor typeVariable, @NotNull Variance positionVariance) { - typeParameterConstraints.put(typeVariable, new TypeConstraintsImpl(positionVariance)); + public void registerTypeVariables(@NotNull Map typeVariables) { + for (Map.Entry entry : typeVariables.entrySet()) { + TypeParameterDescriptor typeVariable = entry.getKey(); + Variance positionVariance = entry.getValue(); + typeParameterConstraints.put(typeVariable, new TypeConstraintsImpl(positionVariance)); + } } @Override diff --git a/core/descriptors/src/org/jetbrains/jet/lang/types/TypeUtils.java b/core/descriptors/src/org/jetbrains/jet/lang/types/TypeUtils.java index 27c604f41aa..3b38a4cbe2d 100644 --- a/core/descriptors/src/org/jetbrains/jet/lang/types/TypeUtils.java +++ b/core/descriptors/src/org/jetbrains/jet/lang/types/TypeUtils.java @@ -261,9 +261,7 @@ public class TypeUtils { processAllTypeParameters(withParameters, Variance.INVARIANT, processor); processAllTypeParameters(expected, Variance.INVARIANT, processor); ConstraintSystemImpl constraintSystem = new ConstraintSystemImpl(); - for (Map.Entry entry : parameters.entrySet()) { - constraintSystem.registerTypeVariable(entry.getKey(), entry.getValue()); - } + constraintSystem.registerTypeVariables(parameters); constraintSystem.addSubtypeConstraint(withParameters, expected, ConstraintPosition.SPECIAL); return constraintSystem.getStatus().isSuccessful();