Humanize type mismatch diagnostic caused by type projections
#KT-10581 Fixed
This commit is contained in:
@@ -20,12 +20,14 @@ import com.intellij.icons.AllIcons;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
import org.jetbrains.annotations.TestOnly;
|
||||
import org.jetbrains.kotlin.diagnostics.Diagnostic;
|
||||
import org.jetbrains.kotlin.diagnostics.TypeMismatchDueToTypeProjectionsData;
|
||||
import org.jetbrains.kotlin.diagnostics.rendering.DefaultErrorMessages;
|
||||
import org.jetbrains.kotlin.diagnostics.rendering.DiagnosticFactoryToRendererMap;
|
||||
import org.jetbrains.kotlin.diagnostics.rendering.DiagnosticRenderer;
|
||||
import org.jetbrains.kotlin.js.resolve.diagnostics.ErrorsJs;
|
||||
import org.jetbrains.kotlin.js.resolve.diagnostics.JsCallDataHtmlRenderer;
|
||||
import org.jetbrains.kotlin.renderer.DescriptorRenderer;
|
||||
import org.jetbrains.kotlin.renderer.MultiRenderer;
|
||||
|
||||
import java.net.URL;
|
||||
|
||||
@@ -66,6 +68,22 @@ public class IdeErrorMessages {
|
||||
MAP.put(TYPE_MISMATCH, "<html>Type mismatch.<table><tr><td>Required:</td><td>{0}</td></tr><tr><td>Found:</td><td>{1}</td></tr></table></html>",
|
||||
HTML_RENDER_TYPE, HTML_RENDER_TYPE);
|
||||
|
||||
MAP.put(TYPE_MISMATCH_DUE_TO_TYPE_PROJECTIONS,
|
||||
"<html>Type mismatch.<table><tr><td>Required:</td><td>{0}</td></tr><tr><td>Found:</td><td>{1}</td></tr></table><br />\n" +
|
||||
"Projected type {2} restricts use of <br />\n{3}\n</html>",
|
||||
new MultiRenderer<TypeMismatchDueToTypeProjectionsData>() {
|
||||
@NotNull
|
||||
@Override
|
||||
public String[] render(@NotNull TypeMismatchDueToTypeProjectionsData object) {
|
||||
return new String[] {
|
||||
HTML_RENDER_TYPE.render(object.getExpectedType()),
|
||||
HTML_RENDER_TYPE.render(object.getExpressionType()),
|
||||
HTML_RENDER_TYPE.render(object.getReceiverType()),
|
||||
DescriptorRenderer.HTML.render(object.getCallableDescriptor())
|
||||
};
|
||||
}
|
||||
});
|
||||
|
||||
MAP.put(ASSIGN_OPERATOR_AMBIGUITY, "<html>Assignment operators ambiguity. All these functions match.<ul>{0}</ul></table></html>",
|
||||
HTML_AMBIGUOUS_CALLS);
|
||||
|
||||
|
||||
@@ -0,0 +1,6 @@
|
||||
// !DIAGNOSTICS_NUMBER: 1
|
||||
// !DIAGNOSTICS: MEMBER_PROJECTED_OUT
|
||||
|
||||
fun foo(x: MutableCollection<out CharSequence>) {
|
||||
x.add("")
|
||||
}
|
||||
@@ -0,0 +1,2 @@
|
||||
<!-- expectedNothingDueToProjections1 -->
|
||||
Out-projected type 'kotlin.MutableCollection<out kotlin.CharSequence>' prohibits the use of 'public abstract fun add(element: E): kotlin.Boolean defined in kotlin.MutableCollection'
|
||||
@@ -0,0 +1,6 @@
|
||||
// !DIAGNOSTICS_NUMBER: 1
|
||||
// !DIAGNOSTICS: TYPE_MISMATCH_DUE_TO_TYPE_PROJECTIONS
|
||||
|
||||
fun foo(x: MutableCollection<out CharSequence>, y: MutableCollection<CharSequence>) {
|
||||
x.addAll(y)
|
||||
}
|
||||
@@ -0,0 +1,17 @@
|
||||
<!-- typeMismatchDueToProjections1 -->
|
||||
<html>
|
||||
Type mismatch.
|
||||
<table>
|
||||
<tr>
|
||||
<td>Required:</td>
|
||||
<td>kotlin.Collection<`kotlin.Nothing></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Found:</td>
|
||||
<td>kotlin.MutableCollection<`kotlin.CharSequence></td>
|
||||
</tr>
|
||||
</table>
|
||||
<br />
|
||||
Projected type kotlin.MutableCollection<`out kotlin.CharSequence> restricts use of <br />
|
||||
<b>public</b> <b>abstract</b> <b>fun</b> addAll(elements: kotlin.Collection<`E>): kotlin.Boolean <i>defined in</i> kotlin.MutableCollection
|
||||
</html>
|
||||
@@ -0,0 +1,11 @@
|
||||
// !DIAGNOSTICS_NUMBER: 1
|
||||
// !DIAGNOSTICS: TYPE_MISMATCH_DUE_TO_TYPE_PROJECTIONS
|
||||
|
||||
interface A<T>
|
||||
interface B<E> {
|
||||
fun foo(x: A<in E>)
|
||||
}
|
||||
|
||||
fun foo(x: B<in CharSequence>, y: A<CharSequence>) {
|
||||
x.foo(y)
|
||||
}
|
||||
@@ -0,0 +1,17 @@
|
||||
<!-- typeMismatchDueToProjectionsIn1 -->
|
||||
<html>
|
||||
Type mismatch.
|
||||
<table>
|
||||
<tr>
|
||||
<td>Required:</td>
|
||||
<td>A<`kotlin.Any?></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Found:</td>
|
||||
<td>A<`kotlin.CharSequence></td>
|
||||
</tr>
|
||||
</table>
|
||||
<br />
|
||||
Projected type B<`in kotlin.CharSequence> restricts use of <br />
|
||||
<b>public</b> <b>abstract</b> <b>fun</b> foo(x: A<`in E>): kotlin.Unit <i>defined in</i> B
|
||||
</html>
|
||||
@@ -0,0 +1,7 @@
|
||||
// !DIAGNOSTICS_NUMBER: 1
|
||||
// !DIAGNOSTICS: TYPE_MISMATCH_DUE_TO_TYPE_PROJECTIONS
|
||||
// !MESSAGE_TYPE: TEXT
|
||||
|
||||
fun foo(x: MutableCollection<out CharSequence>, y: MutableCollection<CharSequence>) {
|
||||
x.addAll(y)
|
||||
}
|
||||
@@ -0,0 +1,2 @@
|
||||
<!-- typeMismatchDueToProjectionsTxt1 -->
|
||||
Type mismatch: inferred type is kotlin.MutableCollection<kotlin.CharSequence> but kotlin.Collection<kotlin.Nothing> was expected. Projected type kotlin.MutableCollection<out kotlin.CharSequence> restricts use of public abstract fun addAll(elements: kotlin.Collection<E>): kotlin.Boolean defined in kotlin.MutableCollection
|
||||
@@ -101,6 +101,12 @@ public class DiagnosticMessageTestGenerated extends AbstractDiagnosticMessageTes
|
||||
doTest(fileName);
|
||||
}
|
||||
|
||||
@TestMetadata("expectedNothingDueToProjections.kt")
|
||||
public void testExpectedNothingDueToProjections() throws Exception {
|
||||
String fileName = KotlinTestUtils.navigationMetadata("idea/testData/diagnosticMessage/expectedNothingDueToProjections.kt");
|
||||
doTest(fileName);
|
||||
}
|
||||
|
||||
@TestMetadata("extensionInClassReference.kt")
|
||||
public void testExtensionInClassReference() throws Exception {
|
||||
String fileName = KotlinTestUtils.navigationMetadata("idea/testData/diagnosticMessage/extensionInClassReference.kt");
|
||||
@@ -179,6 +185,24 @@ public class DiagnosticMessageTestGenerated extends AbstractDiagnosticMessageTes
|
||||
doTest(fileName);
|
||||
}
|
||||
|
||||
@TestMetadata("typeMismatchDueToProjections.kt")
|
||||
public void testTypeMismatchDueToProjections() throws Exception {
|
||||
String fileName = KotlinTestUtils.navigationMetadata("idea/testData/diagnosticMessage/typeMismatchDueToProjections.kt");
|
||||
doTest(fileName);
|
||||
}
|
||||
|
||||
@TestMetadata("typeMismatchDueToProjectionsIn.kt")
|
||||
public void testTypeMismatchDueToProjectionsIn() throws Exception {
|
||||
String fileName = KotlinTestUtils.navigationMetadata("idea/testData/diagnosticMessage/typeMismatchDueToProjectionsIn.kt");
|
||||
doTest(fileName);
|
||||
}
|
||||
|
||||
@TestMetadata("typeMismatchDueToProjectionsTxt.kt")
|
||||
public void testTypeMismatchDueToProjectionsTxt() throws Exception {
|
||||
String fileName = KotlinTestUtils.navigationMetadata("idea/testData/diagnosticMessage/typeMismatchDueToProjectionsTxt.kt");
|
||||
doTest(fileName);
|
||||
}
|
||||
|
||||
@TestMetadata("typeMismatchWithNothing.kt")
|
||||
public void testTypeMismatchWithNothing() throws Exception {
|
||||
String fileName = KotlinTestUtils.navigationMetadata("idea/testData/diagnosticMessage/typeMismatchWithNothing.kt");
|
||||
|
||||
Reference in New Issue
Block a user