[java-highlighting] IDEA-324586 Highlight duplicated values with casts in java 21. Fix for null

GitOrigin-RevId: 85c0a0e8608267502c300b150fa9c5df23521efb
This commit is contained in:
Mikhail Pyltsin
2023-07-07 16:10:49 +02:00
committed by intellij-monorepo-bot
parent 45d3ec5af9
commit d64809acc7
5 changed files with 17 additions and 14 deletions

View File

@@ -1957,9 +1957,6 @@ public class HighlightVisitorImpl extends JavaElementVisitor implements Highligh
// And even if the "case default" syntax was allowed not only in outdated preview versions of Java, using "case default:"
// instead of "default:" looks weird. Therefore, for this case, we do not check the feature availability and do not
// suggest increasing the language level.
if (!(element.getParent() instanceof PsiCaseLabelElementList labelElementList) || labelElementList.getElementCount() != 1) {
add(checkFeature(element, HighlightingFeature.PATTERNS_IN_SWITCH));
}
}
@Override

View File

@@ -713,6 +713,9 @@ public class SwitchBlockHighlightingModel {
if (operand != null) {
elements.putValue(ConstantExpressionUtil.computeCastTo(operand, mySelectorType), labelElement);
}
if (labelElement instanceof PsiLiteralExpression literalExpression && literalExpression.getType() == PsiTypes.nullType()) {
elements.putValue(null, labelElement);
}
}
else if (JavaPsiPatternUtil.isUnconditionalForType(labelElement, mySelectorType)) {
elements.putValue(myUnconditionalPattern, labelElement);

View File

@@ -6,7 +6,7 @@ class Main {
System.out.println();
case null:
System.out.println(<error descr="Cannot resolve symbol 'i'">i</error>);
case default:
default:
};
}
@@ -27,7 +27,6 @@ class Main {
case null:
throw new RuntimeException();
default: {}
case default:
case null:
System.out.println(<error descr="Cannot resolve symbol 'i'">i</error>);
}
@@ -41,7 +40,6 @@ class Main {
default: {
throw new RuntimeException();
}
case default:
case null:
System.out.println(<error descr="Cannot resolve symbol 'i'">i</error>);
}
@@ -53,7 +51,7 @@ class Main {
case Integer i:
System.out.println();
case null:
case default:
default:
continue;
case null:
System.out.println(<error descr="Cannot resolve symbol 'i'">i</error>);

View File

@@ -10,7 +10,7 @@ class Test {
switch (o) {
case Integer i when (switch (o) {
case Integer ii when ii != <error descr="Variable used in guarded pattern should be final or effectively final">mode</error> -> 2;
case default -> 1;
default -> 1;
}) == <error descr="Variable used in guarded pattern should be final or effectively final">mode</error> -> System.out.println();
default -> {}
}
@@ -26,12 +26,12 @@ class Test {
switch (o) {
case Integer i when (switch (<error descr="Variable used in guarded pattern should be final or effectively final">o</error>) {
case Integer ii when ii != mode -> 2;
case default -> 1;
default -> 1;
}) == mode -> o = null;
default -> {}
}
switch (o) {
case Integer i when (i = mode) > 0 -> System.out.println();
case Integer i when (<error descr="Cannot assign a value to variable 'i', because it is declared outside the guard">i</error> = mode) > 0 -> System.out.println();
default -> {}
}
}
@@ -52,7 +52,7 @@ class Test {
void testNested(Object o, Integer in) {
switch (o) {
case Integer mode when (mode = 42) > 9:
case Integer mode when (<error descr="Cannot assign a value to variable 'mode', because it is declared outside the guard">mode</error> = 42) > 9:
switch (o) {
case Integer i when (i = <error descr="Variable used in guarded pattern should be final or effectively final">mode</error>) > 0 -> System.out.println();
default -> System.out.println();
@@ -61,7 +61,7 @@ class Test {
}
String str;
str = switch (o) {
case Integer mode when (mode = 42) > 9 ->
case Integer mode when (<error descr="Cannot assign a value to variable 'mode', because it is declared outside the guard">mode</error> = 42) > 9 ->
switch (o) {
case Integer i when (i = <error descr="Variable used in guarded pattern should be final or effectively final">mode</error>) > 0 -> "";
default -> "";
@@ -69,7 +69,7 @@ class Test {
default -> "";
};
str = switch (o) {
case Integer mode when (mode = 42) > 9:
case Integer mode when (<error descr="Cannot assign a value to variable 'mode', because it is declared outside the guard">mode</error> = 42) > 9:
yield switch (o) {
case Integer i when (i = <error descr="Variable used in guarded pattern should be final or effectively final">mode</error>) > 0 -> "";
default -> "";
@@ -100,7 +100,7 @@ class Test {
}
// double nested
switch (o) {
case Integer mode when (mode = 42) > 9:
case Integer mode when (<error descr="Cannot assign a value to variable 'mode', because it is declared outside the guard">mode</error> = 42) > 9:
switch (o) {
case Integer i -> {
switch (o) {

View File

@@ -9,5 +9,10 @@ class DuplicatedWithCast {
case <error descr="Duplicate label '127'">b</error> -> System.out.println("b=" + b + ";");
case <error descr="Duplicate label '127'">127</error>-> System.out.println("sweet spot");
}
switch (args[0]) {
case <error descr="Duplicate label 'null'">null</error> -> System.out.println("null1");
case <error descr="Duplicate label 'null'">null</error> -> System.out.println("null2");
default -> System.out.println("default");
}
}
}