[java] value breaks: basic highlighting (IDEA-196643)

This commit is contained in:
Roman Shevchenko
2018-11-20 18:57:22 +01:00
parent ce161e00f3
commit d50cffbf0f
10 changed files with 164 additions and 104 deletions
@@ -101,8 +101,8 @@ class C {
int n;
return 2;
n = <error descr="Unreachable statement">switch</error>(s) {
case "a": n= 1;break;
default: n= 0;
case "a": n = 1; break 1;
default: n = 0; break 0;
};
}
@@ -12,7 +12,7 @@ class SwitchExpressions {
System.out.println(switch (new Random().nextInt()) {
case 0 -> throw new IllegalStateException("no args");
<error descr="Different case kinds used in the switch">case 1:</error> break;
<error descr="Different case kinds used in the switch">case 1:</error> break "lone";
});
System.out.println(
@@ -44,5 +44,18 @@ class SwitchExpressions {
case E1 -> 1;
case E2 -> 2;
});
lab: while (true) {
switch (new Random().nextInt()) {
case -1: return;
case -2: continue lab;
default: break lab;
}
System.out.println(switch (new Random().nextInt()) {
case -1: <error descr="Return outside of enclosing switch expression">return;</error>
case -2: <error descr="Continue outside of enclosing switch expression">continue lab;</error>
default: <error descr="Break outside of enclosing switch expression">break lab;</error>
});
}
}
}
@@ -0,0 +1,39 @@
class ValueBreaks {
static final int ref = -1;
void m() {
l1: break l1;
<error descr="Break outside switch or loop">break;</error>
break <error descr="Undefined label: 'wtf'">wtf</error>;
<error descr="Value break outside switch expression">break 42;</error>
switch (0) {
case 0: <error descr="Value break outside switch expression">break 42;</error>
case 1: break <error descr="Undefined label: 'ref'">ref</error>;
case 2: break <error descr="Undefined label: 'wtf'">wtf</error>;
case 3: ref: break ref;
};
sink(switch (0) {
case 0 -> { while (true) <error descr="Value break outside switch expression">break 42;</error> }
case 1 -> { while (true) break <error descr="Undefined label: 'ref'">ref</error>; }
case 2 -> { while (true) break <error descr="Undefined label: 'wtf'">wtf</error>; }
case 3 -> { break ref; }
case 4 -> { break <error descr="Cannot resolve symbol 'wtf'">wtf</error>; }
default -> throw new RuntimeException();
});
ref: sink(switch (0) {
default: break <error descr="Reference to 'ref' is ambiguous, both 'ref:' and 'ValueBreaks.ref' match">ref</error>;
});
while (true) {
sink(switch (0) {
default: <error descr="Missing break value">break;</error>
});
}
}
private static void sink(Object o) { }
}