diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/rendering/Renderers.java b/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/rendering/Renderers.java index 826f4b94502..a21b96a2f10 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/rendering/Renderers.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/rendering/Renderers.java @@ -40,8 +40,11 @@ import org.jetbrains.jet.renderer.Renderer; import java.util.Collection; import java.util.Iterator; import java.util.List; +import java.util.Set; import static org.jetbrains.jet.lang.diagnostics.rendering.TabledDescriptorRenderer.*; +import static org.jetbrains.jet.lang.resolve.calls.inference.TypeBounds.BoundKind.LOWER_BOUND; +import static org.jetbrains.jet.lang.resolve.calls.inference.TypeBounds.BoundKind.UPPER_BOUND; public class Renderers { public static final Renderer TO_STRING = new Renderer() { @@ -342,6 +345,45 @@ public class Renderers { } }; + public static final Renderer RENDER_CONSTRAINT_SYSTEM = new Renderer() { + @NotNull + @Override + public String render(@NotNull ConstraintSystem constraintSystem) { + Set typeVariables = constraintSystem.getTypeVariables(); + Set typeBounds = Sets.newLinkedHashSet(); + for (TypeParameterDescriptor variable : typeVariables) { + typeBounds.add(constraintSystem.getTypeBounds(variable)); + } + Function renderTypeBounds = rendererToFunction(RENDER_TYPE_BOUNDS); + return "type parameter bounds: \n" + StringUtil.join(typeBounds, renderTypeBounds, ";\n") + "\n" + + "status:\n" + ConstraintsUtil.getDebugMessageForStatus(constraintSystem.getStatus()); + } + }; + + public static final Renderer RENDER_TYPE_BOUNDS = new Renderer() { + @NotNull + @Override + public String render(@NotNull TypeBounds typeBounds) { + Function renderBound = new Function() { + @Override + public String fun(TypeBoundsImpl.Bound bound) { + String arrow = bound.kind == LOWER_BOUND ? "<: " : bound.kind == UPPER_BOUND ? ">: " : "= "; + return arrow + bound.type + '(' + bound.position + ')'; + } + }; + return typeBounds.getTypeVariable().getName() + " " + StringUtil.join(typeBounds.getBounds(), renderBound, ", "); + } + }; + + @NotNull + public static Function rendererToFunction(final @NotNull Renderer renderer) { + return new Function() { + @Override + public String fun(T t) { + return renderer.render(t); + } + }; + } private Renderers() { } 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 6e71662f2bf..109a51ab5a0 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 @@ -40,8 +40,8 @@ import java.util.Set; import static org.jetbrains.jet.lang.resolve.calls.inference.ConstraintSystemImpl.ConstraintKind.EQUAL; import static org.jetbrains.jet.lang.resolve.calls.inference.ConstraintSystemImpl.ConstraintKind.SUB_TYPE; -import static org.jetbrains.jet.lang.resolve.calls.inference.TypeBoundsImpl.BoundKind.*; -import static org.jetbrains.jet.lang.resolve.calls.inference.TypeBoundsImpl.Bound; +import static org.jetbrains.jet.lang.resolve.calls.inference.TypeBounds.BoundKind.*; +import static org.jetbrains.jet.lang.resolve.calls.inference.TypeBounds.Bound; import static org.jetbrains.jet.lang.types.TypeUtils.CANT_INFER_TYPE_PARAMETER; import static org.jetbrains.jet.lang.types.TypeUtils.DONT_CARE; diff --git a/core/descriptors/src/org/jetbrains/jet/lang/resolve/calls/inference/TypeBounds.java b/core/descriptors/src/org/jetbrains/jet/lang/resolve/calls/inference/TypeBounds.java index c43d3eae8b3..e9b67f24a87 100644 --- a/core/descriptors/src/org/jetbrains/jet/lang/resolve/calls/inference/TypeBounds.java +++ b/core/descriptors/src/org/jetbrains/jet/lang/resolve/calls/inference/TypeBounds.java @@ -18,16 +18,22 @@ package org.jetbrains.jet.lang.resolve.calls.inference; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; +import org.jetbrains.jet.lang.descriptors.TypeParameterDescriptor; import org.jetbrains.jet.lang.types.JetType; import org.jetbrains.jet.lang.types.Variance; import java.util.Collection; -import java.util.Set; public interface TypeBounds { @NotNull Variance getVarianceOfPosition(); + @NotNull + TypeParameterDescriptor getTypeVariable(); + + @NotNull + Collection getBounds(); + boolean isEmpty(); @Nullable @@ -35,4 +41,20 @@ public interface TypeBounds { @NotNull Collection getValues(); + + enum BoundKind { + LOWER_BOUND, UPPER_BOUND, EXACT_BOUND + } + + class Bound { + public final JetType type; + public final BoundKind kind; + public final ConstraintPosition position; + + public Bound(@NotNull JetType type, @NotNull BoundKind kind, @NotNull ConstraintPosition position) { + this.type = type; + this.kind = kind; + this.position = position; + } + } } diff --git a/core/descriptors/src/org/jetbrains/jet/lang/resolve/calls/inference/TypeBoundsImpl.java b/core/descriptors/src/org/jetbrains/jet/lang/resolve/calls/inference/TypeBoundsImpl.java index 3f278faeec5..20ef01fb9f0 100644 --- a/core/descriptors/src/org/jetbrains/jet/lang/resolve/calls/inference/TypeBoundsImpl.java +++ b/core/descriptors/src/org/jetbrains/jet/lang/resolve/calls/inference/TypeBoundsImpl.java @@ -31,23 +31,9 @@ import java.util.Collection; import java.util.Collections; import java.util.Set; +import static org.jetbrains.jet.lang.resolve.calls.inference.TypeBounds.BoundKind.LOWER_BOUND; + public class TypeBoundsImpl implements TypeBounds { - public static enum BoundKind { - LOWER_BOUND, UPPER_BOUND, EXACT_BOUND - } - - public static class Bound { - public final JetType type; - public final BoundKind kind; - public final ConstraintPosition position; - - public Bound(@NotNull JetType type, @NotNull BoundKind kind, @NotNull ConstraintPosition position) { - this.type = type; - this.kind = kind; - this.position = position; - } - } - private final TypeParameterDescriptor typeVariable; private final Variance varianceOfPosition; private final Set bounds = Sets.newLinkedHashSet(); @@ -78,6 +64,13 @@ public class TypeBoundsImpl implements TypeBounds { return getValues().isEmpty(); } + @NotNull + @Override + public TypeParameterDescriptor getTypeVariable() { + return typeVariable; + } + + @Override @NotNull public Collection getBounds() { return bounds; @@ -175,7 +168,7 @@ public class TypeBoundsImpl implements TypeBounds { values.addAll(exactBounds); Pair, Collection> pair = - TypeUtils.filterNumberTypes(filterBounds(bounds, BoundKind.LOWER_BOUND, values)); + TypeUtils.filterNumberTypes(filterBounds(bounds, LOWER_BOUND, values)); Collection generalLowerBounds = pair.getFirst(); Collection numberLowerBounds = pair.getSecond();