[java-highlighting] Move guard expression to switch label

Part of IDEA-326939 Support multi-pattern switch labels that define no variables

GitOrigin-RevId: c236438af58e1c74a2bf12a5985b33cedadb9cbb
This commit is contained in:
Tagir Valeev
2023-08-17 09:26:40 +02:00
committed by intellij-monorepo-bot
parent 005b179eae
commit efbff7c99c
67 changed files with 536 additions and 538 deletions

View File

@@ -17,7 +17,7 @@ public class Main {
System.out.println("hello");
case "world":
System.out.println("world");
case <error descr="Illegal fall-through to a pattern">String str when str.isEmpty()</error>:
case <error descr="Illegal fall-through to a pattern">String str</error> when str.isEmpty():
System.out.println("an empty string");
case null:
System.out.println("null");
@@ -127,7 +127,7 @@ public class Main {
void test12(Integer integer) {
switch (integer) {
case 1, 2, <error descr="Invalid case label combination: a case label must consist of either a list of case constants or a single case pattern">Integer i1 when i1 > 5</error>:
case 1, 2, <error descr="Invalid case label combination: a case label must consist of either a list of case constants or a single case pattern">Integer i1</error> when i1 > 5:
case null:
System.out.println("blah blah blah");
break;
@@ -144,14 +144,14 @@ public class Main {
void test14(Object obj) {
switch (obj) {
case <error descr="Invalid case label combination: 'null' can only be used as a single case label or paired only with 'default'">null</error>, String s when s.isEmpty(), Integer i when i == 42 -> {}
case null, String s when s.isEmpty()<error descr="':' or '->' expected"><error descr="Unexpected token">,</error></error> Integer i<error descr="';' expected"> </error><error descr="Cannot resolve symbol 'when'" textAttributesKey="WRONG_REFERENCES_ATTRIBUTES">when</error> <error descr="Variable 'i' is already defined in the scope">i</error><error descr="';' expected"> </error><error descr="Unexpected token">==</error> <error descr="Not a statement">42</error> <error descr="Unexpected token">-></error> {}
default -> {}
}
}
void test15(Object obj) {
switch (obj) {
case String s when s.isEmpty(), <error descr="Invalid case label combination: 'null' can only be used as a single case label or paired only with 'default'">null</error>, Integer i -> {}
case String s when s.isEmpty()<error descr="':' or '->' expected"><error descr="Unexpected token">,</error></error> null, <error descr="Expression expected">Integer</error><error descr="';' expected"> </error><error descr="Not a statement">i -> {}</error>
default -> {}
}
}
@@ -172,7 +172,7 @@ public class Main {
void test18(String s) {
switch (s) {
case "hello", "world", <error descr="Invalid case label combination: 'null' can only be used as a single case label or paired only with 'default'">null</error>, String str when str.isEmpty() -> {}
case "hello", "world", null, String str when <error descr="Cannot resolve symbol 'str'" textAttributesKey="WRONG_REFERENCES_ATTRIBUTES">str</error>.isEmpty() -> {}
default -> {}
}
}
@@ -199,7 +199,7 @@ public class Main {
void test22(Object obj) {
switch (obj) {
case String s when s.isEmpty(), <error descr="Invalid case label combination: 'null' can only be used as a single case label or paired only with 'default'">null</error>, Integer i -> {}
case String s when s.isEmpty()<error descr="':' or '->' expected"><error descr="Unexpected token">,</error></error> null, <error descr="Expression expected">Integer</error><error descr="';' expected"> </error><error descr="Not a statement">i -> {}</error>
default -> {}
}
}

View File

@@ -115,7 +115,7 @@ class IllegalFallthroughIn21Java {
String obj = "Hello";
switch (obj) {
case "a":
case <error descr="Multiple switch labels are permitted for a switch labeled statement group only if none of them declare any pattern variables">String i when i.length() == 1</error>:
case <error descr="Multiple switch labels are permitted for a switch labeled statement group only if none of them declare any pattern variables">String i</error> when i.length() == 1:
System.out.println();
}
}

View File

@@ -61,7 +61,7 @@ class Main {
case Integer i:
System.out.println("int");
break;
case <error descr="Label is dominated by a preceding case label 'Integer i'">Integer o1 when o1 != null</error>:
case <error descr="Label is dominated by a preceding case label 'Integer i'">Integer o1</error> when o1 != null:
System.out.println("num");
break;
default:
@@ -70,7 +70,7 @@ class Main {
}
str = switch (o) {
case Integer i -> "num";
case <error descr="Label is dominated by a preceding case label 'Integer i'">Integer o1 when o1 != null</error> -> "int";
case <error descr="Label is dominated by a preceding case label 'Integer i'">Integer o1</error> when o1 != null -> "int";
default -> "def";
};
@@ -112,7 +112,7 @@ class Main {
case Integer i when true:
System.out.println("int");
break;
case <error descr="Label is dominated by a preceding case label 'Integer i when true'">Integer o2 when o2 != null</error>:
case <error descr="Label is dominated by a preceding case label 'Integer i'">Integer o2</error> when o2 != null:
System.out.println("num");
break;
default:
@@ -121,7 +121,7 @@ class Main {
}
str = switch (o) {
case Integer i when true -> "num";
case <error descr="Label is dominated by a preceding case label 'Integer i when true'">Integer o2 when o2 != null</error> -> "int";
case <error descr="Label is dominated by a preceding case label 'Integer i'">Integer o2</error> when o2 != null -> "int";
default -> "def";
};
@@ -158,7 +158,7 @@ class Main {
};
switch (ii) {
case <error descr="'switch' has both an unconditional pattern and a default label">Integer i when true</error>:
case <error descr="'switch' has both an unconditional pattern and a default label">Integer i</error> when true:
System.out.println("int");
break;
case null:
@@ -169,7 +169,7 @@ class Main {
break;
}
str = switch (ii) {
case <error descr="'switch' has both an unconditional pattern and a default label">Integer i when true</error> -> "int";
case <error descr="'switch' has both an unconditional pattern and a default label">Integer i</error> when true -> "int";
case null -> "int";
<error descr="'switch' has both an unconditional pattern and a default label">default</error> -> "def";
};
@@ -218,7 +218,7 @@ class Main {
};
switch (d) {
case Day dd when true: break;
case <error descr="Label is dominated by a preceding case label 'Day dd when true'">MONDAY</error>: break;
case <error descr="Label is dominated by a preceding case label 'Day dd'">MONDAY</error>: break;
}
}
@@ -252,7 +252,7 @@ class Main {
};
switch (d) {
case <error descr="'switch' has both an unconditional pattern and a default label">Day dd when true</error>:
case <error descr="'switch' has both an unconditional pattern and a default label">Day dd</error> when true:
System.out.println("ok");
<error descr="'switch' has both an unconditional pattern and a default label">default</error>: // blah blah blah
System.out.println("mon");

View File

@@ -3,7 +3,7 @@ class X {
switch (obj) {
default -> System.out.println("default");
case <error descr="Label is dominated by a preceding case label 'default'">Integer i</error> -> System.out.println("Integer");
case <error descr="Label is dominated by a preceding case label 'default'">String s when s.isEmpty()</error> -> System.out.println("empty String");
case <error descr="Label is dominated by a preceding case label 'default'">String s</error> when s.isEmpty() -> System.out.println("empty String");
case <error descr="Label is dominated by a preceding case label 'default'">null</error> -> System.out.println("null");
}
}
@@ -12,7 +12,7 @@ class X {
switch (obj) {
case null, default -> System.out.println("null or default");
case <error descr="Label is dominated by a preceding case label 'default'">Integer i</error> -> System.out.println("Integer");
case <error descr="Label is dominated by a preceding case label 'default'">String s when s.isEmpty()</error> -> System.out.println("empty String");
case <error descr="Label is dominated by a preceding case label 'default'">String s</error> when s.isEmpty() -> System.out.println("empty String");
}
}
@@ -40,21 +40,21 @@ class X {
void testUnconditionalPatternAndDefault2(Integer j) {
switch (j) {
case <error descr="'switch' has both an unconditional pattern and a default label">Integer i when true</error> -> System.out.println("An integer");
case <error descr="'switch' has both an unconditional pattern and a default label">Integer i</error> when true -> System.out.println("An integer");
<error descr="'switch' has both an unconditional pattern and a default label">default</error> -> System.out.println("default");
}
}
void testDuplicateUnconditionalPattern1(Integer j) {
switch (j) {
case <error descr="Duplicate unconditional pattern">Integer i when true</error> -> System.out.println("An integer");
case <error descr="Duplicate unconditional pattern">Integer i</error> when true -> System.out.println("An integer");
case <error descr="Duplicate unconditional pattern">Number number</error> -> System.out.println("An integer");
}
}
void testDuplicateUnconditionalPattern2(Integer j) {
switch (j) {
case <error descr="Duplicate unconditional pattern">Integer i when true</error> -> System.out.println("An integer");
case <error descr="Duplicate unconditional pattern">Integer i</error> when true -> System.out.println("An integer");
case <error descr="Duplicate unconditional pattern">Integer i</error> -> System.out.println("An integer");
}
}

View File

@@ -58,7 +58,7 @@ class X {
void unconditionalGuardAndDefault(Object obj) {
switch (obj) {
case <error descr="'switch' has both an unconditional pattern and a default label">Object o when true</error> -> {}
case <error descr="'switch' has both an unconditional pattern and a default label">Object o</error> when true -> {}
<error descr="'switch' has both an unconditional pattern and a default label">default</error> -> {}
}
}
@@ -73,7 +73,7 @@ class X {
void dd7(String str) {
switch (str) {
case String i -> System.out.println(2);
case <error descr="Label is dominated by a preceding case label 'String i'">String i when i.length() == 2</error> -> System.out.println(2);
case <error descr="Label is dominated by a preceding case label 'String i'">String i</error> when i.length() == 2 -> System.out.println(2);
}
}

View File

@@ -63,19 +63,19 @@ class Dominance {
switch (object) {
case CharSequence s -> {
}
case <error descr="Label is dominated by a preceding case label 'CharSequence s'">String c when c.length() > 0</error> -> {
case <error descr="Label is dominated by a preceding case label 'CharSequence s'">String c</error> when c.length() > 0 -> {
}
}
switch (object) {
case CharSequence s when true -> {
}
case <error descr="Label is dominated by a preceding case label 'CharSequence s when true'">String c</error> -> {
case <error descr="Label is dominated by a preceding case label 'CharSequence s'">String c</error> -> {
}
}
switch (object) {
case CharSequence s when true -> {
}
case <error descr="Label is dominated by a preceding case label 'CharSequence s when true'">String c when c.length() > 0</error> -> {
case <error descr="Label is dominated by a preceding case label 'CharSequence s'">String c</error> when c.length() > 0 -> {
}
}
switch (object) {
@@ -96,7 +96,7 @@ class Dominance {
}
switch (object) {
case List<?> l -> System.out.println();
case <error descr="Label is dominated by a preceding case label 'List<?> l'">List<?> l when l.size() == 2</error> -> System.out.println();
case <error descr="Label is dominated by a preceding case label 'List<?> l'">List<?> l</error> when l.size() == 2 -> System.out.println();
default -> throw new IllegalStateException("Unexpected value: " + object);
}
switch (integer) {

View File

@@ -38,8 +38,8 @@ class Test {
void testGuards(Object obj) {
switch (obj) {
case Integer _ when <error descr="Guard expression is allowed only after the last label element">((Integer)obj) > 0</error>,
String _ when !((String)obj).isEmpty() -> System.out.println("Positive integer or non-empty string");
case Integer _ when ((Integer)obj) > 0<error descr="':' or '->' expected"><error descr="Unexpected token">,</error></error>
<error descr="Unnamed variable declaration must have an initializer">String _</error><error descr="';' expected"> </error><error descr="Cannot resolve symbol 'when'" textAttributesKey="WRONG_REFERENCES_ATTRIBUTES">when</error> <error descr="Not a statement">!((String)obj).isEmpty()</error> <error descr="Unexpected token">-></error> System.out.println("Positive integer or non-empty string");
default -> System.out.println("other");
}
}

View File

@@ -61,7 +61,7 @@ class Main {
case Integer i:
System.out.println("int");
break;
case <error descr="Label is dominated by a preceding case label 'Integer i'">Integer o1 when o1 != null</error>:
case <error descr="Label is dominated by a preceding case label 'Integer i'">Integer o1</error> when o1 != null:
System.out.println("num");
break;
default:
@@ -70,7 +70,7 @@ class Main {
}
str = switch (o) {
case Integer i -> "num";
case <error descr="Label is dominated by a preceding case label 'Integer i'">Integer o1 when o1 != null</error> -> "int";
case <error descr="Label is dominated by a preceding case label 'Integer i'">Integer o1</error> when o1 != null -> "int";
default -> "def";
};
@@ -112,7 +112,7 @@ class Main {
case Integer i when true:
System.out.println("int");
break;
case <error descr="Label is dominated by a preceding case label 'Integer i when true'">Integer o2 when o2 != null</error>:
case <error descr="Label is dominated by a preceding case label 'Integer i'">Integer o2</error> when o2 != null:
System.out.println("num");
break;
default:
@@ -121,7 +121,7 @@ class Main {
}
str = switch (o) {
case Integer i when true -> "num";
case <error descr="Label is dominated by a preceding case label 'Integer i when true'">Integer o2 when o2 != null</error> -> "int";
case <error descr="Label is dominated by a preceding case label 'Integer i'">Integer o2</error> when o2 != null -> "int";
default -> "def";
};
@@ -158,7 +158,7 @@ class Main {
};
switch (ii) {
case <error descr="'switch' has both an unconditional pattern and a default label">Integer i when true</error>:
case <error descr="'switch' has both an unconditional pattern and a default label">Integer i</error> when true:
System.out.println("int");
break;
case null:
@@ -169,7 +169,7 @@ class Main {
break;
}
str = switch (ii) {
case <error descr="'switch' has both an unconditional pattern and a default label">Integer i when true</error> -> "int";
case <error descr="'switch' has both an unconditional pattern and a default label">Integer i</error> when true -> "int";
case null -> "int";
<error descr="'switch' has both an unconditional pattern and a default label">default</error> -> "def";
};
@@ -222,7 +222,7 @@ class Main {
switch (d) {
case Day dd when true:
break;
case <error descr="Label is dominated by a preceding case label 'Day dd when true'">MONDAY</error>:
case <error descr="Label is dominated by a preceding case label 'Day dd'">MONDAY</error>:
break;
}
}
@@ -257,7 +257,7 @@ class Main {
};
switch (d) {
case <error descr="'switch' has both an unconditional pattern and a default label">Day dd when true</error>:
case <error descr="'switch' has both an unconditional pattern and a default label">Day dd</error> when true:
System.out.println("ok");
<error descr="'switch' has both an unconditional pattern and a default label">default</error>: // blah blah blah
System.out.println("mon");