Proper errors for cases like 'is Map' supported in 'when'
This commit is contained in:
@@ -143,7 +143,7 @@ public class TypeResolver {
|
|||||||
else {
|
else {
|
||||||
if (actualArgumentCount != expectedArgumentCount) {
|
if (actualArgumentCount != expectedArgumentCount) {
|
||||||
if (actualArgumentCount == 0) {
|
if (actualArgumentCount == 0) {
|
||||||
if (rhsOfIsExpression(type)) {
|
if (rhsOfIsExpression(type) || rhsOfIsPattern(type)) {
|
||||||
trace.report(NO_TYPE_ARGUMENTS_ON_RHS_OF_IS_EXPRESSION.on(type, expectedArgumentCount, allStarProjectionsString(typeConstructor)));
|
trace.report(NO_TYPE_ARGUMENTS_ON_RHS_OF_IS_EXPRESSION.on(type, expectedArgumentCount, allStarProjectionsString(typeConstructor)));
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
@@ -252,6 +252,14 @@ public class TypeResolver {
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private static boolean rhsOfIsPattern(@NotNull JetUserType type) {
|
||||||
|
// Look for the is-pattern containing this type
|
||||||
|
JetWhenConditionIsPattern outerPattern = PsiTreeUtil.getParentOfType(type, JetWhenConditionIsPattern.class, false, JetExpression.class);
|
||||||
|
if (outerPattern == null) return false;
|
||||||
|
// We are interested only in the outermost type on the RHS
|
||||||
|
return type.getParent() == outerPattern.getTypeRef();
|
||||||
|
}
|
||||||
|
|
||||||
private JetScope getScopeForTypeParameter(final TypeParameterDescriptor typeParameterDescriptor, boolean checkBounds) {
|
private JetScope getScopeForTypeParameter(final TypeParameterDescriptor typeParameterDescriptor, boolean checkBounds) {
|
||||||
if (checkBounds) {
|
if (checkBounds) {
|
||||||
return typeParameterDescriptor.getUpperBoundsAsType().getMemberScope();
|
return typeParameterDescriptor.getUpperBoundsAsType().getMemberScope();
|
||||||
|
|||||||
@@ -0,0 +1,13 @@
|
|||||||
|
public fun foo(a: Any, <!UNUSED_PARAMETER!>b<!>: <!WRONG_NUMBER_OF_TYPE_ARGUMENTS!>Map<!>) {
|
||||||
|
when (a) {
|
||||||
|
is Map<!WRONG_NUMBER_OF_TYPE_ARGUMENTS!><Int><!> -> {}
|
||||||
|
is <!NO_TYPE_ARGUMENTS_ON_RHS_OF_IS_EXPRESSION!>Map<!> -> {}
|
||||||
|
is Map<out Any?, Any?> -> {}
|
||||||
|
is Map<*, *> -> {}
|
||||||
|
is Map<<!SYNTAX!><!>> -> {}
|
||||||
|
is <!CANNOT_CHECK_FOR_ERASED!>List<<!WRONG_NUMBER_OF_TYPE_ARGUMENTS!>Map<!>><!> -> {}
|
||||||
|
is <!NO_TYPE_ARGUMENTS_ON_RHS_OF_IS_EXPRESSION!>List<!> -> {}
|
||||||
|
is Int -> {}
|
||||||
|
else -> {}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1774,6 +1774,11 @@ public class JetDiagnosticsTestGenerated extends AbstractDiagnosticsTestWithEage
|
|||||||
doTest("compiler/testData/diagnostics/tests/generics/RawTypeInIsExpression.kt");
|
doTest("compiler/testData/diagnostics/tests/generics/RawTypeInIsExpression.kt");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@TestMetadata("RawTypeInIsPattern.kt")
|
||||||
|
public void testRawTypeInIsPattern() throws Exception {
|
||||||
|
doTest("compiler/testData/diagnostics/tests/generics/RawTypeInIsPattern.kt");
|
||||||
|
}
|
||||||
|
|
||||||
@TestMetadata("RecursiveUpperBoundCheck.kt")
|
@TestMetadata("RecursiveUpperBoundCheck.kt")
|
||||||
public void testRecursiveUpperBoundCheck() throws Exception {
|
public void testRecursiveUpperBoundCheck() throws Exception {
|
||||||
doTest("compiler/testData/diagnostics/tests/generics/RecursiveUpperBoundCheck.kt");
|
doTest("compiler/testData/diagnostics/tests/generics/RecursiveUpperBoundCheck.kt");
|
||||||
|
|||||||
@@ -0,0 +1,7 @@
|
|||||||
|
// "Add '<*>'" "true"
|
||||||
|
public fun foo(a: Any) {
|
||||||
|
when (a) {
|
||||||
|
is java.util.ArrayList<*> -> {}
|
||||||
|
else -> {}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,7 @@
|
|||||||
|
// "Add '<*>'" "true"
|
||||||
|
public fun foo(a: Any) {
|
||||||
|
when (a) {
|
||||||
|
is jet.List<*> -> {}
|
||||||
|
else -> {}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,7 @@
|
|||||||
|
// "Add '<*, *>'" "true"
|
||||||
|
public fun foo(a: Any) {
|
||||||
|
when (a) {
|
||||||
|
is jet.Map<*, *> -> {}
|
||||||
|
else -> {}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,7 @@
|
|||||||
|
// "Add '<*>'" "true"
|
||||||
|
public fun foo(a: Any) {
|
||||||
|
when (a) {
|
||||||
|
is List<*> -> {}
|
||||||
|
else -> {}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,7 @@
|
|||||||
|
// "Add '<*, *>'" "true"
|
||||||
|
public fun foo(a: Any) {
|
||||||
|
when (a) {
|
||||||
|
is Map<*, *> -> {}
|
||||||
|
else -> {}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,9 @@
|
|||||||
|
// "Add '<*, *>'" "false"
|
||||||
|
// "Add '<*>'" "false"
|
||||||
|
// ERROR: 2 type arguments expected
|
||||||
|
public fun foo(a: Any) {
|
||||||
|
when (a) {
|
||||||
|
is Map<Int> -> {}
|
||||||
|
else -> {}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,7 @@
|
|||||||
|
// "Add '<*>'" "true"
|
||||||
|
public fun foo(a: Any) {
|
||||||
|
when (a) {
|
||||||
|
is java.util.Array<caret>List -> {}
|
||||||
|
else -> {}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,7 @@
|
|||||||
|
// "Add '<*>'" "true"
|
||||||
|
public fun foo(a: Any) {
|
||||||
|
when (a) {
|
||||||
|
is jet.List<caret> -> {}
|
||||||
|
else -> {}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,7 @@
|
|||||||
|
// "Add '<*, *>'" "true"
|
||||||
|
public fun foo(a: Any) {
|
||||||
|
when (a) {
|
||||||
|
is jet.Map<caret> -> {}
|
||||||
|
else -> {}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,7 @@
|
|||||||
|
// "Add '<*>'" "true"
|
||||||
|
public fun foo(a: Any) {
|
||||||
|
when (a) {
|
||||||
|
is List<caret> -> {}
|
||||||
|
else -> {}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,7 @@
|
|||||||
|
// "Add '<*, *>'" "true"
|
||||||
|
public fun foo(a: Any) {
|
||||||
|
when (a) {
|
||||||
|
is Map<caret> -> {}
|
||||||
|
else -> {}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,9 @@
|
|||||||
|
// "Add '<*, *>'" "false"
|
||||||
|
// "Add '<*>'" "false"
|
||||||
|
// ERROR: 2 type arguments expected
|
||||||
|
public fun foo(a: Any) {
|
||||||
|
when (a) {
|
||||||
|
is <caret>Map<Int> -> {}
|
||||||
|
else -> {}
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user