render type correctly in html for TYPE_INFERENCE_UPPER_BOUND_VIOLATED error

This commit is contained in:
Svetlana Isakova
2013-01-14 14:35:26 +04:00
parent dfc45cc21e
commit b2823c5966
6 changed files with 68 additions and 9 deletions
@@ -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<JetType> 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;
}
@@ -152,6 +152,11 @@ public class TabledDescriptorRenderer {
return result.toString();
}
@NotNull
public Renderer<JetType> 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<JetType> 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()) {
@@ -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<JetType> 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("</table>");
}
private static void renderFunctionArguments(
private void renderFunctionArguments(
@Nullable JetType receiverType,
@NotNull List<JetType> argumentTypes,
Predicate<ConstraintPosition> 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++;
@@ -0,0 +1,7 @@
package i
fun foo<R, T: List<R>>(r: R, list: T) {}
fun test1(i: Int, collection: Collection<Int>) {
foo(i, collection)
}
@@ -0,0 +1,32 @@
<!-- upperBoundViolated1 -->
<html>
Type parameter bound for <b>
T</b>
in <table>
<tr>
<td width="10%">
</td>
<td align="right" colspan="2" style="white-space:nowrap;font-weight:bold;">
<b>
fun</b>
&lt;R, T : jet.List&lt;R&gt;>
foo</td>
<td style="white-space:nowrap;font-weight:bold;">
(</td>
<td align="right" style="white-space:nowrap;font-weight:bold;">
r : R,</td>
<td align="right" style="white-space:nowrap;font-weight:bold;">
list : T</td>
<td style="white-space:nowrap;font-weight:bold;">
)</td>
<td style="white-space:nowrap;font-weight:bold;">
: Unit</td>
</tr>
</table>
is not satisfied: inferred type <font color=red>
<b>
jet.Collection&lt;jet.Int&gt;</b>
</font>
is not a subtype of <b>
jet.List&lt;jet.Int&gt;</b>
</html>
@@ -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);
}
}