mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-01-03 15:50:52 +07:00
[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:
committed by
intellij-monorepo-bot
parent
005b179eae
commit
efbff7c99c
@@ -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 -> {}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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");
|
||||
|
||||
@@ -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");
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -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");
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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");
|
||||
|
||||
Reference in New Issue
Block a user