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 50c3bd31d31..cb6d963549e 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 @@ -277,15 +277,18 @@ public class Renderers { .table(newTable(). descriptor(inferenceErrorData.descriptor)); - JetType type = ConstraintsUtil.getValue(inferenceErrorData.constraintSystem.getTypeConstraints(typeParameterDescriptor)); + JetType inferredValueForTypeParameter = ConstraintsUtil.getValue(inferenceErrorData.constraintSystem.getTypeConstraints(typeParameterDescriptor)); + assert inferredValueForTypeParameter != null; JetType upperBound = typeParameterDescriptor.getUpperBoundsAsType(); - JetType substitute = inferenceErrorData.constraintSystem.getResultingSubstitutor().substitute(upperBound, Variance.INVARIANT); + JetType upperBoundWithSubstitutedInferredTypes = inferenceErrorData.constraintSystem.getResultingSubstitutor().substitute(upperBound, Variance.INVARIANT); + assert upperBoundWithSubstitutedInferredTypes != null; + Renderer typeRenderer = result.getTypeRenderer(); result.text(newText() .normal(" is not satisfied: inferred type ") - .error(type) + .error(typeRenderer.render(inferredValueForTypeParameter)) .normal(" is not a subtype of ") - .strong(substitute)); + .strong(typeRenderer.render(upperBoundWithSubstitutedInferredTypes))); return result; } diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/rendering/TabledDescriptorRenderer.java b/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/rendering/TabledDescriptorRenderer.java index 048dc67386d..7f2cad296f9 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/rendering/TabledDescriptorRenderer.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/rendering/TabledDescriptorRenderer.java @@ -152,6 +152,11 @@ public class TabledDescriptorRenderer { return result.toString(); } + @NotNull + public Renderer getTypeRenderer() { + return Renderers.RENDER_TYPE; + } + protected void renderText(TextRenderer textRenderer, StringBuilder result) { for (TextElement element : textRenderer.elements) { result.append(element.text); @@ -179,7 +184,7 @@ public class TabledDescriptorRenderer { boolean hasReceiver = receiverType != null; if (hasReceiver) { result.append("receiver: "); - result.append(Renderers.RENDER_TYPE.render(receiverType)); + result.append(getTypeRenderer().render(receiverType)); result.append(" arguments: "); } if (argumentTypes.isEmpty()) { @@ -190,7 +195,7 @@ public class TabledDescriptorRenderer { result.append("("); for (Iterator iterator = argumentTypes.iterator(); iterator.hasNext(); ) { JetType argumentType = iterator.next(); - String renderedArgument = Renderers.RENDER_TYPE.render(argumentType); + String renderedArgument = getTypeRenderer().render(argumentType); result.append(renderedArgument); if (iterator.hasNext()) { diff --git a/idea/src/org/jetbrains/jet/plugin/highlighter/HtmlTabledDescriptorRenderer.java b/idea/src/org/jetbrains/jet/plugin/highlighter/HtmlTabledDescriptorRenderer.java index a1288d17bd1..47d0f6b5126 100644 --- a/idea/src/org/jetbrains/jet/plugin/highlighter/HtmlTabledDescriptorRenderer.java +++ b/idea/src/org/jetbrains/jet/plugin/highlighter/HtmlTabledDescriptorRenderer.java @@ -21,6 +21,7 @@ import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.jetbrains.jet.lang.descriptors.FunctionDescriptor; import org.jetbrains.jet.lang.descriptors.ValueParameterDescriptor; +import org.jetbrains.jet.lang.diagnostics.rendering.Renderer; import org.jetbrains.jet.lang.diagnostics.rendering.TabledDescriptorRenderer; import org.jetbrains.jet.lang.diagnostics.rendering.TabledDescriptorRenderer.TableRenderer.DescriptorRow; import org.jetbrains.jet.lang.diagnostics.rendering.TabledDescriptorRenderer.TableRenderer.FunctionArgumentsRow; @@ -38,6 +39,13 @@ import static org.jetbrains.jet.plugin.highlighter.IdeRenderers.strong; public class HtmlTabledDescriptorRenderer extends TabledDescriptorRenderer { + + @NotNull + @Override + public Renderer getTypeRenderer() { + return IdeRenderers.HTML_RENDER_TYPE; + } + @Override protected void renderText(TextRenderer textRenderer, StringBuilder result) { for (TextRenderer.TextElement element : textRenderer.elements) { @@ -107,7 +115,7 @@ public class HtmlTabledDescriptorRenderer extends TabledDescriptorRenderer { result.append(""); } - private static void renderFunctionArguments( + private void renderFunctionArguments( @Nullable JetType receiverType, @NotNull List argumentTypes, Predicate isErrorPosition, @@ -121,7 +129,7 @@ public class HtmlTabledDescriptorRenderer extends TabledDescriptorRenderer { if (isErrorPosition.apply(ConstraintPosition.RECEIVER_POSITION)) { error = true; } - receiver = "receiver: " + strong(IdeRenderers.HTML_RENDER_TYPE.render(receiverType), error); + receiver = "receiver: " + strong(getTypeRenderer().render(receiverType), error); } td(result, receiver); td(result, hasReceiver ? "arguments: " : ""); @@ -138,7 +146,7 @@ public class HtmlTabledDescriptorRenderer extends TabledDescriptorRenderer { if (isErrorPosition.apply(ConstraintPosition.getValueParameterPosition(i))) { error = true; } - String renderedArgument = IdeRenderers.HTML_RENDER_TYPE.render(argumentType); + String renderedArgument = getTypeRenderer().render(argumentType); tdRight(result, strong(renderedArgument, error) + (iterator.hasNext() ? strong(",") : "")); i++; diff --git a/idea/testData/diagnosticMessage/upperBoundViolated.kt b/idea/testData/diagnosticMessage/upperBoundViolated.kt new file mode 100644 index 00000000000..82991ee56c4 --- /dev/null +++ b/idea/testData/diagnosticMessage/upperBoundViolated.kt @@ -0,0 +1,7 @@ +package i + +fun foo>(r: R, list: T) {} + +fun test1(i: Int, collection: Collection) { + foo(i, collection) +} \ No newline at end of file diff --git a/idea/testData/diagnosticMessage/upperBoundViolated1.html b/idea/testData/diagnosticMessage/upperBoundViolated1.html new file mode 100644 index 00000000000..10361c3074d --- /dev/null +++ b/idea/testData/diagnosticMessage/upperBoundViolated1.html @@ -0,0 +1,32 @@ + + +Type parameter bound for +T + in + + + + + + + + + +
+ + +fun + <R, T : jet.List<R>> + foo +( +r : R, +list : T +) + : Unit
+ is not satisfied: inferred type + +jet.Collection<jet.Int> + + is not a subtype of +jet.List<jet.Int> + \ No newline at end of file diff --git a/idea/tests/org/jetbrains/jet/plugin/highlighter/DiagnosticMessageTest.java b/idea/tests/org/jetbrains/jet/plugin/highlighter/DiagnosticMessageTest.java index 92b7b4d814a..8fcdfe2683a 100644 --- a/idea/tests/org/jetbrains/jet/plugin/highlighter/DiagnosticMessageTest.java +++ b/idea/tests/org/jetbrains/jet/plugin/highlighter/DiagnosticMessageTest.java @@ -102,4 +102,8 @@ public class DiagnosticMessageTest extends JetLiteFixture { public void testInaccessibleOuterClassExpression() throws Exception { doTest("inaccessibleOuterClassExpression", 1, Errors.INACCESSIBLE_OUTER_CLASS_EXPRESSION); } + + public void testUpperBoundViolated() throws Exception { + doTest("upperBoundViolated", 1, Errors.TYPE_INFERENCE_UPPER_BOUND_VIOLATED); + } }