render type correctly in html for TYPE_INFERENCE_UPPER_BOUND_VIOLATED error
This commit is contained in:
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
+7
-2
@@ -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>
|
||||
<R, T : jet.List<R>>
|
||||
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<jet.Int></b>
|
||||
</font>
|
||||
is not a subtype of <b>
|
||||
jet.List<jet.Int></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);
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user