Java: Highlight switch expressions that don't produce the result on some execution path (IDEA-202621)

This commit is contained in:
Pavel Dolgov
2018-11-22 16:13:48 +03:00
parent 8d6d4f9758
commit 153535ef9a
7 changed files with 247 additions and 0 deletions
@@ -177,4 +177,43 @@ class C {
};
System.out.println(<error descr="Variable 'n' might not have been initialized">n</error>);
}
void switchExpressionAssignedInFinally(int n) {
String s;
try {
} finally {
s = switch (n) {
case -1 -> throw new RuntimeException();
case 0 -> "a";
default -> "b";
};
}
System.out.println(s);
}
void allSwitchRulesAssignInFinally(int n) {
String s;
try {
} finally {
String string = switch (n) {
case -1 -> throw new RuntimeException();
case 0 -> s = "a";
default -> { break s = "b"; }
};
}
System.out.println(s);
}
void notAllSwitchRulesAssignInFinally(int n) {
String s;
try {
} finally {
String t = switch (n) {
case -1 -> throw new RuntimeException();
case 0 -> s = "a";
default -> "b";
};
}
System.out.println(<error descr="Variable 's' might not have been initialized">s</error>);
}
}
@@ -86,6 +86,30 @@ class C {
<error descr="Unreachable statement">System.out.println();</error>
}
void switchExpressionUnreachableInFinally(int n) {
String s;
try {
} finally {
return;
s = <error descr="Unreachable statement">switch</error> (n) {
case 0 -> "a";
default -> "b";
};
}
}
void switchExpressionReachableInFinally(int n) {
String s;
try {
return;
} finally {
s = switch (n) {
case 0 -> "a";
default -> "b";
};
}
}
static class SwitchExpressionReturnedFromTry {
int foo(String s) throws Exception {
try {
@@ -0,0 +1,149 @@
class C {
void defaultBranchHasNoResult(int n) {
String s = <error descr="Switch expression should produce result in all execution paths">switch</error> (n) {
default:
};
}
void defaultRuleHasNoResult(int n) {
String s = switch (n) {
<error descr="Switch expression rule should produce result in all execution paths">default</error> -> {}
};
}
void defaultBranchSometimesHasNoResult(int n, boolean b) {
String s = <error descr="Switch expression should produce result in all execution paths">switch</error> (n) {
default: {
if (b) break "";
}
};
}
void defaultRuleSometimesHasNoResult(int n, boolean b) {
String s = switch (n) {
<error descr="Switch expression rule should produce result in all execution paths">default</error> -> {
if (b) break "";
}
};
}
void defaultBranchAlwaysThrows(int n) {
String s = switch (n) {
default: throw new RuntimeException();
};
}
void defaultRuleAlwaysThrows(int n) {
String s = switch (n) {
default -> throw new RuntimeException();
};
}
void defaultBranchSometimesThrows(int n, boolean b) {
String s = switch (n) {
default:
if (b) throw new RuntimeException();
break "";
};
}
void defaultRuleSometimesThrows(int n, boolean b) {
String s = switch (n) {
default -> {
if (b) throw new RuntimeException();
break "";
}
};
}
void defaultBranchHasManyResults(int n, int k) {
String s = switch (n) {
default: {
if (k < n) break "a";
if (k > n) break "b";
break "c";
}
};
}
void defaultRuleHasManyResults(int n, int k) {
String s = switch (n) {
default -> {
if (k < n) break "a";
if (k > n) break "b";
break "c";
}
};
}
void oneOfBranchesHasNoResult(int n) {
String s = <error descr="Switch expression should produce result in all execution paths">switch</error> (n) {
case 0: break "";
default:
};
}
void oneOfRulesHasNoResult(int n) {
String s = switch (n) {
case 0 -> "";
<error descr="Switch expression rule should produce result in all execution paths">default</error> -> {
}
};
}
void allBranchesHaveNoResult(int n) {
String s = <error descr="Switch expression should produce result in all execution paths">switch</error> (n) {
case 0:
default:
};
}
void allRulesHaveNoResult(int n) {
String s = switch (n) {
<error descr="Switch expression rule should produce result in all execution paths">case</error> 0 -> {
}
<error descr="Switch expression rule should produce result in all execution paths">default</error> -> {
}
};
}
void allBranchesDoHaveResult(int n) {
String s = switch (n) {
case -1: throw new RuntimeException();
case 0: break "a";
default: break "b";
};
}
void allRulesDoHaveResult(int n) {
String s = switch (n) {
case -1 -> throw new RuntimeException();
case 0 -> "a";
default -> "b";
};
}
void allBranchesDoHaveResultInFinally(int n) {
String s;
try {
} finally {
s = switch (n) {
case -1: throw new RuntimeException();
case 0: break "a";
default: break "b";
};
}
}
void allRulesDoHaveResultInFinally(int n) {
String s;
try {
} finally {
s = switch (n) {
case -1 -> throw new RuntimeException();
case 0 -> "a";
default -> "b";
};
}
}
}