[java] Remove Java 17 Preview and Java 18 Preview language levels

IDEA-314047

GitOrigin-RevId: 8c24deb2dfb5361f08857d7933ab290476f4ce84
This commit is contained in:
Andrey Cherkasov
2023-06-19 14:25:55 +04:00
committed by intellij-monorepo-bot
parent c9fa72fe23
commit 9ccc820db2
96 changed files with 302 additions and 1438 deletions

View File

@@ -80,9 +80,7 @@ public final class LanguageLevelUtil {
ourPresentableShortMessage.put(LanguageLevel.JDK_15, "16");
ourPresentableShortMessage.put(LanguageLevel.JDK_16, "17");
ourPresentableShortMessage.put(LanguageLevel.JDK_17, "18");
ourPresentableShortMessage.put(LanguageLevel.JDK_17_PREVIEW, "18");
ourPresentableShortMessage.put(LanguageLevel.JDK_18, "19");
ourPresentableShortMessage.put(LanguageLevel.JDK_18_PREVIEW, "19");
ourPresentableShortMessage.put(LanguageLevel.JDK_19, "20");
ourPresentableShortMessage.put(LanguageLevel.JDK_19_PREVIEW, "20");
}

View File

@@ -46,8 +46,8 @@ public enum HighlightingFeature {
LOCAL_INTERFACES(LanguageLevel.JDK_16, "feature.local.interfaces"),
LOCAL_ENUMS(LanguageLevel.JDK_16, "feature.local.enums"),
INNER_STATICS(LanguageLevel.JDK_16, "feature.inner.statics"),
PATTERNS_IN_SWITCH(LanguageLevel.JDK_17_PREVIEW, "feature.patterns.in.switch"),
GUARDED_AND_PARENTHESIZED_PATTERNS(LanguageLevel.JDK_17_PREVIEW, "feature.guarded.and.parenthesised.patterns"),
PATTERNS_IN_SWITCH(LanguageLevel.JDK_19_PREVIEW, "feature.patterns.in.switch"),
GUARDED_AND_PARENTHESIZED_PATTERNS(LanguageLevel.JDK_19_PREVIEW, "feature.guarded.and.parenthesised.patterns"),
PATTERN_GUARDS_AND_RECORD_PATTERNS(LanguageLevel.JDK_19_PREVIEW, "feature.pattern.guard.and.record.patterns"),
RECORD_PATTERNS_IN_FOR_EACH(LanguageLevel.JDK_20_PREVIEW, "feature.record.patterns.in.for.each");

View File

@@ -451,7 +451,7 @@ public class SwitchBlockHighlightingModel {
PsiPattern pattern = patternClasses.get(permittedClass);
PsiSubstitutor substitutor = TypeConversionUtil.getSuperClassSubstitutor(selectorClass, permittedClass, PsiSubstitutor.EMPTY);
PsiType permittedType = JavaPsiFacade.getElementFactory(psiClass.getProject()).createType(psiClass, substitutor);
if (pattern == null && (PsiUtil.getLanguageLevel(permittedClass).isLessThan(LanguageLevel.JDK_18_PREVIEW) ||
if (pattern == null && (PsiUtil.getLanguageLevel(permittedClass).isLessThan(LanguageLevel.JDK_18) ||
TypeConversionUtil.areTypesConvertible(selectorType, permittedType)) ||
pattern != null && !JavaPsiPatternUtil.isUnconditionalForType(pattern, TypeUtils.getType(permittedClass), true)) {
nonVisited.add(permittedClass);
@@ -710,7 +710,7 @@ public class SwitchBlockHighlightingModel {
if (isConstantLabelElement(nextElement)) {
PsiExpression constExpr = ObjectUtils.tryCast(nextElement, PsiExpression.class);
assert constExpr != null;
if ((PsiUtil.getLanguageLevel(constExpr).isAtLeast(LanguageLevel.JDK_18_PREVIEW) ||
if ((PsiUtil.getLanguageLevel(constExpr).isAtLeast(LanguageLevel.JDK_19_PREVIEW) ||
JavaPsiPatternUtil.isUnconditionalForType(currentElement, mySelectorType)) &&
JavaPsiPatternUtil.dominates(currentElement, constExpr.getType())) {
result.put(nextElement, current);

View File

@@ -36,9 +36,7 @@ public enum LanguageLevel {
JDK_15(JavaPsiBundle.messagePointer("jdk.15.language.level.description"), 15),
JDK_16(JavaPsiBundle.messagePointer("jdk.16.language.level.description"), 16),
JDK_17(JavaPsiBundle.messagePointer("jdk.17.language.level.description"), 17),
JDK_17_PREVIEW(JavaPsiBundle.messagePointer("jdk.17.preview.language.level.description"), 17),
JDK_18(JavaPsiBundle.messagePointer("jdk.18.language.level.description"), 18),
JDK_18_PREVIEW(JavaPsiBundle.messagePointer("jdk.18.preview.language.level.description"), 18),
JDK_19(JavaPsiBundle.messagePointer("jdk.19.language.level.description"), 19),
JDK_19_PREVIEW(JavaPsiBundle.messagePointer("jdk.19.preview.language.level.description"), 19),
JDK_20(JavaPsiBundle.messagePointer("jdk.20.language.level.description"), 20),

View File

@@ -4,33 +4,14 @@ class Main {
private static final boolean TRUE = 1 == 1;
void testParenthesizedPattern(String s) {
if (s instanceof (<error descr="Pattern type 'String' is the same as expression type">String</error> s1)) {
if (s instanceof (String s1)) {
System.out.println(s1);
}
}
void testDeepParenthesizedPattern(String s) {
if (s instanceof ( ((( (( <error descr="Pattern type 'String' is the same as expression type">String</error> s1)) )) ) )) {
if (s instanceof ( ((( (( String s1)) )) ) )) {
System.out.println(s1);
}
}
void testGuardedPatternWithCompileTimeCondition1(String s) {
if (s instanceof (<error descr="Pattern type 'String' is the same as expression type">String</error> s1 && true)) {
System.out.println(s1);
}
}
void testGuardedPatternWithAlwaysTrueCondition2(String s) {
if (s instanceof (<error descr="Pattern type 'String' is the same as expression type">String</error> s1 && TRUE)) {
System.out.println(s1);
}
}
void testGuardedPatternWithAlwaysTrueCondition3(String s) {
if (s instanceof ((<error descr="Pattern type 'String' is the same as expression type">String</error> s1 && true) && true)) {
System.out.println(s1);
}
}
}

View File

@@ -3,8 +3,8 @@ class InstanceOfSubtype {
if (cs instanceof String) {}
if (cs instanceof String s) {}
if (cs instanceof CharSequence) {}
if (cs instanceof <error descr="Pattern type 'CharSequence' is the same as expression type">CharSequence</error> s) {}
if (cs instanceof CharSequence s) {}
if (cs instanceof Object) {}
if (cs instanceof <error descr="Pattern type 'Object' is a supertype of expression type 'CharSequence'">Object</error> s) {}
if (cs instanceof Object s) {}
}
}

View File

@@ -1,10 +0,0 @@
class InstanceOfSubtypeJava19 {
void test(CharSequence cs) {
if (cs instanceof String) {}
if (cs instanceof String s) {}
if (cs instanceof CharSequence) {}
if (cs instanceof CharSequence s) {}
if (cs instanceof Object) {}
if (cs instanceof Object s) {}
}
}

View File

@@ -3,20 +3,20 @@ import java.util.function.*;
class Test {
void test1(Object o, int mode) {
switch (o) {
case (Integer i) && i == <error descr="Variable used in guarded pattern should be final or effectively final">mode</error> -> System.out.println();
case (Integer i) when i == <error descr="Variable used in guarded pattern should be final or effectively final">mode</error> -> System.out.println();
default -> {}
}
switch (o) {
case (Integer i) && (switch (o) {
case Integer ii && ii != <error descr="Variable used in guarded pattern should be final or effectively final">mode</error> -> 2;
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;
}) == <error descr="Variable used in guarded pattern should be final or effectively final">mode</error> -> System.out.println();
default -> {}
}
switch (o) {
case (Integer i) && (i = <error descr="Variable used in guarded pattern should be final or effectively final">mode</error>) > 0 -> System.out.println();
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 -> {}
}
mode = 0;
@@ -24,26 +24,26 @@ class Test {
void test2(Object o, final int mode) {
switch (o) {
case (Integer i) && (switch (<error descr="Variable used in guarded pattern should be final or effectively final">o</error>) {
case Integer ii && ii != mode -> 2;
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;
}) == mode -> o = null;
default -> {}
}
switch (o) {
case (Integer i) && (i = mode) > 0 -> System.out.println();
case (Integer i) when (i = mode) > 0 -> System.out.println();
default -> {}
}
}
void test3(Object o, int mode) {
switch (o) {
case (Integer i) && i == mode -> System.out.println();
case (Integer i) when i == mode -> System.out.println();
default -> {}
}
switch (o) {
case (Integer i) && (switch (o) {
case Integer ii && ii != mode -> 2;
case (Integer i) when (switch (o) {
case Integer ii when ii != mode -> 2;
case default -> 1;
}) == mode -> System.out.println();
default -> {}
@@ -58,40 +58,40 @@ class Test {
void testNested(Object o, Integer in) {
switch (o) {
case Integer mode && (mode = 42) > 9:
case Integer mode when (mode = 42) > 9:
switch (o) {
case (Integer i) && (i = <error descr="Variable used in guarded pattern should be final or effectively final">mode</error>) > 0 -> System.out.println();
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();
}
default : break;
}
String str;
str = switch (o) {
case Integer mode && (mode = 42) > 9 ->
case Integer mode when (mode = 42) > 9 ->
switch (o) {
case (Integer i) && (i = <error descr="Variable used in guarded pattern should be final or effectively final">mode</error>) > 0 -> "";
case (Integer i) when (i = <error descr="Variable used in guarded pattern should be final or effectively final">mode</error>) > 0 -> "";
default -> "";
};
default -> "";
};
str = switch (o) {
case Integer mode && (mode = 42) > 9:
case Integer mode when (mode = 42) > 9:
yield switch (o) {
case (Integer i) && (i = <error descr="Variable used in guarded pattern should be final or effectively final">mode</error>) > 0 -> "";
case (Integer i) when (i = <error descr="Variable used in guarded pattern should be final or effectively final">mode</error>) > 0 -> "";
default -> "";
};
default: yield "";
};
// lambdas
str = switch (o) {
case Integer i && (i = <error descr="Variable used in guarded pattern should be final or effectively final">in</error>) > 0:
case Integer i when (i = <error descr="Variable used in guarded pattern should be final or effectively final">in</error>) > 0:
yield ((Function<Integer, String>)(x) -> (<error descr="Variable used in lambda expression should be final or effectively final">in</error> = 5) > 0 ? "" : null).apply(in);
default:
yield "";
};
Consumer<Integer> c = (mode) -> {
switch (o) {
case (Integer i) && (i = <error descr="Variable used in guarded pattern should be final or effectively final">in</error>) > 0 -> System.out.println();
case (Integer i) when (i = <error descr="Variable used in guarded pattern should be final or effectively final">in</error>) > 0 -> System.out.println();
default -> System.out.println();
}
<error descr="Variable used in lambda expression should be final or effectively final">in</error> = 1;
@@ -99,18 +99,18 @@ class Test {
// try-with-resources
try (<error descr="Variable used as a try-with-resources resource should be final or effectively final">in</error>) {
switch (o) {
case AutoCloseable ii && (<error descr="Variable used in guarded pattern should be final or effectively final">in</error> = ii) != null: break;
case AutoCloseable ii when (<error descr="Variable used in guarded pattern should be final or effectively final">in</error> = ii) != null: break;
default: break;
}
} catch (Exception e) {
}
// double nested
switch (o) {
case Integer mode && (mode = 42) > 9:
case Integer mode when (mode = 42) > 9:
switch (o) {
case Integer i -> {
switch (o) {
case Integer ii && ii > <error descr="Variable used in guarded pattern should be final or effectively final">mode</error>:
case Integer ii when ii > <error descr="Variable used in guarded pattern should be final or effectively final">mode</error>:
break;
default:
break;
@@ -122,11 +122,11 @@ class Test {
break;
}
str = switch (o) {
case Integer mode && (mode) > 9:
case Integer mode when (mode) > 9:
yield switch (o) {
case Integer i -> {
yield switch (o) {
case Integer ii && ii > mode: yield "";
case Integer ii when ii > mode: yield "";
default: yield "";
};
}
@@ -138,7 +138,7 @@ class Test {
void declaredInWhenExpression(Object obj) {
switch (obj) {
case Integer i && new Function<Integer, Boolean>() {
case Integer i when new Function<Integer, Boolean>() {
@Override
public Boolean apply(Integer integer) {
System.out.println(integer++);
@@ -151,7 +151,7 @@ class Test {
}
switch (obj) {
case Integer i && switch (i) {
case Integer i when switch (i) {
case 1 -> {
int num = 0;
++num;

View File

@@ -1,14 +1,14 @@
class Main {
void f(Object o) {
if (o instanceof (CharSequence cs && cs instanceof String s)) {
if (o instanceof CharSequence cs && cs instanceof String s) {
System.out.println(s);
}
}
void g(Object o) {
switch (o) {
case Integer i && o instanceof String s:
case Integer i when o instanceof String s:
System.out.println(s);
default:
};

View File

@@ -1,45 +0,0 @@
class Test {
void test(Object o, Integer integer) {
switch (o) {
case String s && <error descr="Incompatible types. Found: 'java.lang.Integer', required: 'boolean'">integer</error> -> System.out.println();
default -> {}
}
switch (o) {
case String s && isBool() -> System.out.println();
default -> {}
}
switch (o) {
case Integer i && <error descr="Incompatible types. Found: 'int', required: 'boolean'">isInt()</error>:
break;
default:
break;
}
switch (o) {
case Integer i && <error descr="Incompatible types. Found: 'null', required: 'boolean'">null</error>:
break;
default:
break;
}
boolean flag1;
switch (o) {
case Integer i && <error descr="Variable 'flag1' might not have been initialized">flag1</error> -> System.out.println(1);
default -> System.out.println(0);
}
boolean flag2;
switch (o) {
case Double d && foo(<error descr="Variable 'flag2' might not have been initialized">flag2</error>) -> System.out.println(2);
default -> System.out.println(0);
}
}
private native boolean isBool();
private native int isInt();
private native boolean foo(boolean blag);
}

View File

@@ -1,961 +0,0 @@
import java.util.*;
class Main {
static class X {
int f() { return 0; }
}
int switchTestResolve(Object o) {
int i1 = switch(o) {
case X x -> x.f();
default -> 1;
};
int i2 = switch(o) {
case null, X x -> x.f();
default -> 1;
};
int i3 = switch(o) {
case X x, null -> x.f();
default -> 1;
};
int i4 = switch(o) {
case String s, X x -> <error descr="Cannot resolve symbol 'x'">x</error>.f();
default -> 1;
};
int i5 = switch(o) {
case String s, X x -> <error descr="Cannot resolve symbol 'x'">x</error>.f();
default -> 1;
};
int i6 = switch(o) {
case X x, String s -> <error descr="Cannot resolve symbol 'x'">x</error>.f();
default -> 1;
};
return i1 + i2 + i3 + i4 + i5 + i6;
}
void checkSwitchSelectorType(boolean b, double d, int[] array) {
switch (<error descr="Selector type of 'boolean' is not supported">b</error>) {
case true:
System.out.println("true");
break;
case false:
System.out.println("false");
break;
}
String str;
str = switch(<error descr="Selector type of 'double' is not supported">d</error>) {
case 1 -> "ok";
case 2 -> "not ok";
};
switch (array) {
case int[] arr:
System.out.println("true");
break;
}
str = switch (array) {
case int[] arr -> "true";
};
// intersection type
var values = List.of("foo", 3, 4.0);
for (var value : values) {
switch (value) {
case Integer i -> System.out.println("integer !");
case String s -> System.out.println("string !");
case Object o -> System.out.println("object !");
}
}
}
void constLabelAndSelectorCompatibility(Number n, CharSequence c, Integer i, String s) {
switch (n) {
case <error descr="Incompatible types. Found: 'int', required: 'java.lang.Number'">1</error>:
System.out.println("ok");
}
String str;
str = switch (n) {
case <error descr="Incompatible types. Found: 'int', required: 'java.lang.Number'">1</error> -> "ok";
default -> "not ok";
};
switch (c) {
case <error descr="Incompatible types. Found: 'java.lang.String', required: 'java.lang.CharSequence'">"ok"</error>:
System.out.println("ok");
}
str = switch (c) {
case <error descr="Incompatible types. Found: 'java.lang.String', required: 'java.lang.CharSequence'">"ok"</error> -> "ok";
default -> "not ok";
};
switch (i) {
case <error descr="Incompatible types. Found: 'char', required: 'java.lang.Integer'">'1'</error>:
System.out.println("ok");
}
str = switch (i) {
case <error descr="Incompatible types. Found: 'char', required: 'java.lang.Integer'">'1'</error> ->"ok";
default -> "not ok";
};
switch (i) {
case 1:
System.out.println("ok");
}
str= switch (i) {
case 1 -> "ok";
default -> "not ok";
};
switch (s) {
case "null" :
System.out.println("null");
break;
default:
System.out.println("s");
}
str = switch (s) {
case "null" -> "null";
default -> "s";
};
}
void incompatibleNullLabelAndSelector(int i) {
switch (i) {
case <error descr="'null' cannot be converted to 'int'">null</error>:
System.out.println("ok");
}
String str;
str = switch (i) {
case <error descr="'null' cannot be converted to 'int'">null</error> -> "ok";
case Integer integer -> "int";
case Object obj -> "Object";
default -> "not ok";
};
}
void defaultAlwaysCompatible(int i) {
switch (i) {
case 1, default:
System.out.println("ok");
}
String str;
str = switch (i) {
case 1, default -> "ok";
};
}
void patternsCompatibilty(I i, Object o, List<? extends Number> list1, List<Integer> list2) {
switch (i) {
case Sub1 s2:
System.out.println("s1");
break;
case <error descr="Incompatible types. Found: 'Sub5', required: 'I'">Sub5 s5</error>:
System.out.println("s5");
case ((((<error descr="Incompatible types. Found: 'Sub5', required: 'I'">Sub5 s5</error>)) && Math.random() > 0.5)):
System.out.println("");
default:
System.out.println("s");
}
String str;
str = switch (i) {
case Sub1 s2 -> "s1";
case <error descr="Incompatible types. Found: 'Sub5', required: 'I'">Sub5 s5</error> -> "s5";
case ((((<error descr="Incompatible types. Found: 'Sub5', required: 'I'">Sub5 s5</error>)) && Math.random() > 0.5)) -> "";
default -> "s";
};
switch (i) {
// unconditional pattern
case Object oo:
System.out.println("s1");
}
str = switch (i) {
// unconditional pattern
case Object oo -> "s1";
};
// unsafe casts
switch (list1) {
case <error descr="'List<capture of ? extends Number>' cannot be safely cast to 'List<Integer>'">List<Integer> l</error>:
break;
case ((((<error descr="'List<capture of ? extends Number>' cannot be safely cast to 'List<Integer>'">List<Integer> l</error>)) && Math.random() > 0.5)):
break;
}
switch (list1.get(0)) {
case null: {}
default: {}
}
switch (new int[0]) {
case null: {}
default: {}
}
switch (list2) {
case List<? extends Number> l:
break;
}
switch (o) {
case <error descr="'Object' cannot be safely cast to 'List<Integer>'">List<Integer> ll</error>:
break;
case ((((<error descr="'Object' cannot be safely cast to 'List<Integer>'">List<Integer> ll</error>)) && Math.random() > 0.5)):
break;
case default:
break;
}
switch (list1) {
case Object oo:
break;
}
// null selector
switch (null) {
case null:
break;
default:
break;
};
str = switch (null) {
case null -> "null";
default -> "def";
};
switch (o) {
case <error descr="Unexpected type. Found: 'int', required: 'class or array'">int ii</error>: break;
case ((((<error descr="Unexpected type. Found: 'long', required: 'class or array'">long l</error>)) && Math.random() > 0.5)): break;
default: break;
}
str = switch (o) {
case <error descr="Unexpected type. Found: 'int', required: 'class or array'">int ii</error> -> "";
case ((((<error descr="Unexpected type. Found: 'long', required: 'class or array'">long l</error>)) && Math.random() > 0.5)) -> "";
default -> "";
};
}
private static final int constant = 1;
void duplicateLabels(Integer i) {
String str;
switch (i) {
case <error descr="Duplicate label '1'">1</error>:
break;
case <error descr="Duplicate label '1'">Main.constant</error>:
break;
}
str = switch (i) {
case <error descr="Duplicate label '1'">1</error> -> "";
case <error descr="Duplicate label '1'">constant</error> -> "";
};
// A switch label may not use more than one default label
switch (i) {
case 1, <error descr="Duplicate default label">default</error>:
System.out.println("s1");
break;
<error descr="Duplicate default label">default</error>:
System.out.println("s");
}
str = switch (i) {
case 1, <error descr="Duplicate default label">default</error> -> "s1";
<error descr="Duplicate default label">default</error> -> "s";
};
switch (i) {
case <error descr="Duplicate default label">default</error>:
System.out.println("s1");
break;
case <error descr="Duplicate default label">default</error>:
System.out.println("s");
}
str = switch (i) {
case <error descr="Duplicate default label">default</error> -> "s1";
case <error descr="Duplicate default label">default</error> -> "s";
};
// A switch label may not have more than one default case label element
switch (i) {
case <error descr="Duplicate default label">default</error>, <error descr="Duplicate default label">default</error>:
System.out.println("s");
}
str = switch (i) {
case <error descr="Duplicate default label">default</error>, <error descr="Duplicate default label">default</error> -> "s";
};
// A switch label may not have more than one null case label element.
switch (i) {
case 1, <error descr="Duplicate label 'null'">null</error>:
System.out.println("s");
case <error descr="Duplicate label 'null'">null</error>:
System.out.println("null");
}
str = switch (i) {
case 1, <error descr="Duplicate label 'null'">null</error> -> "s";
case <error descr="Duplicate label 'null'">null</error> -> "null";
};
// unconditional pattern duplicates
switch (i) {
case <error descr="Duplicate unconditional pattern">Object o</error>:
break;
case <error descr="Duplicate unconditional pattern">((Integer ii && true))</error>:
break;
}
str = switch (i) {
case ((Integer ii && false)) -> "";
case Number n -> "";
};
}
void fallThroughToPatterns(Object o, Integer ii) {
// If a switch label has a null case label element then if the switch label also has any pattern case element labels, t
// they must be type patterns (14.30.1).
switch (o) {
case Integer i && i != null, <error descr="Illegal fall-through from a pattern">null</error>:
break;
case default:
break;
}
String str;
str = switch (o) {
case Integer i && i != null, <error descr="Illegal fall-through from a pattern">null</error> -> "s";
default -> "null";
};
switch (o) {
case null, <error descr="Illegal fall-through to a pattern">Integer i && i != null</error>:
break;
case default:
break;
}
str = switch (o) {
case null, <error descr="Illegal fall-through to a pattern">Integer i && i != null</error> -> "s";
default -> "null";
};
switch (o) {
case null: case <error descr="Illegal fall-through to a pattern">Integer i && i != null</error>:
break;
case default:
break;
}
str = switch (o) {
case null: case <error descr="Illegal fall-through to a pattern">Object i && i != null</error>: yield "sfds";
};
str = switch (o) {
case null, <error descr="Illegal fall-through to a pattern">Object i && i != null</error> -> "sfds";
case default -> "fsd";
};
switch (o) {
case null: case Integer i:
break;
case default:
break;
}
str = switch (o) {
case null: case Integer i: yield "s";
case default: yield "d";
};
// A switch label may not have more than one pattern case label element.
switch (o) {
case Integer i, <error descr="Illegal fall-through to a pattern">Long l && l != null</error>: System.out.println("s");
default: System.out.println("null");
}
str = switch (o) {
case Integer i, <error descr="Illegal fall-through to a pattern">Long l && l != null</error> -> "s";
default -> "null";
};
switch (o) {
case Integer i: case <error descr="Illegal fall-through to a pattern">Long l</error>: System.out.println("s");
default: System.out.println("null");
}
str = switch (o) {
case Integer i: case <error descr="Illegal fall-through to a pattern">Long l</error>: yield "s";
default: yield "res";
};
// A switch label may not have both a pattern case label element and a default case label element.
switch (o) {
case Integer i, <error descr="Illegal fall-through from a pattern">default</error>: System.out.println("s");
}
str = switch (o) {
case Integer i, <error descr="Illegal fall-through from a pattern">default</error> -> "s";
};
switch (o) {
case default, <error descr="Illegal fall-through to a pattern">Integer i</error>: System.out.println("s");
}
str = switch (o) {
case default, <error descr="Illegal fall-through to a pattern">Integer i</error> -> "s";
};
switch (o) {
case Integer i: case <error descr="Illegal fall-through from a pattern">default</error>: System.out.println("s");
}
str = switch (o) {
case Integer i: case <error descr="Illegal fall-through from a pattern">default</error>: yield "s";
};
switch (ii) {
case Integer i && i > 1:
<error descr="Illegal fall-through from a pattern">default</error>: System.out.println("null");
}
str = switch (ii) {
case Integer i && i > 1:
<error descr="Illegal fall-through from a pattern">default</error>: yield "null";
};
// If a switch label has a constant case label element then if the switch label also has other case element labels
// they must be either a constant case label element, the default case label element, or the null case label element.
switch (ii) {
case 1, <error descr="Illegal fall-through to a pattern">Integer i1 && i1 > 5</error>:
System.out.println("s1");
break;
default: System.out.println("null");
}
str = switch (ii) {
case 1, <error descr="Illegal fall-through to a pattern">Integer i1 && i1 > 5</error> -> "s1";
default -> "null";
};
switch (ii) {
case Integer i1 && i1 > 5, <error descr="Illegal fall-through from a pattern">1</error>:
System.out.println("s1");
break;
default: System.out.println("null");
}
str = switch (ii) {
case Integer i1 && i1 > 5, <error descr="Illegal fall-through from a pattern">1</error> -> "s1";
default -> "null";
};
switch (ii) {
case 1, 2: case null, <error descr="Illegal fall-through to a pattern">Integer i1 && i1 > 5</error>:
System.out.println("s1");
break;
default: System.out.println("null");
}
// more complex case
switch (ii) {
case 1, null, <error descr="Illegal fall-through to a pattern">Integer i1 && i1 > 5</error>, <error descr="Illegal fall-through from a pattern">default</error>:
System.out.println("s1");
break;
}
str = switch (ii) {
case 1, null, <error descr="Illegal fall-through to a pattern">Integer i1 && i1 > 5</error>, <error descr="Illegal fall-through from a pattern">default</error> -> "s1";
};
str = switch (ii) {
case 1, 2, <error descr="Illegal fall-through to a pattern">Integer i1 && i1 > 5</error>: case <error descr="Illegal fall-through from a pattern">null</error>:
System.out.println("s1");
yield "s1";
default: yield "def";
};
/**
* It is a compile-time error if there is a statement in a switch block that consists of switch-labeled statement groups
* for which both of the following are true:
* It is labeled with a switch label that has a pattern case label element whose pattern introduces a pattern variable.
* There is a statement preceding it in the switch block and that statement can completely normally (14.22).
*/
switch (o) {
case default:
System.out.println("def");
case <error descr="Illegal fall-through to a pattern">Float d</error>:
System.out.println("float");
}
switch (o) {
case null, Integer i:
if (o != null) {
throw new IllegalArgumentException("");
}
case <error descr="Illegal fall-through to a pattern">Float d</error>:
System.out.println("float");
}
switch (o) {
case null:
if (o != null) {
throw new IllegalArgumentException("");
}
break;
case Float d:
System.out.println("float");
default:
System.out.println("ok");
}
// switch expressions
str = switch (o) {
case null, Integer i:
if (o != null) {
throw new IllegalArgumentException("");
}
case <error descr="Illegal fall-through to a pattern">Float d</error>:
System.out.println("float");
default:
yield "1";
};
str = switch (o) {
case null:
if (o != null) {
throw new IllegalArgumentException("");
}
yield "1";
case Float d:
System.out.println("float");
default:
yield "1";
};
}
void dominance(Object o, Integer ii, String s, Day d) {
// A switch label that has a pattern case label element p dominates another switch label that has a pattern case label element q if p dominates q
switch (o) {
case List n:
System.out.println("num");
break;
case <error descr="Label is dominated by a preceding case label 'List n'">List i</error>:
System.out.println("int");
break;
default:
System.out.println("def");
break;
}
String str;
str = switch (o) {
case List n -> "num";
case <error descr="Label is dominated by a preceding case label 'List n'">List i</error> -> "int";
default -> "def";
};
switch (o) {
case Number n:
System.out.println("num");
break;
case <error descr="Label is dominated by a preceding case label 'Number n'">Integer i</error>:
System.out.println("int");
break;
default:
System.out.println("def");
break;
}
str = switch (o) {
case Number n -> "num";
case <error descr="Label is dominated by a preceding case label 'Number n'">Integer i</error> -> "int";
default -> "def";
};
// Dominance permits a guarded pattern to be followed by its unguarded form:
switch (o) {
case Integer o1 && o1 != null:
System.out.println("num");
break;
case Integer i:
System.out.println("int");
break;
default:
System.out.println("def");
break;
}
str = switch (o) {
case Integer o1 && o1 != null -> "num";
case Integer i -> "int";
default -> "def";
};
switch (o) {
case (Integer i):
System.out.println("int");
break;
case <error descr="Label is dominated by a preceding case label '(Integer i)'">Integer o1 && o1 != null</error>:
System.out.println("num");
break;
default:
System.out.println("def");
break;
}
str = switch (o) {
case (Integer i) -> "num";
case <error descr="Label is dominated by a preceding case label '(Integer i)'">Integer o1 && o1 != null</error> -> "int";
default -> "def";
};
switch (o) {
case (Integer o1 && o1 > 5):
System.out.println("int");
break;
case Integer o2 && o2 != null:
System.out.println("num");
break;
default:
System.out.println("def");
break;
}
str = switch (o) {
case (Integer o1 && o1 > 5) -> "num";
case Integer o2 && o2 != null -> "int";
default -> "def";
};
switch (o) {
case (Number i && false):
System.out.println("int");
break;
case Integer o2 && o2 != null:
System.out.println("num");
break;
default:
System.out.println("def");
break;
}
str = switch (o) {
case (Number i && false) -> "num";
case Integer o2 && o2 != null -> "int";
default -> "def";
};
switch (o) {
case (Integer i && true):
System.out.println("int");
break;
case <error descr="Label is dominated by a preceding case label '(Integer i && true)'">(Integer o2 && o2 != null)</error>:
System.out.println("num");
break;
default:
System.out.println("def");
break;
}
str = switch (o) {
case (Integer i && true) -> "num";
case <error descr="Label is dominated by a preceding case label '(Integer i && true)'">(Integer o2 && o2 != null)</error> -> "int";
default -> "def";
};
// A switch label that has a pattern case label element p that is total for the type of the selector expression
// of the enclosing switch statement or switch expression dominates a switch label that has a null case label element.
switch (ii) {
case Object obj:
System.out.println("int");
break;
case <error descr="Label is dominated by a preceding case label 'Object obj'">null</error>:
System.out.println("num");
break;
default:
System.out.println("def");
break;
}
str = switch (ii) {
case Object obj -> "num";
case <error descr="Label is dominated by a preceding case label 'Object obj'">null</error> -> "int";
default -> "def";
};
switch (ii) {
case Object obj, <error descr="Label is dominated by a preceding case label 'Object obj'">null</error>:
System.out.println("int");
break;
default:
System.out.println("def");
break;
}
str = switch (ii) {
case Object obj, <error descr="Label is dominated by a preceding case label 'Object obj'">null</error> -> "int";
default -> "def";
};
switch (ii) {
case (Integer i && true):
System.out.println("int");
break;
case <error descr="Label is dominated by a preceding case label '(Integer i && true)'">null</error>:
System.out.println("num");
break;
default:
System.out.println("def");
break;
}
str = switch (ii) {
case (Integer i && true) -> "int";
case <error descr="Label is dominated by a preceding case label '(Integer i && true)'">null</error> -> "int";
default -> "def";
};
switch (ii) {
case ((Integer i && false)):
System.out.println("int");
break;
case null:
System.out.println("num");
break;
default:
System.out.println("def");
break;
}
str = switch (ii) {
case ((Integer i && false)) -> "int";
case null -> "int";
default -> "def";
};
// A switch label that has a pattern case label element p dominates another switch label that has a constant case label element c
// if either of the following is true:
//the type of c is a primitive type and its wrapper class is a subtype of the erasure of the type of p.
//the type of c is a reference type and is a subtype of the erasure of the type of p.
switch (ii) {
case Integer i:
break;
case <error descr="Label is dominated by a preceding case label 'Integer i'">1</error>: case <error descr="Label is dominated by a preceding case label 'Integer i'">2</error>:
break;
}
str = switch (s) {
case String sss -> "s";
case <error descr="Label is dominated by a preceding case label 'String sss'">"1"</error>, <error descr="Label is dominated by a preceding case label 'String sss'">"2"</error> -> "1";
};
// !!! here are some contradictory examples with spec, but javac still compiles them. To be discussed in the mailing list
// at least for now it's look quite logical if we have an unconditional pattern in a switch label, and following constant switch label,
// then the first switch label dominates the second one.
switch (d) {
case Day dd: break;
case <error descr="Label is dominated by a preceding case label 'Day dd'">MONDAY</error>: break;
}
str = switch (ii) {
case Integer in && in != null -> "";
case 1 -> "";
case default -> "";
};
switch (d) {
case (Day dd && true): break;
case <error descr="Label is dominated by a preceding case label '(Day dd && true)'">MONDAY</error>: break;
}
}
void completeness(Day d, I i, I2 i2, I3 i3, AorBorC abc, J1 j, II<Integer> ii) {
// old style switch, no completeness check
switch (d) {
case MONDAY, TUESDAY -> System.out.println("ok");
}
// If the type of the selector expression is an enum type E
String str;
switch (<error descr="'switch' statement does not cover all possible input values">d</error>) {
case Day dd && dd != null:
System.out.println("ok");
case MONDAY:
System.out.println("mon");
};
switch (<error descr="'switch' statement does not cover all possible input values">d</error>) {
case Day dd && dd != null:
System.out.println("ok");
};
str = switch (<error descr="'switch' expression does not cover all possible input values">d</error>) {
case MONDAY, TUESDAY -> System.out.println("ok");
};
str = switch (d) {
case MONDAY, TUESDAY, WEDNESDAY -> "ok";
};
str = switch (d) {
case MONDAY, TUESDAY, default -> "ok";
};
switch (d) {
case <error descr="'switch' has both an unconditional pattern and a default label">((Day dd && true))</error>:
System.out.println("ok");
<error descr="'switch' has both an unconditional pattern and a default label"><caret>default</error>: // blah blah blah
System.out.println("mon");
};
switch (d) {
case ((Day dd && dd != null)):
System.out.println("ok");
default:
System.out.println("mon");
};
// If the type of the selector expression, T, names a sealed interface or a sealed class that is abstract
switch(i) {
case Sub1 s1:
System.out.println("ok");
break;
case Sub2 s2:
System.out.println("ok");
break;
case Sub3 s3:
System.out.println("ok");
break;
}
str = switch(i) {
case Sub1 s1 -> "ok";
case Sub2 s2 -> "ok";
case Sub3 s3 && true -> "ok";
};
switch (<error descr="'switch' statement does not cover all possible input values">i</error>) {
case Sub1 s1:
System.out.println("ok");
break;
case Sub2 s2:
System.out.println("ok");
break;
}
str = switch(<error descr="'switch' expression does not cover all possible input values">i</error>) {
case Sub1 s1 -> "ok";
case Sub2 s2 -> "ok";
};
switch (<error descr="'switch' statement does not cover all possible input values">i</error>) {
case Sub1 s1:
System.out.println("ok");
break;
case Sub2 s2:
System.out.println("ok");
break;
case Sub4 s4:
System.out.println("ok");
break;
case Sub6 s6:
System.out.println("ok");
break;
}
str = switch(<error descr="'switch' expression does not cover all possible input values">i</error>) {
case Sub1 s1 -> "ok";
case Sub2 s2 -> "ok";
case Sub4 s4 -> "ok";
case Sub6 s6 -> "ok";
};
switch (<error descr="'switch' statement does not cover all possible input values">i</error>) {
case Sub1 s1:
break;
case (Sub2 s2 && false):
break;
case Sub3 s3:
break;
}
str = switch(<error descr="'switch' expression does not cover all possible input values">i</error>) {
case I in && in != null -> "ok";
};
switch (i3) {
case (Sub9 s && true):
break;
case Sub11 s:
break;
case Sub12 s && true:
break;
}
str = switch (abc) {
case A a -> "1";
case B b -> "2";
case C c -> "3";
};
str = switch (abc) {
case A a -> "1";
case C c -> "2";
case AorB ab -> "3";
case BorC bc -> "4";
};
switch (j) {
case R1 r1:
break;
case R2 r2:
break;
}
// If the type of the selector expression, T, is not an enum type and also does not name a sealed interface or a sealed class that is abstract
switch (<error descr="'switch' statement does not cover all possible input values">i2</error>) {
case Sub7 s1:
System.out.println("ok");
break;
case Sub8 s2:
System.out.println("ok");
break;
}
str = switch (<error descr="'switch' expression does not cover all possible input values">i2</error>) {
case Sub7 s1 -> "ok";
case Sub8 s2 -> "ok";
};
// empty switches
switch (d) {
}
str = switch (<error descr="'switch' expression does not have any case clauses">d</error>) {
};
switch (<error descr="'switch' statement does not have any case clauses">i</error>) {
}
str = switch (<error descr="'switch' expression does not have any case clauses">i</error>) {
};
switch (<error descr="'switch' statement does not have any case clauses">i2</error>) {
}
str = switch (<error descr="'switch' expression does not have any case clauses">i2</error>) {
};
switch (<error descr="'switch' statement does not cover all possible input values">ii</error>) {
case BB b -> {}
}
}
}
sealed interface I {
}
enum Day {
MONDAY, TUESDAY, WEDNESDAY
}
final class Sub1 implements I {
}
final class Sub2 implements I {
}
sealed class Sub3 implements I {
}
final class Sub4 extends Sub3 {
}
final class Sub5 {
}
final class Sub6 extends Sub3 {
}
interface I2 {
}
class Sub7 implements I2 {
}
class Sub8 implements I2 {
}
sealed interface I3 {
}
final class Sub9 implements I3 {
}
sealed abstract class Sub10 implements I3 {
}
final class Sub11 extends Sub10 {
}
final class Sub12 extends Sub10 {
}
sealed interface AorBorC {}
sealed interface AorB extends AorBorC {}
sealed interface BorC extends AorBorC {}
sealed interface AorC extends AorBorC {}
final class A implements AorB, AorC {}
final class B implements AorB, BorC {}
final class C implements AorC, BorC {}
sealed interface J1 {}
sealed interface J2 extends J1 permits R1 {}
record R1() implements J1, J2 {}
record R2() implements J1 {}
sealed interface II<T> {}
final class AA implements II<String> {}
final class BB<T> implements II<Object> {}

View File

@@ -41,7 +41,7 @@ class Main {
// Dominance permits a guarded pattern to be followed by its unguarded form:
switch (o) {
case Integer o1 && o1 != null:
case Integer o1 when o1 != null:
System.out.println("num");
break;
case Integer i:
@@ -52,7 +52,7 @@ class Main {
break;
}
str = switch (o) {
case Integer o1 && o1 != null -> "num";
case Integer o1 when o1 != null -> "num";
case Integer i -> "int";
default -> "def";
};
@@ -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 && o1 != null</error>:
case <error descr="Label is dominated by a preceding case label '(Integer i)'">Integer o1 when o1 != null</error>:
System.out.println("num");
break;
default:
@@ -70,15 +70,15 @@ class Main {
}
str = switch (o) {
case (Integer i) -> "num";
case <error descr="Label is dominated by a preceding case label '(Integer i)'">Integer o1 && o1 != null</error> -> "int";
case <error descr="Label is dominated by a preceding case label '(Integer i)'">Integer o1 when o1 != null</error> -> "int";
default -> "def";
};
switch (o) {
case (Integer o1 && o1 > 5):
case Integer o1 when o1 > 5:
System.out.println("int");
break;
case Integer o2 && o2 != null:
case Integer o2 when o2 != null:
System.out.println("num");
break;
default:
@@ -86,16 +86,16 @@ class Main {
break;
}
str = switch (o) {
case (Integer o1 && o1 > 5) -> "num";
case Integer o2 && o2 != null -> "int";
case Integer o1 when o1 > 5 -> "num";
case Integer o2 when o2 != null -> "int";
default -> "def";
};
switch (o) {
case (Number i && false):
case Number i when Math.random() > 0.5:
System.out.println("int");
break;
case Integer o2 && o2 != null:
case Integer o2 when o2 != null:
System.out.println("num");
break;
default:
@@ -103,16 +103,16 @@ class Main {
break;
}
str = switch (o) {
case (Number i && false) -> "num";
case Integer o2 && o2 != null -> "int";
case Number i when Math.random() > 0.5 -> "num";
case Integer o2 when o2 != null -> "int";
default -> "def";
};
switch (o) {
case (Integer i && true):
case Integer i when true:
System.out.println("int");
break;
case <error descr="Label is dominated by a preceding case label '(Integer i && true)'">(Integer o2 && o2 != null)</error>:
case <error descr="Label is dominated by a preceding case label 'Integer i when true'">Integer o2 when o2 != null</error>:
System.out.println("num");
break;
default:
@@ -120,62 +120,62 @@ class Main {
break;
}
str = switch (o) {
case (Integer i && true) -> "num";
case <error descr="Label is dominated by a preceding case label '(Integer i && true)'">(Integer o2 && o2 != null)</error> -> "int";
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";
default -> "def";
};
// A switch label that has a pattern case label element p that is total for the type of the selector expression
// of the enclosing switch statement or switch expression dominates a switch label that has a null case label element.
switch (ii) {
case Object obj:
case <error descr="'switch' has both an unconditional pattern and a default label">Object obj</error>:
System.out.println("int");
break;
case <error descr="Label is dominated by a preceding case label 'Object obj'">null</error>:
case null:
System.out.println("num");
break;
default:
<error descr="'switch' has both an unconditional pattern and a default label">default</error>:
System.out.println("def");
break;
}
str = switch (ii) {
case Object obj -> "num";
case <error descr="Label is dominated by a preceding case label 'Object obj'">null</error> -> "int";
default -> "def";
case <error descr="'switch' has both an unconditional pattern and a default label">Object obj</error> -> "num";
case null -> "int";
<error descr="'switch' has both an unconditional pattern and a default label">default</error> -> "def";
};
switch (ii) {
case Object obj, <error descr="Label is dominated by a preceding case label 'Object obj'">null</error>:
case <error descr="'switch' has both an unconditional pattern and a default label">Object obj</error>, null:
System.out.println("int");
break;
default:
<error descr="'switch' has both an unconditional pattern and a default label">default</error>:
System.out.println("def");
break;
}
str = switch (ii) {
case Object obj, <error descr="Label is dominated by a preceding case label 'Object obj'">null</error> -> "int";
default -> "def";
case <error descr="'switch' has both an unconditional pattern and a default label">Object obj</error>, null -> "int";
<error descr="'switch' has both an unconditional pattern and a default label">default</error> -> "def";
};
switch (ii) {
case (Integer i && true):
case <error descr="'switch' has both an unconditional pattern and a default label">Integer i when true</error>:
System.out.println("int");
break;
case <error descr="Label is dominated by a preceding case label '(Integer i && true)'">null</error>:
case null:
System.out.println("num");
break;
default:
<error descr="'switch' has both an unconditional pattern and a default label">default</error>:
System.out.println("def");
break;
}
str = switch (ii) {
case (Integer i && true) -> "int";
case <error descr="Label is dominated by a preceding case label '(Integer i && true)'">null</error> -> "int";
default -> "def";
case <error descr="'switch' has both an unconditional pattern and a default label">Integer i when true</error> -> "int";
case null -> "int";
<error descr="'switch' has both an unconditional pattern and a default label">default</error> -> "def";
};
switch (ii) {
case ((Integer i && false)):
case Integer i when Math.random() > 0.5:
System.out.println("int");
break;
case null:
@@ -186,7 +186,7 @@ class Main {
break;
}
str = switch (ii) {
case ((Integer i && false)) -> "int";
case Integer i when Math.random() > 0.5 -> "int";
case null -> "int";
default -> "def";
};
@@ -212,13 +212,13 @@ class Main {
case <error descr="Label is dominated by a preceding case label 'Day dd'">MONDAY</error>: break;
}
str = switch (ii) {
case (Integer in && in != null) -> "";
case <error descr="Label is dominated by a preceding case label '(Integer in && in != null)'">1</error> -> "";
case Integer in when in != null -> "";
case <error descr="Label is dominated by a preceding case label 'Integer in when in != null'">1</error> -> "";
case default -> "";
};
switch (d) {
case (Day dd && true): break;
case <error descr="Label is dominated by a preceding case label '(Day dd && true)'">MONDAY</error>: break;
case Day dd when true: break;
case <error descr="Label is dominated by a preceding case label 'Day dd when true'">MONDAY</error>: break;
}
}
@@ -231,13 +231,13 @@ class Main {
// If the type of the selector expression is an enum type E
String str;
switch (d) {
case Day dd && dd != null:
case Day dd when dd != null:
System.out.println("ok");
case <error descr="Label is dominated by a preceding case label 'Day dd && dd != null'">MONDAY</error>:
case <error descr="Label is dominated by a preceding case label 'Day dd when dd != null'">MONDAY</error>:
System.out.println("mon");
};
switch (<error descr="'switch' statement does not cover all possible input values">d</error>) {
case Day dd && dd != null:
case Day dd when dd != null:
System.out.println("ok");
};
@@ -252,13 +252,13 @@ class Main {
};
switch (d) {
case <error descr="'switch' has both an unconditional pattern and a default label">((Day dd && true))</error>:
case <error descr="'switch' has both an unconditional pattern and a default label">Day dd when true</error>:
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");
};
switch (d) {
case ((Day dd && dd != null)):
case Day dd when dd != null:
System.out.println("ok");
default:
System.out.println("mon");
@@ -279,7 +279,7 @@ class Main {
str = switch(i) {
case Sub1 s1 -> "ok";
case Sub2 s2 -> "ok";
case Sub3 s3 && true -> "ok";
case Sub3 s3 when true -> "ok";
};
switch (<error descr="'switch' statement does not cover all possible input values">i</error>) {
@@ -318,21 +318,21 @@ class Main {
switch (<error descr="'switch' statement does not cover all possible input values">i</error>) {
case Sub1 s1:
break;
case (Sub2 s2 && false):
case Sub2 s2 when Math.random() > 0.5:
break;
case Sub3 s3:
break;
}
str = switch(<error descr="'switch' expression does not cover all possible input values">i</error>) {
case I in && in != null -> "ok";
case I in when in != null -> "ok";
};
switch (i3) {
case (Sub9 s && true):
case Sub9 s when true:
break;
case Sub11 s:
break;
case Sub12 s && true:
case Sub12 s when true:
break;
}

View File

@@ -3,19 +3,19 @@ class Main {
static int m(Object o) {
int i1 = switch(o) {
case String s && s.length() > 0 -> s.length();
case String s when s.length() > 0 -> s.length();
case String s -> s.length();
default -> 1;
};
int i2 = switch(o) {
case String s && (s.length() > 0) -> s.length();
case String s when (s.length() > 0) -> s.length();
case String s -> s.length();
default -> 1;
};
if (o instanceof (String s && s.length() > 0)) {}
if (o instanceof (String s && (s.length() > 0))) {}
if (o instanceof String s && s.length() > 0) {}
if (o instanceof String s && (s.length() > 0)) {}
return i1 + i2;
}

View File

@@ -21,7 +21,7 @@ class Test {
void testEnumUnreachable2(Day d) {
switch (d) {
case (Day dd && true):
case Day dd when true:
throw new IllegalArgumentException();
}
<error descr="Unreachable statement">System.out.println();</error>

View File

@@ -1,10 +1,10 @@
class RecordPatternsAndWhenGuardsInJava18 {
void test(Object o) {
switch (o) {
case <error descr="Pattern guards and record patterns are not supported at language level '18'">MyRecord(int x) r</error> -> {
case MyRecord(int <error descr="Patterns in switch are not supported at language level '18'">x</error>) <error descr="Patterns in switch are not supported at language level '18'">r</error> -> {
}
case <error descr="Pattern guards and record patterns are not supported at language level '18'">String s when s.length() > 10</error> -> {
case String <error descr="Patterns in switch are not supported at language level '18'">s</error> when s.length() > 10 -> {
}
default -> {

View File

@@ -2,9 +2,9 @@ class Main {
void statement(Object o) {
switch (o) {
case Integer n && n > 1:
case Integer n when n > 1:
break;
case Integer n && n < 1:
case Integer n when n < 1:
break;
default:
break;
@@ -13,8 +13,8 @@ class Main {
int expression(Object o) {
return switch (o) {
case Integer n && n > 1 -> n;
case Integer n && n < 1 -> n;
case Integer n when n > 1 -> n;
case Integer n when n < 1 -> n;
default -> 0;
};
}
@@ -22,12 +22,12 @@ class Main {
int nestedExpression(Object o, Object o2, int p) {
int m = 0;
return switch (o) {
case Integer n && n > 1 -> switch(o2) {
case Integer <error descr="Variable 'm' is already defined in the scope">m</error> && m > 0 -> m + n;
case Integer n when n > 1 -> switch(o2) {
case Integer <error descr="Variable 'm' is already defined in the scope">m</error> when m > 0 -> m + n;
case Integer <error descr="Variable 'p' is already defined in the scope">p</error> -> p + n;
default -> 0;
};
case Integer n && n < 1 -> n;
case Integer n when n < 1 -> n;
default -> 0;
};
}
@@ -35,13 +35,13 @@ class Main {
void nestedStatement(Object o, Object o2, int p) {
int m = 0;
switch (o) {
case Integer n && n < 1:
case Integer n when n < 1:
n ++;
case Integer n && n > 1:
case Integer n when n > 1:
switch(o2) {
case Integer <error descr="Variable 'm' is already defined in the scope">m</error> && m > 0:
case Integer <error descr="Variable 'm' is already defined in the scope">m</error> when m > 0:
m += n;
case Integer <error descr="Variable 'p' is already defined in the scope">p</error> && p > 0:
case Integer <error descr="Variable 'p' is already defined in the scope">p</error> when p > 0:
p += n + m;
break;
case Integer p1:

View File

@@ -7,13 +7,13 @@ class Test {
case Object s -> System.out.println(s);
}
switch (o) {
case ((Object s) && s != null) -> System.out.println();
case (Object s) when s != null -> System.out.println();
case default -> System.out.println();
}
}
void insideInstanceOf(Object o) {
if (o instanceof ((String s && s != null))) {
if (o instanceof String s && s != null) {
System.out.println();
}
if (o instanceof String s) {

View File

@@ -8,14 +8,14 @@ final class Sub3 implements I, J {}
class Test {
void test(I i) {
switch (i) {
case Sub1 sub1 && Math.random() > 0.5:
break;
case Sub1 sub1:
case Sub1 sub1 when Math.random() > 0.5:
break;
case Sub2 sub2:
break;
case J j:
break;
case Sub1 sub1:
break;
}
}
}

View File

@@ -4,14 +4,14 @@ final class Sub1 implements I {}
final class Sub2 implements I {}
class Test {
void test(I i) {
switch (i) {
case Sub1 sub1 && Math.random() > 0.5:
break;
case Sub1 sub1:
break;
case Sub2 sub2:
break;
void test(I i) {
switch (i) {
case Sub1 sub1 when Math.random() > 0.5:
break;
case Sub2 sub2:
break;
case Sub1 sub1:
break;
}
}
}
}

View File

@@ -4,14 +4,14 @@ final class Sub1 implements I {}
final class Sub2 implements I {}
class Test {
void test(I i) {
switch (i) {
case Sub1 sub1 && Math.random() > 0.5 -> {}
case Sub1 sub1 && Math.random() > 0.1 -> {}
case Sub1 sub1 && Math.random() > 0.5 -> {}
case Sub1 sub1 -> {
void test(I i) {
switch (i) {
case Sub1 sub1 when Math.random() > 0.5 -> {}
case Sub1 sub1 when Math.random() > 0.1 -> {}
case Sub1 sub1 when Math.random() > 0.5 -> {}
case Sub2 sub2 -> {}
case Sub1 sub1 -> {
}
}
case Sub2 sub2 -> {}
}
}
}

View File

@@ -8,7 +8,7 @@ final class Sub3 implements I, J {}
class Test {
void test(I i) {
switch (i<caret>) {
case Sub1 sub1 && Math.random() > 0.5:
case Sub1 sub1 when Math.random() > 0.5:
break;
case Sub2 sub2:
break;

View File

@@ -4,12 +4,12 @@ final class Sub1 implements I {}
final class Sub2 implements I {}
class Test {
void test(I i) {
switch (i<caret>) {
case Sub1 sub1 && Math.random() > 0.5:
break;
case Sub2 sub2:
break;
void test(I i) {
switch (i<caret>) {
case Sub1 sub1 when Math.random() > 0.5:
break;
case Sub2 sub2:
break;
}
}
}
}

View File

@@ -4,12 +4,12 @@ final class Sub1 implements I {}
final class Sub2 implements I {}
class Test {
void test(I i) {
switch (i<caret>) {
case Sub1 sub1 && Math.random() > 0.5 -> {}
case Sub1 sub1 && Math.random() > 0.1 -> {}
case Sub1 sub1 && Math.random() > 0.5 -> {}
case Sub2 sub2 -> {}
void test(I i) {
switch (i<caret>) {
case Sub1 sub1 when Math.random() > 0.5 -> {}
case Sub1 sub1 when Math.random() > 0.1 -> {}
case Sub1 sub1 when Math.random() > 0.5 -> {}
case Sub2 sub2 -> {}
}
}
}
}

View File

@@ -6,7 +6,7 @@ enum Day {
class Test {
int foo(Day d) {
return switch (d) {
case Day dd && true -> 42;
case Day dd when true -> 42;
};
}
}

View File

@@ -1,4 +1,4 @@
// "Remove switch branch '((Integer ii && true))'" "true-preview"
// "Remove switch branch 'Integer ii when true'" "true-preview"
class Test {
Integer i = 1;
void test() {

View File

@@ -1,4 +1,4 @@
// "Remove switch branch 'Day dd && true'" "true-preview"
// "Remove switch branch 'Day dd when true'" "true-preview"
enum Day {
MONDAY, TUESDAY, WEDNESDAY
}

View File

@@ -6,7 +6,7 @@ enum Day {
class Test {
int foo(Day d) {
return switch (d) {
case Day dd && true -> 42;
case Day dd when true -> 42;
case <caret>default -> 13;
};
}

View File

@@ -1,11 +1,11 @@
// "Remove switch branch '((Integer ii && true))'" "true-preview"
// "Remove switch branch 'Integer ii when true'" "true-preview"
class Test {
Integer i = 1;
void test() {
switch (i) {
case Object o:
break;
case <caret>((Integer ii && true)):
case <caret>Integer ii when true:
break;
}
}

View File

@@ -1,4 +1,4 @@
// "Remove switch branch 'Day dd && true'" "true-preview"
// "Remove switch branch 'Day dd when true'" "true-preview"
enum Day {
MONDAY, TUESDAY, WEDNESDAY
}
@@ -6,7 +6,7 @@ enum Day {
class Test {
int foo(Day d) {
switch (d) {
case <caret>Day dd && true:
case <caret>Day dd when true:
System.out.println(42);
break;
case default:

View File

@@ -17,14 +17,14 @@ class Test {
void testGuardedPattern1(Object o) {
o = "fsd";
if (<warning descr="Condition 'o instanceof ((String s && s.length() <= 3) && (s.length() > 1 || s.length() > 10))' is always 'true'">o instanceof ((String s && <warning descr="Condition 's.length() <= 3' is always 'true'">s.length() <= 3</warning>) && (<warning descr="Condition 's.length() > 1 || s.length() > 10' is always 'true'"><warning descr="Condition 's.length() > 1' is always 'true'">s.length() > 1</warning> || s.length() > 10</warning>))</warning>) {
if (<warning descr="Condition 'o instanceof String s && s.length() <= 3 && (s.length() > 1 || s.length() > 10)' is always 'true'"><warning descr="Condition 'o instanceof String s' is always 'true'">o instanceof String s</warning> && <warning descr="Condition 's.length() <= 3' is always 'true'">s.length() <= 3</warning> && (<warning descr="Condition 's.length() > 1 || s.length() > 10' is always 'true'"><warning descr="Condition 's.length() > 1' is always 'true'">s.length() > 1</warning> || s.length() > 10</warning>)</warning>) {
System.out.println();
}
}
void testGuardedPattern2(Object o) {
o = "fsd";
if (<warning descr="Condition 'o instanceof (String s && s.length() < 3)' is always 'false'">o instanceof (String s && <warning descr="Condition 's.length() < 3' is always 'false'">s.length() < 3</warning>)</warning>) {
if (<warning descr="Condition 'o instanceof String s && s.length() < 3' is always 'false'"><warning descr="Condition 'o instanceof String s' is always 'true'">o instanceof String s</warning> && <warning descr="Condition 's.length() < 3' is always 'false' when reached">s.length() < 3</warning></warning>) {
System.out.println();
}
}
@@ -52,7 +52,7 @@ class Test {
void testInstanceofTotalInForeach(List<Object> list) {
for (Object obj : list) {
if (obj instanceof <error descr="Pattern type 'Object' is the same as expression type">Object</error> st) {
if (<warning descr="Condition 'obj instanceof Object st' is redundant and can be replaced with a null check">obj instanceof Object st</warning>) {
}
}
}

View File

@@ -1,7 +1,7 @@
class Test {
int testIncomplete(Object obj) {
return switch(obj) {
case String s &&<EOLError descr="Expression expected"></EOLError><EOLError descr="':' or '->' expected"></EOLError>
case String s when<EOLError descr="Expression expected"></EOLError><EOLError descr="':' or '->' expected"></EOLError>
};
}
@@ -48,8 +48,8 @@ class Test {
final String FSD = "fsd";
int test3() {
return switch(FSD) {
case <warning descr="Switch label '(String s && s.length() <= 3) && (s.length() > 1 || s.length() > 10)' is the only reachable in the whole switch">(String s && <warning descr="Condition 's.length() <= 3' is always 'true'">s.length() <= 3</warning>) && (<warning descr="Condition 's.length() > 1 || s.length() > 10' is always 'true'"><warning descr="Condition 's.length() > 1' is always 'true'">s.length() > 1</warning> || s.length() > 10</warning>)</warning> -> 1;
case "fsd" -> 2;
case <warning descr="Switch label 'String s when s.length() <= 3 && (s.length() > 1 || s.length() > 10)' is the only reachable in the whole switch">String s when <warning descr="Condition 's.length() <= 3 && (s.length() > 1 || s.length() > 10)' is always 'true'"><warning descr="Condition 's.length() <= 3' is always 'true'">s.length() <= 3</warning> && (<warning descr="Condition 's.length() > 1 || s.length() > 10' is always 'true' when reached"><warning descr="Condition 's.length() > 1' is always 'true' when reached">s.length() > 1</warning> || s.length() > 10</warning>)</warning></warning> -> 1;
case String s when Math.random() > 0.5 -> 2;
case default -> 3;
};
}
@@ -57,16 +57,15 @@ class Test {
int test4(String s) {
s = FSD;
return switch (s) {
case (((String ss) && (<warning descr="Condition 'ss.length() < 3 || ss.length() == 4' is always 'false'"><warning descr="Condition 'ss.length() < 3' is always 'false'">ss.length() < 3</warning> || <warning descr="Condition 'ss.length() == 4' is always 'false' when reached">ss.length() == 4</warning></warning>))) -> 1;
case <warning descr="Switch label '\"fsd\"' is the only reachable in the whole switch">"fsd"</warning> -> 2;
case default -> 3;
case (String ss) when (<warning descr="Condition 'ss.length() < 3 || ss.length() == 4' is always 'false'"><warning descr="Condition 'ss.length() < 3' is always 'false'">ss.length() < 3</warning> || <warning descr="Condition 'ss.length() == 4' is always 'false' when reached">ss.length() == 4</warning></warning>) -> 1;
case <warning descr="Switch label 'String ss' is the only reachable in the whole switch">String ss</warning> -> 2;
};
}
void test5() {
switch (FSD) {
case <warning descr="Switch label 'String s && s.length() > 2 && s.length() < 3' is unreachable">String s && <warning descr="Condition 's.length() > 2 && s.length() < 3' is always 'false'"><warning descr="Condition 's.length() > 2' is always 'true'">s.length() > 2</warning> && <warning descr="Condition 's.length() < 3' is always 'false' when reached">s.length() < 3</warning></warning></warning> -> System.out.println(1);
case <warning descr="Switch label '\"abc\"' is unreachable">"abc"</warning> -> System.out.println(2);
case <warning descr="Switch label 'String s when s.length() > 2 && s.length() < 3' is unreachable">String s when <warning descr="Condition 's.length() > 2 && s.length() < 3' is always 'false'"><warning descr="Condition 's.length() > 2' is always 'true'">s.length() > 2</warning> && <warning descr="Condition 's.length() < 3' is always 'false' when reached">s.length() < 3</warning></warning></warning> -> System.out.println(1);
case <warning descr="Switch label 'String s when s.isEmpty()' is unreachable">String s when <warning descr="Result of 's.isEmpty()' is always 'false'">s.isEmpty()</warning></warning> -> <error descr="Not a statement">2;</error>
case default -> System.out.println(3);
};
}

View File

@@ -1,21 +1,22 @@
import java.util.ArrayList;
import org.jetbrains.annotations.*;
class Test {
void nullableWithUnconditionalPatternLabel(@Nullable Integer i) {
switch (i) {
switch (<warning descr="Unboxing of 'i' may produce 'NullPointerException'">i</warning>) {
case 1:
break;
case (Integer ii && true):
case Integer ii when true:
break;
}
}
void nullableSetNullWithUnconditionalPatternLabel(@Nullable Integer i) {
i = null;
switch (i) {
switch (<warning descr="Unboxing of 'i' may produce 'NullPointerException'">i</warning>) {
case 1:
break;
case <warning descr="Switch label '((Integer ii && true))' is the only reachable in the whole switch">((Integer ii && true))</warning>:
case Integer ii when true:
break;
}
}
@@ -25,7 +26,7 @@ class Test {
switch (i) {
case <warning descr="Switch label '1' is the only reachable in the whole switch">1</warning>:
break;
case Integer ii && true:
case Integer ii when true:
break;
}
}
@@ -34,17 +35,17 @@ class Test {
switch (i) {
case 1:
break;
case Integer ii && true:
case Integer ii when true:
break;
}
}
void unknownSetNullWithUnconditionalPatternLabel(Integer i) {
i = null;
switch (i) {
switch (<warning descr="Unboxing of 'i' may produce 'NullPointerException'">i</warning>) {
case 1:
break;
case <warning descr="Switch label '(Integer ii && true)' is the only reachable in the whole switch">(Integer ii && true)</warning>:
case Integer ii when true:
break;
}
}
@@ -63,19 +64,19 @@ class Test {
switch (i) {
case 1:
break;
case Integer ii && true:
case Integer ii when true:
break;
}
}
void notNullSetNullWithUnconditionalPatternLabel(@NotNull Integer i) {
i = null;
switch (i) {
switch (<warning descr="Unboxing of 'i' may produce 'NullPointerException'">i</warning>) {
case 1:
break;
case Integer ii && false:
case Integer ii when Math.random() > 0.5:
break;
case <warning descr="Switch label '(Integer ii && true)' is the only reachable in the whole switch">(Integer ii && true)</warning>:
case Integer ii when true:
break;
}
}
@@ -94,7 +95,7 @@ class Test {
switch (<warning descr="Unboxing of 'createNullValue()' may produce 'NullPointerException'">createNullValue()</warning>) {
case 1:
break;
case <warning descr="Switch label '((Object o && false))' is unreachable">((Object o && false))</warning>:
case <warning descr="Switch label 'Object o when !new ArrayList<String>().isEmpty()' is unreachable">Object o when <warning descr="Condition '!new ArrayList<String>().isEmpty()' is always 'false'">!new ArrayList<String>().isEmpty()</warning></warning>:
break;
case default:
break;
@@ -102,7 +103,7 @@ class Test {
}
void nullableCallWithUnconditionalPatternLabel() {
switch (createNullValue()) {
switch (<warning descr="Unboxing of 'createNullValue()' may produce 'NullPointerException'">createNullValue()</warning>) {
case 1:
break;
case ((Object o)):
@@ -114,7 +115,7 @@ class Test {
switch (createValue()) {
case 1:
break;
case Integer ii && true:
case Integer ii when true:
break;
}
}
@@ -123,7 +124,7 @@ class Test {
switch (createNotNullValue()) {
case 1, 2:
break;
case Object o && true:
case Object o when true:
break;
}
}
@@ -131,17 +132,17 @@ class Test {
// expressions
int nullableWithUnconditionalPatternLabelExpr(@Nullable Integer i) {
return switch (i) {
return switch (<warning descr="Unboxing of 'i' may produce 'NullPointerException'">i</warning>) {
case 1 -> 1;
case (Integer ii && true) -> 2;
case Integer ii when true -> 2;
};
}
int nullableSetNullWithUnconditionalPatternLabelExpr(@Nullable Integer i) {
i = null;
return switch (i) {
return switch (<warning descr="Unboxing of 'i' may produce 'NullPointerException'">i</warning>) {
case 1 -> 1;
case <warning descr="Switch label '((Integer ii && true))' is the only reachable in the whole switch">((Integer ii && true))</warning> -> 2;
case Integer ii when true -> 2;
};
}
@@ -149,22 +150,22 @@ class Test {
i = 1;
return switch (i) {
case <warning descr="Switch label '1' is the only reachable in the whole switch">1</warning> -> 1;
case Integer ii && true -> 2;
case Integer ii when true -> 2;
};
}
int unknownWithUnconditionalPatternLabelExpr(Integer i) {
return switch (i) {
case 1 -> 1;
case Integer ii && true -> 2;
case Integer ii when true -> 2;
};
}
int unknownSetNullWithUnconditionalPatternLabelExpr(Integer i) {
i = null;
return switch (i) {
return switch (<warning descr="Unboxing of 'i' may produce 'NullPointerException'">i</warning>) {
case 1 -> 1;
case <warning descr="Switch label '(Integer ii && true)' is the only reachable in the whole switch">(Integer ii && true)</warning> -> 2;
case Integer ii when true -> 2;
};
}
@@ -179,16 +180,16 @@ class Test {
int notNullWithUnconditionalPatternLabelExpr(@NotNull Integer i) {
return switch (i) {
case 1 -> 1;
case Integer ii && true -> 2;
case Integer ii when true -> 2;
};
}
int notNullSetNullWithUnconditionalPatternLabelExpr(@NotNull Integer i) {
i = null;
return switch (i) {
return switch (<warning descr="Unboxing of 'i' may produce 'NullPointerException'">i</warning>) {
case 1 -> 1;
case Integer ii && false -> 2;
case <warning descr="Switch label '(Integer ii && true)' is the only reachable in the whole switch">(Integer ii && true)</warning> -> 3;
case Integer ii when Math.random() > 0.5 -> 2;
case Integer ii when true -> 3;
};
}
@@ -203,13 +204,13 @@ class Test {
int nullableCallWithGuardedNotUnconditionalPatternLabelExpr() {
return switch (<warning descr="Unboxing of 'createNullValue()' may produce 'NullPointerException'">createNullValue()</warning>) {
case 1 -> 1;
case <warning descr="Switch label '((Object o && false))' is unreachable">((Object o && false))</warning> -> 2;
case Object o when Math.random() > 0.5 -> 2;
case default -> 3;
};
}
int nullableCallWithUnconditionalPatternLabelExpr() {
return switch (createNullValue()) {
return switch (<warning descr="Unboxing of 'createNullValue()' may produce 'NullPointerException'">createNullValue()</warning>) {
case 1 -> 1;
case ((Object o)) -> 2;
};
@@ -218,14 +219,14 @@ class Test {
int unknownCallWithUnconditionalPatternLabelExpr() {
return switch (createValue()) {
case 1 -> 1;
case Integer ii && true -> 2;
case Integer ii when true -> 2;
};
}
int notNullCallWithUnconditionalPatternLabelExpr() {
return switch (createNotNullValue()) {
case 1, 2 -> 1;
case Object o && true -> 2;
case Object o when true -> 2;
};
}

View File

@@ -18,16 +18,16 @@ public class DuplicateLabels {
break;
case <error descr="Duplicate unconditional pattern">Object oo</error>:
break;
case <error descr="Duplicate unconditional pattern">Object oo && true</error>:
case <error descr="Duplicate unconditional pattern">Object oo when true</error>:
break;
}
}
void testDominatedPatterns(Object o) {
switch (o) {
case String ss && true:
case String ss when true:
break;
case <error descr="Label is dominated by a preceding case label 'String ss && true'">String ss</error>:
case <error descr="Label is dominated by a preceding case label 'String ss when true'">String ss</error>:
break;
case default:
break;

View File

@@ -1,9 +1,9 @@
public class Test {
void testDominatedPatterns(Object o) {
switch (o) {
case String ss && true:
case String ss when true:
break;
case <error descr="Label is dominated by a preceding case label 'String ss && true'">String ss</error>:
case <error descr="Label is dominated by a preceding case label 'String ss when true'">String ss</error>:
break;
case default:
break;
@@ -12,13 +12,13 @@ public class Test {
int testDominatedConstLabel(Integer i, E e) {
switch (e) {
case (E d && d == E.A): return 1;
case <error descr="Label is dominated by a preceding case label '(E d && d == E.A)'">A</error>: return -1;
case E d when d == E.A: return 1;
case <error descr="Label is dominated by a preceding case label 'E d when d == E.A'">A</error>: return -1;
}
return switch (i) {
case (Integer ii && ii > 2) -> 1;
case <error descr="Label is dominated by a preceding case label '(Integer ii && ii > 2)'">2</error> -> 2;
case Integer ii when ii > 2 -> 1;
case <error descr="Label is dominated by a preceding case label 'Integer ii when ii > 2'">2</error> -> 2;
case default -> 3;
};
}

View File

@@ -3,7 +3,7 @@ class C {
switch (o) {
case null -> bar("A");
case String s -> bar("B");
case Number n && n.intValue() == 42 -> bar("A");
case Number n when n.intValue() == 42 -> bar("A");
default -> bar("C");
}
}

View File

@@ -1,7 +1,7 @@
class C {
void foo(Object o) {
switch (o) {
case Number n && n.intValue() == 42 -> bar("A");
case Number n when n.intValue() == 42 -> bar("A");
case String s -> bar("B");
case null -> bar("A");
default -> bar("C");

View File

@@ -14,6 +14,6 @@ public class CreateMissingSealedClassSwitchBranchesFixTest extends LightQuickFix
@Override
protected @NotNull LightProjectDescriptor getProjectDescriptor() {
return LightJavaCodeInsightFixtureTestCase.JAVA_17;
return LightJavaCodeInsightFixtureTestCase.JAVA_20;
}
}

View File

@@ -17,7 +17,7 @@ public class DeleteSwitchLabelFixTest extends LightQuickFixParameterizedTestCase
@NotNull
@Override
protected LightProjectDescriptor getProjectDescriptor() {
return LightJavaCodeInsightFixtureTestCase.JAVA_17;
return LightJavaCodeInsightFixtureTestCase.JAVA_19;
}
@Override

View File

@@ -10,7 +10,7 @@ public class MakeVarEffectivelyFinalFixTest extends LightQuickFixParameterizedTe
@NotNull
@Override
protected LightProjectDescriptor getProjectDescriptor() {
return LightJavaCodeInsightFixtureTestCase.JAVA_17;
return LightJavaCodeInsightFixtureTestCase.JAVA_20;
}
@Override

View File

@@ -10,7 +10,7 @@ public class MoveSwitchBranchUpFixTest extends LightQuickFixParameterizedTestCas
@NotNull
@Override
protected LightProjectDescriptor getProjectDescriptor() {
return LightJavaCodeInsightFixtureTestCase.JAVA_17;
return LightJavaCodeInsightFixtureTestCase.JAVA_20;
}
@Override

View File

@@ -14,7 +14,7 @@ public class ReplacePrimitiveWithBoxedTypeTest extends LightQuickFixParameterize
@Override
protected @NotNull LightProjectDescriptor getProjectDescriptor() {
return LightJavaCodeInsightFixtureTestCase.JAVA_17;
return LightJavaCodeInsightFixtureTestCase.JAVA_20;
}
}

View File

@@ -18,7 +18,7 @@ public class ReplaceWithConstantValueFixTest extends LightQuickFixParameterizedT
@NotNull
@Override
protected LightProjectDescriptor getProjectDescriptor() {
return LightJavaCodeInsightFixtureTestCase.JAVA_17;
return LightJavaCodeInsightFixtureTestCase.JAVA_20;
}
@Override

View File

@@ -16,6 +16,6 @@ public class ReplaceWithTypePatternFixTest extends LightQuickFixParameterizedTes
@Override
protected @NotNull LightProjectDescriptor getProjectDescriptor() {
return LightJavaCodeInsightFixtureTestCase.JAVA_17;
return LightJavaCodeInsightFixtureTestCase.JAVA_20;
}
}

View File

@@ -10,7 +10,7 @@ public class NormalSwitchCompletionTest extends NormalCompletionTestCase {
@NotNull
@Override
protected LightProjectDescriptor getProjectDescriptor() {
return JAVA_17;
return JAVA_20;
}
public void testDefaultInRuleSwitch() { doTest(); }

View File

@@ -23,7 +23,7 @@ public class NormalSwitchCompletionVariantsTest extends LightFixtureCompletionTe
@NotNull
@Override
protected LightProjectDescriptor getProjectDescriptor() {
return JAVA_17;
return JAVA_20;
}
public void testCompletionPrimitiveTypeExpr() { doTest(COMMON_VARIANTS); }

View File

@@ -16,7 +16,7 @@ public class JavacQuirksInspectionTest extends LightJavaCodeInsightFixtureTestCa
@Override
protected @NotNull LightProjectDescriptor getProjectDescriptor() {
return JAVA_17;
return JAVA_20;
}
@Override

View File

@@ -3,7 +3,6 @@ package com.intellij.java.codeInsight.daemon;
import com.intellij.JavaTestUtil;
import com.intellij.codeInsight.daemon.impl.IdentifierHighlighterPass;
import com.intellij.codeInsight.intention.IntentionAction;
import com.intellij.codeInspection.deadCode.UnusedDeclarationInspection;
import com.intellij.pom.java.LanguageLevel;
import com.intellij.psi.PsiElement;
@@ -22,7 +21,7 @@ public class LightPatternsForSwitchHighlightingTest extends LightJavaCodeInsight
@NotNull
@Override
protected LightProjectDescriptor getProjectDescriptor() {
return JAVA_17;
return JAVA_19;
}
public void testPatternsInSwitchIn16Java() {
@@ -34,7 +33,7 @@ public class LightPatternsForSwitchHighlightingTest extends LightJavaCodeInsight
}
public void testPatternsInSwitchIn19Java() {
IdeaTestUtil.withLevel(getModule(), LanguageLevel.JDK_19_PREVIEW, this::doTest);
doTest();
}
public void testPatternsInSwitchIn20Java() {
@@ -42,11 +41,11 @@ public class LightPatternsForSwitchHighlightingTest extends LightJavaCodeInsight
}
public void testMismatchedDeconstructionIn19Java() {
IdeaTestUtil.withLevel(getModule(), LanguageLevel.JDK_19_PREVIEW, this::doTest);
doTest();
}
public void testIllegalFallthroughIn19Java() {
IdeaTestUtil.withLevel(getModule(), LanguageLevel.JDK_19_PREVIEW, this::doTest);
doTest();
}
public void testIllegalFallthroughIn20Java() {
@@ -54,11 +53,11 @@ public class LightPatternsForSwitchHighlightingTest extends LightJavaCodeInsight
}
public void testUnconditionalDestructuringAndDefaultIn19Java() {
IdeaTestUtil.withLevel(getModule(), LanguageLevel.JDK_19_PREVIEW, this::doTest);
doTest();
}
public void testSwitchExhaustivenessIn19Java() {
IdeaTestUtil.withLevel(getModule(), LanguageLevel.JDK_19_PREVIEW, this::doTest);
doTest();
}
public void testSwitchExhaustivenessIn20Java() {
@@ -66,25 +65,19 @@ public class LightPatternsForSwitchHighlightingTest extends LightJavaCodeInsight
}
public void testSwitchExhaustivenessWithSealedIntersection(){
IdeaTestUtil.withLevel(getModule(), LanguageLevel.JDK_19_PREVIEW, this::doTest);
doTest();
}
public void testSwitchExhaustivenessWithGenericsIn19Java() {
IdeaTestUtil.withLevel(getModule(), LanguageLevel.JDK_19_PREVIEW, this::doTest);
doTest();
}
public void testSwitchDominanceIn19Java() {
IdeaTestUtil.withLevel(getModule(), LanguageLevel.JDK_19_PREVIEW, this::doTest);
}
public void testPatternMatchingInSwitch() {
doTest();
IntentionAction action = myFixture.getAvailableIntention("Remove 'default' branch");
assertNotNull(action);
}
public void testPatternMatchingInSwitchJava18() {
IdeaTestUtil.withLevel(getModule(), LanguageLevel.JDK_18_PREVIEW, this::doTest);
public void testPatternMatchingInSwitchJava19() {
IdeaTestUtil.withLevel(getModule(), LanguageLevel.JDK_19_PREVIEW, this::doTest);
}
public void testPatternMatchingWithGuard() {
@@ -108,7 +101,7 @@ public class LightPatternsForSwitchHighlightingTest extends LightJavaCodeInsight
}
public void testEffectivelyFinalWhen() {
IdeaTestUtil.withLevel(getModule(), LanguageLevel.JDK_19_PREVIEW, this::doTest);
doTest();
}
public void testSameVariableNameInPatternMatchingInSwitch() {
@@ -119,12 +112,8 @@ public class LightPatternsForSwitchHighlightingTest extends LightJavaCodeInsight
doTest();
}
public void testGuardedPatterns() {
doTest();
}
public void testWhenExpressions() {
IdeaTestUtil.withLevel(getModule(), LanguageLevel.JDK_19_PREVIEW, this::doTest);
doTest();
}
public void testSwitchExprHasResult() {
@@ -178,15 +167,15 @@ public class LightPatternsForSwitchHighlightingTest extends LightJavaCodeInsight
}
public void testRecordPatternsAndWhenGuardsInJava18() {
IdeaTestUtil.withLevel(getModule(), LanguageLevel.JDK_18_PREVIEW, this::doTest);
IdeaTestUtil.withLevel(getModule(), LanguageLevel.JDK_18, this::doTest);
}
public void testRecordPatternsAndWhenGuardsInJava19() {
IdeaTestUtil.withLevel(getModule(), LanguageLevel.JDK_19_PREVIEW, this::doTest);
doTest();
}
public void testWhenExpressionIsFalse() {
IdeaTestUtil.withLevel(getModule(), LanguageLevel.JDK_19_PREVIEW, this::doTest);
doTest();
}
private void doTest() {

View File

@@ -18,7 +18,7 @@ public class LightPatternsHighlightingTest extends LightJavaCodeInsightFixtureTe
@NotNull
@Override
protected LightProjectDescriptor getProjectDescriptor() {
return JAVA_17;
return JAVA_19;
}
public void testInstanceOfBasics() {
@@ -51,7 +51,7 @@ public class LightPatternsHighlightingTest extends LightJavaCodeInsightFixtureTe
}
public void testDeconstructionInstanceOf() {
IdeaTestUtil.withLevel(getModule(), LanguageLevel.JDK_19_PREVIEW, this::doTest);
doTest();
}
public void testInstanceOfNonReified() {
@@ -62,16 +62,12 @@ public class LightPatternsHighlightingTest extends LightJavaCodeInsightFixtureTe
doTest();
}
public void testInstanceOfSubtypeJava19() {
IdeaTestUtil.withLevel(getModule(), LanguageLevel.JDK_19_PREVIEW, this::doTest);
}
public void testInstanceOfPatternMatching() {
doTest();
}
public void testRecordPatternsInForEachJava19() {
IdeaTestUtil.withLevel(getModule(), LanguageLevel.JDK_19_PREVIEW, this::doTest);
doTest();
}
public void testRecordPatternsInForEachJava20() {

View File

@@ -29,7 +29,7 @@ public final class PreviewFeatureWarningsTest extends LightJavaCodeInsightFixtur
@Override
protected @NotNull LightProjectDescriptor getProjectDescriptor() {
return new ProjectDescriptor(LanguageLevel.JDK_17_PREVIEW);
return new ProjectDescriptor(LanguageLevel.JDK_19_PREVIEW);
}
private void doTest() {

View File

@@ -16,6 +16,6 @@ public class SplitSwitchBranchWithSeveralCaseValuesTest extends LightQuickFixPar
@Override
protected @NotNull LightProjectDescriptor getProjectDescriptor() {
return LightJavaCodeInsightFixtureTestCase.JAVA_19;
return LightJavaCodeInsightFixtureTestCase.JAVA_20;
}
}

View File

@@ -11,7 +11,7 @@ import org.jetbrains.annotations.NotNull;
import java.io.File;
import static com.intellij.testFramework.fixtures.LightJavaCodeInsightFixtureTestCase.JAVA_18;
import static com.intellij.testFramework.fixtures.LightJavaCodeInsightFixtureTestCase.JAVA_20;
public class JavadocCompletionInSnippetTest extends BasePlatformTestCase implements TestIndexingModeSupporter {
private @NotNull IndexingMode myIndexingMode = IndexingMode.SMART;
@@ -36,7 +36,7 @@ public class JavadocCompletionInSnippetTest extends BasePlatformTestCase impleme
@NotNull
@Override
protected LightProjectDescriptor getProjectDescriptor() {
return JAVA_18;
return JAVA_20;
}
@Override

View File

@@ -17,7 +17,7 @@ import org.jetbrains.annotations.NotNull;
import java.io.File;
import java.util.concurrent.atomic.AtomicReference;
import static com.intellij.testFramework.fixtures.LightJavaCodeInsightFixtureTestCase.JAVA_18;
import static com.intellij.testFramework.fixtures.LightJavaCodeInsightFixtureTestCase.JAVA_20;
public class JavadocSnippetInjectionFileTest extends LightQuickFixParameterizedTestCase {
@@ -57,6 +57,6 @@ public class JavadocSnippetInjectionFileTest extends LightQuickFixParameterizedT
@NotNull
@Override
protected LightProjectDescriptor getProjectDescriptor() {
return JAVA_18;
return JAVA_20;
}
}

View File

@@ -15,7 +15,7 @@ import org.jetbrains.annotations.NotNull;
import java.util.concurrent.atomic.AtomicReference;
import static com.intellij.testFramework.assertions.Assertions.assertThat;
import static com.intellij.testFramework.fixtures.LightJavaCodeInsightFixtureTestCase.JAVA_18;
import static com.intellij.testFramework.fixtures.LightJavaCodeInsightFixtureTestCase.JAVA_20;
public class JavadocSnippetInjectionTest extends LightQuickFixParameterizedTestCase {
@@ -55,6 +55,6 @@ public class JavadocSnippetInjectionTest extends LightQuickFixParameterizedTestC
@NotNull
@Override
protected LightProjectDescriptor getProjectDescriptor() {
return JAVA_18;
return JAVA_20;
}
}

View File

@@ -26,7 +26,7 @@ public class CapturingCleaner18InspectionTest extends LightJavaCodeInsightFixtur
@NotNull
@Override
protected LightProjectDescriptor getProjectDescriptor() {
return JAVA_18;
return JAVA_20;
}
@NotNull

View File

@@ -1,23 +0,0 @@
// Copyright 2000-2021 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file.
package com.intellij.java.codeInspection;
import com.intellij.JavaTestUtil;
import com.intellij.testFramework.LightProjectDescriptor;
import org.jetbrains.annotations.NotNull;
public class DataFlowInspection18Test extends DataFlowInspectionTestCase {
@NotNull
@Override
protected LightProjectDescriptor getProjectDescriptor() {
return JAVA_18;
}
@Override
protected String getTestDataPath() {
return JavaTestUtil.getJavaTestDataPath() + "/inspection/dataFlow/fixture/";
}
public void testSuspiciousLabelElementsJava18() {
doTest();
}
}

View File

@@ -5,11 +5,11 @@ import com.intellij.JavaTestUtil;
import com.intellij.testFramework.LightProjectDescriptor;
import org.jetbrains.annotations.NotNull;
public class DataFlowInspection17Test extends DataFlowInspectionTestCase {
public class DataFlowInspection19Test extends DataFlowInspectionTestCase {
@NotNull
@Override
protected LightProjectDescriptor getProjectDescriptor() {
return JAVA_17;
return JAVA_19;
}
@Override
@@ -17,6 +17,10 @@ public class DataFlowInspection17Test extends DataFlowInspectionTestCase {
return JavaTestUtil.getJavaTestDataPath() + "/inspection/dataFlow/fixture/";
}
public void testSuspiciousLabelElementsJava19() {
doTest();
}
public void testParameterNullabilityFromSwitch() {
doTest();
}

View File

@@ -18,8 +18,7 @@ import org.junit.platform.suite.api.Suite;
DataFlowInspection9Test.class,
DataFlowInspection10Test.class,
DataFlowInspection16Test.class,
DataFlowInspection17Test.class,
DataFlowInspection18Test.class,
DataFlowInspection19Test.class,
DataFlowInspection20Test.class,
DataFlowInspectionHeavyTest.class,
DataFlowInspectionAncientTest.class,

View File

@@ -27,16 +27,16 @@ class DuplicateBranchesInEnhancedSwitchTest : LightJavaCodeInsightFixtureTestCas
fun testEmptyBodiesCannotBeMerge() = doTest()
fun testGuardedPatternMergeWithNull() = doTest()
fun testNullMergeWithGuardedPattern() = doTest()
fun testRecordPattern1() = IdeaTestUtil.withLevel(module, LanguageLevel.JDK_19_PREVIEW) { doTest() }
fun testRecordPattern2() = IdeaTestUtil.withLevel(module, LanguageLevel.JDK_19_PREVIEW) { doTest() }
fun testRecordPattern3() = IdeaTestUtil.withLevel(module, LanguageLevel.JDK_19_PREVIEW) { doTest() }
fun testRecordPattern1() = doTest()
fun testRecordPattern2() = doTest()
fun testRecordPattern3() = doTest()
fun testTwoPatterns() = doTest()
fun testWhenClause1() = IdeaTestUtil.withLevel(module, LanguageLevel.JDK_19_PREVIEW) { doTest() }
fun testWhenClause2() = IdeaTestUtil.withLevel(module, LanguageLevel.JDK_19_PREVIEW) { doTest() }
fun testWhenClause1() = doTest()
fun testWhenClause2() = doTest()
fun testExpressionsWithComments() = doTest()
fun testNullDuplicatesPattern() = IdeaTestUtil.withLevel(module, LanguageLevel.JDK_20_PREVIEW) { doTest() }
fun testPatternDuplicatesNull() = IdeaTestUtil.withLevel(module, LanguageLevel.JDK_20_PREVIEW) { doTest() }
fun testNullDuplicatesDefault() = IdeaTestUtil.withLevel(module, LanguageLevel.JDK_19_PREVIEW) { doTest() }
fun testNullDuplicatesDefault() = doTest()
private fun doTest() {
myFixture.enableInspections(DuplicateBranchesInSwitchInspection())
@@ -44,6 +44,6 @@ class DuplicateBranchesInEnhancedSwitchTest : LightJavaCodeInsightFixtureTestCas
}
override fun getProjectDescriptor(): LightProjectDescriptor {
return JAVA_17
return JAVA_19
}
}

View File

@@ -7,7 +7,7 @@ import com.intellij.codeInspection.LocalInspectionTool;
import com.intellij.testFramework.LightProjectDescriptor;
import org.jetbrains.annotations.NotNull;
import static com.intellij.testFramework.fixtures.LightJavaCodeInsightFixtureTestCase.JAVA_17;
import static com.intellij.testFramework.fixtures.LightJavaCodeInsightFixtureTestCase.JAVA_19;
public class EnhancedSwitchMigrationInspectionTest extends LightQuickFixParameterizedTestCase {
@Override
@@ -24,6 +24,6 @@ public class EnhancedSwitchMigrationInspectionTest extends LightQuickFixParamete
@Override
protected @NotNull LightProjectDescriptor getProjectDescriptor() {
return JAVA_17;
return JAVA_19;
}
}

View File

@@ -25,7 +25,7 @@ import org.jetbrains.annotations.NotNull;
public class PatternVariablesCanBeReplacedWithCastInspectionNotPreserveTest extends LightQuickFixParameterizedTestCase {
@Override
protected @NotNull LightProjectDescriptor getProjectDescriptor() {
return LightJavaCodeInsightFixtureTestCase.JAVA_17;
return LightJavaCodeInsightFixtureTestCase.JAVA_20;
}
@Override

View File

@@ -25,7 +25,7 @@ import org.jetbrains.annotations.NotNull;
public class PatternVariablesCanBeReplacedWithCastInspectionTest extends LightQuickFixParameterizedTestCase {
@Override
protected @NotNull LightProjectDescriptor getProjectDescriptor() {
return LightJavaCodeInsightFixtureTestCase.JAVA_17;
return LightJavaCodeInsightFixtureTestCase.JAVA_20;
}
@Override

View File

@@ -10,7 +10,7 @@ import org.jetbrains.annotations.NotNull;
public class RedundantLengthCheckInspectionTest extends LightJavaCodeInsightFixtureTestCase {
@Override
protected @NotNull LightProjectDescriptor getProjectDescriptor() {
return JAVA_17;
return JAVA_20;
}
@Override

View File

@@ -113,7 +113,7 @@ public class JavaParametersTest extends ModuleRootManagerTestCase {
public void testPreviewLanguageFeatures() throws CantRunException {
ModuleRootModificationUtil.updateModel(myModule, (model) -> {
model.getModuleExtension(LanguageLevelModuleExtension.class)
.setLanguageLevel(LanguageLevel.JDK_18_PREVIEW);
.setLanguageLevel(LanguageLevel.JDK_19_PREVIEW);
Sdk mockJdk = IdeaTestUtil.getMockJdk(JavaVersion.compose(14));
WriteAction.runAndWait(() -> ProjectJdkTable.getInstance().addJdk(mockJdk, myProject));
model.setSdk(mockJdk);

View File

@@ -31,7 +31,7 @@ public class JavaFeatureSpecificSanityTest extends LightJavaCodeInsightFixtureTe
@NotNull
@Override
protected LightProjectDescriptor getProjectDescriptor() {
return JAVA_17;
return JAVA_20;
}
@Override

View File

@@ -53,6 +53,6 @@ public class FindUsagesTargetTest extends LightJavaCodeInsightFixtureTestCase {
@Override
protected @NotNull LightProjectDescriptor getProjectDescriptor() {
return JAVA_17;
return JAVA_20;
}
}

View File

@@ -77,8 +77,8 @@ public abstract class LightJavaCodeInsightFixtureTestCase extends UsefulTestCase
public static final @NotNull LightProjectDescriptor JAVA_14 = new ProjectDescriptor(LanguageLevel.JDK_14);
public static final @NotNull LightProjectDescriptor JAVA_15 = new ProjectDescriptor(LanguageLevel.JDK_15);
public static final @NotNull LightProjectDescriptor JAVA_16 = new ProjectDescriptor(LanguageLevel.JDK_16);
public static final @NotNull LightProjectDescriptor JAVA_17 = new ProjectDescriptor(LanguageLevel.JDK_17_PREVIEW);
public static final @NotNull LightProjectDescriptor JAVA_18 = new ProjectDescriptor(LanguageLevel.JDK_18_PREVIEW);
public static final @NotNull LightProjectDescriptor JAVA_17 = new ProjectDescriptor(LanguageLevel.JDK_17);
public static final @NotNull LightProjectDescriptor JAVA_18 = new ProjectDescriptor(LanguageLevel.JDK_18);
public static final @NotNull LightProjectDescriptor JAVA_19 = new ProjectDescriptor(LanguageLevel.JDK_19_PREVIEW);
public static final @NotNull LightProjectDescriptor JAVA_20 = new ProjectDescriptor(LanguageLevel.JDK_20_PREVIEW);
public static final @NotNull LightProjectDescriptor JAVA_X = new ProjectDescriptor(LanguageLevel.JDK_X);

View File

@@ -22,8 +22,8 @@ public enum LanguageLevel {
JDK_14(14),
JDK_15(15),
JDK_16(16),
JDK_17(17), JDK_17_PREVIEW(17),
JDK_18(18), JDK_18_PREVIEW(18),
JDK_17(17),
JDK_18(18),
JDK_19(19), JDK_19_PREVIEW(19),
JDK_20(20), JDK_20_PREVIEW(20),
JDK_X(21);

View File

@@ -6,7 +6,7 @@ public class Test {
int test(Object obj, int x) {
<caret>return switch (obj) {
case Integer y -> y.byteValue();
case String s && x > 0 -> s.length();
case String s when x > 0 -> s.length();
case Boolean c -> (Boolean) c ? 42 : 0;
case Character c -> ((BigDecimal) obj).hashCode();
case null, default -> -1;

View File

@@ -9,7 +9,7 @@ public class Test {
Integer z = y;
return y.byteValue();
}
case String r && x > 0 -> {
case String r when x > 0 -> {
return ((String) obj).length();
}
case Character c -> {

View File

@@ -3,9 +3,9 @@ import org.jetbrains.annotations.NotNull;
class Test {
void test(@NotNull Object o, int variable) {
<caret>switch (o) {
case String s && !s.isEmpty() -> System.out.println();
case Integer x && x > 0 && x < 10 -> System.out.println();
case Float v && variable > 0 -> {
case String s when !s.isEmpty() -> System.out.println();
case Integer x when x > 0 && x < 10 -> System.out.println();
case Float v when variable > 0 -> {
}
default -> {
}

View File

@@ -3,9 +3,9 @@ import org.jetbrains.annotations.NotNull;
class Test {
void test(@NotNull Object o, int variable) {
<caret>switch (o) {
case String s && !s.isEmpty() -> System.out.println();
case Integer x && x > 0 && x < 10 -> System.out.println();
case Float v && variable > 0 -> {
case String s when !s.isEmpty() -> System.out.println();
case Integer x when x > 0 && x < 10 -> System.out.println();
case Float v when variable > 0 -> {
}
default -> {
}

View File

@@ -3,7 +3,7 @@ import org.jetbrains.annotations.Nullable;
class Test {
void test(@Nullable Object o) {
String r = switch (o) {
case String s && s.length() > 3 -> s.substring(0, 3);
case String s when s.length() > 3 -> s.substring(0, 3);
case Integer i -> "integer";
case null, default -> "default";
};

View File

@@ -41,7 +41,7 @@ class InstanceofInterfaces {
void testRecord(XYZ xyz) {
if (xyz instanceof X x) {}
if (xyz instanceof <warning descr="Pattern test against a concrete class 'Y'">Y</warning> y) {}
if (xyz instanceof (<warning descr="Pattern test against a concrete class 'Y'">Y</warning> y && y != null)) {}
if (xyz instanceof <warning descr="Pattern test against a concrete class 'Y'">Y</warning> y && y != null) {}
}
void testSwitch(XYZ xyz) {

View File

@@ -107,7 +107,7 @@ public class SwitchStatementsWithoutDefault
void testPatterns(X x, Foo foo, String s) {
switch (<error descr="'switch' statement does not cover all possible input values">x</error>) {
case X xx && false:
case X xx when Math.random() > 0.5:
break;
}
@@ -134,7 +134,7 @@ public class SwitchStatementsWithoutDefault
}
switch (s) {
case (String ss && true):
case String ss when true:
break;
}
}

View File

@@ -107,7 +107,7 @@ public class SwitchStatementsWithoutDefault
void testPatterns(X x, Foo foo, String s) {
switch (<error descr="'switch' statement does not cover all possible input values">x</error>) {
case X xx && false:
case X xx when Math.random() > 0.5:
break;
}
@@ -134,7 +134,7 @@ public class SwitchStatementsWithoutDefault
}
switch (s) {
case (String ss && true):
case String ss when true:
break;
}
}

View File

@@ -169,7 +169,7 @@ public class UnnecessaryDefault{
void defaultLabelElementInEnum2(MyEnum e) {
switch (e) {
case MyEnum ee && ee != null:
case MyEnum ee when ee != null:
break;
default:
break;
@@ -191,7 +191,7 @@ public class UnnecessaryDefault{
switch (i) {
case C1 c1:
break;
case C2 c2 && c2 != null:
case C2 c2 when c2 != null:
break;
default:
break;

View File

@@ -1,24 +0,0 @@
class Main {
void foo1(Object obj) {
switch (obj) {
case ((((((String s)))))) && (((((s.isEmpty()))))) -> System.out.println(s);
case default -> System.out.println(42);
}
if (obj instanceof ((((((String s)))))) && (((((s.isEmpty())))))) {
System.out.println(s);
}
}
}
class Foo extends Main {
@Override
void <warning descr="Method 'foo1()' is identical to its super method">foo1</warning>(Object o) {
switch (o) {
case String str && str.isEmpty() -> System.out.println(str);
default -> System.out.println(42);
}
if (o instanceof String str && str.isEmpty()) {
System.out.println(str);
}
}
}

View File

@@ -28,7 +28,7 @@ public class UseOfConcreteClassInspectionTest extends LightJavaInspectionTestCas
@Override
protected @NotNull LightProjectDescriptor getProjectDescriptor() {
return JAVA_17;
return JAVA_20;
}
@Override

View File

@@ -15,7 +15,7 @@ public class InfiniteRecursionInspectionTest extends LightJavaCodeInsightFixture
@NotNull
@Override
protected LightProjectDescriptor getProjectDescriptor() {
return JAVA_17;
return JAVA_20;
}
private void doTest() {

View File

@@ -54,7 +54,7 @@ public class InterfaceMayBeAnnotatedFunctionalInspectionTest extends LightJavaIn
@NotNull
@Override
protected LightProjectDescriptor getProjectDescriptor() {
return JAVA_17;
return JAVA_20;
}
public void testAnnotationType() {

View File

@@ -20,6 +20,6 @@ public class DefaultNotLastCaseInSwitchInspectionTest extends LightJavaInspectio
@Override
protected @NotNull LightProjectDescriptor getProjectDescriptor() {
return JAVA_17;
return JAVA_19;
}
}

View File

@@ -22,6 +22,6 @@ public class SwitchStatementWithTooFewBranchesInspectionTest extends LightJavaIn
@Override
protected @NotNull LightProjectDescriptor getProjectDescriptor() {
return JAVA_17;
return JAVA_20;
}
}

View File

@@ -34,6 +34,6 @@ public class SwitchStatementsWithPatternsInspectionTest extends LightJavaInspect
@Override
protected @NotNull LightProjectDescriptor getProjectDescriptor() {
return JAVA_17;
return JAVA_20;
}
}

View File

@@ -2,8 +2,6 @@
package com.siyeh.ig.controlflow;
import com.intellij.codeInspection.InspectionProfileEntry;
import com.intellij.pom.java.LanguageLevel;
import com.intellij.testFramework.IdeaTestUtil;
import com.intellij.testFramework.LightProjectDescriptor;
import com.siyeh.ig.LightJavaInspectionTestCase;
import org.jetbrains.annotations.NotNull;
@@ -133,7 +131,7 @@ public class UnnecessaryDefaultInspectionTest extends LightJavaInspectionTestCas
doTest("class X {" +
" void x(I i) {" +
" switch (i) {" +
" case (I ii && false):" +
" case I ii when Math.random() > 0.5:" +
" break;" +
" case C1 c1:" +
" break;" +
@@ -148,7 +146,7 @@ public class UnnecessaryDefaultInspectionTest extends LightJavaInspectionTestCas
"class X {" +
" void x(I i) {" +
" switch (i) {" +
" case (I ii && false):" +
" case I ii when Math.random() > 0.5:" +
" break;" +
" case C1 c1:" +
" break;" +
@@ -163,7 +161,7 @@ public class UnnecessaryDefaultInspectionTest extends LightJavaInspectionTestCas
doTest("class X {" +
" void x(I i) {" +
" switch (i) {" +
" case /*'default' branch is unnecessary*/default/*_*//**/, <error descr=\"Illegal fall-through to a pattern\">(I ii && false)</error>:" +
" case /*'default' branch is unnecessary*/default/*_*//**/, <error descr=\"Illegal fall-through to a pattern\">I ii when Math.random() > 0.5</error>:" +
" break;" +
" case C1 c1:" +
" break;" +
@@ -176,7 +174,7 @@ public class UnnecessaryDefaultInspectionTest extends LightJavaInspectionTestCas
"class X {" +
" void x(I i) {" +
" switch (i) {" +
" case (I ii && false):" +
" case I ii when Math.random() > 0.5:" +
" break;" +
" case C1 c1:" +
" break;" +
@@ -192,33 +190,12 @@ public class UnnecessaryDefaultInspectionTest extends LightJavaInspectionTestCas
" void x(J<Integer> j) {" +
" switch (j) {" +
" case D2 d2 -> {}" +
" case default -> {}" +
" case /*'default' branch is unnecessary*/default/*_*//**/ -> {}" +
" }" +
" }" +
"}");
}
public void testDefaultInParameterizedSealedHierarchyJava18() {
IdeaTestUtil.withLevel(getModule(), LanguageLevel.JDK_18_PREVIEW, () -> {
doTest("class X {" +
" void x(J<Integer> j) {" +
" switch (j) {" +
" case D2 d2 -> {}" +
" case /*'default' branch is unnecessary*/default/*_*//**/ -> {}" +
" }" +
" }" +
"}");
checkQuickFix("Remove 'default' branch",
"class X {" +
" void x(J<Integer> j) {" +
" switch (j) {" +
" case D2 d2 -> {}\n" +
"}" +
" }" +
"}");
});
}
@Override
protected String[] getEnvironmentClasses() {
return new String[] {
@@ -227,7 +204,7 @@ enum E { A, B }
sealed interface I {}
final class C1 implements I {}
final class C2 implements I {}
sealed interface J<T>
sealed interface J<T> {}
final class D1 implements J<String> {}
final class D2<T> implements J<T> {}
"""
@@ -244,6 +221,6 @@ final class D2<T> implements J<T> {}
@Override
protected @NotNull LightProjectDescriptor getProjectDescriptor() {
return JAVA_17;
return JAVA_19;
}
}

View File

@@ -15,7 +15,7 @@ public class ExceptionFromCatchWhichDoesntWrapInspectionTest extends LightJavaCo
@NotNull
@Override
protected LightProjectDescriptor getProjectDescriptor() {
return JAVA_17;
return JAVA_20;
}
private void doTest() {

View File

@@ -29,6 +29,6 @@ public class CreateMissingEnumSwitchBranchesFixTest extends LightQuickFixParamet
@Override
protected @NotNull LightProjectDescriptor getProjectDescriptor() {
return LightJavaCodeInsightFixtureTestCase.JAVA_17;
return LightJavaCodeInsightFixtureTestCase.JAVA_20;
}
}

View File

@@ -4,14 +4,10 @@ package com.siyeh.ig.fixes.controlflow;
import com.intellij.codeInsight.daemon.quickFix.LightQuickFixParameterizedTestCase;
import com.intellij.codeInspection.LocalInspectionTool;
import com.intellij.openapi.application.ex.PathManagerEx;
import com.intellij.testFramework.LightProjectDescriptor;
import com.siyeh.ig.LightJavaInspectionTestCase;
import com.siyeh.ig.controlflow.SwitchExpressionCanBePushedDownInspection;
import com.siyeh.ig.controlflow.SwitchStatementsWithoutDefaultInspection;
import org.jetbrains.annotations.NotNull;
import static com.intellij.testFramework.fixtures.LightJavaCodeInsightFixtureTestCase.JAVA_17;
public class SwitchExpressionCanBePushedDownInspectionTest extends LightQuickFixParameterizedTestCase {
@Override
protected LocalInspectionTool @NotNull [] configureLocalInspectionTools() {

View File

@@ -23,7 +23,7 @@ public class IfCanBePatternSwitchFixTest extends IGQuickFixesTestCase {
@Override
protected void tuneFixture(JavaModuleFixtureBuilder builder) throws Exception {
super.tuneFixture(builder);
builder.setLanguageLevel(LanguageLevel.JDK_17_PREVIEW);
builder.setLanguageLevel(LanguageLevel.JDK_19_PREVIEW);
builder.addJdk(IdeaTestUtil.getMockJdk18Path().getPath());
}
@@ -33,8 +33,9 @@ public class IfCanBePatternSwitchFixTest extends IGQuickFixesTestCase {
public void testPatternExplicitNullCheck2(){ doTest(); }
public void testPatternDefault() { doTest(); }
public void testPatternKeepVariable() { doTest(); }
public void testGuardedPattern() { doTest(); }
public void testGuardedPatternCustomOrder() { doTest(); }
public void testPatternGuard1() { doTest(); }
public void testPatternGuard2() { doTest(); }
public void testPatternGuardCustomOrder() { doTest(); }
public void testPatternToVariable() { doTest(); }
public void testPatternToSwitchExpression() { doTest(); }
public void testUnconditionalPattern(){ doTest(); }
@@ -43,7 +44,4 @@ public class IfCanBePatternSwitchFixTest extends IGQuickFixesTestCase {
public void testMultipleCastedVariables() { doTest(); }
public void testMutableCastedVariable() { doTest(); }
public void testLeakScope() { assertQuickfixNotAvailable(); }
public void testPatternGuard() {
IdeaTestUtil.withLevel(myFixture.getModule(), LanguageLevel.JDK_19_PREVIEW, () -> doTest());
}
}

View File

@@ -2,17 +2,12 @@
package com.siyeh.ig.fixes.style;
import com.intellij.codeInsight.daemon.quickFix.LightQuickFixParameterizedTestCase;
import com.intellij.codeInsight.intention.IntentionAction;
import com.intellij.codeInspection.LocalInspectionTool;
import com.intellij.testFramework.LightProjectDescriptor;
import com.intellij.testFramework.fixtures.JavaCodeInsightFixtureTestCase;
import com.siyeh.ig.BaseInspection;
import com.siyeh.ig.IGQuickFixesTestCase;
import com.siyeh.ig.style.EscapedSpaceInspection;
import com.siyeh.ig.style.LiteralAsArgToStringEqualsInspection;
import org.jetbrains.annotations.NotNull;
import static com.intellij.testFramework.fixtures.LightJavaCodeInsightFixtureTestCase.JAVA_17;
import static com.intellij.testFramework.fixtures.LightJavaCodeInsightFixtureTestCase.JAVA_20;
public class EscapedSpaceInspectionTest extends LightQuickFixParameterizedTestCase {
@Override
@@ -22,7 +17,7 @@ public class EscapedSpaceInspectionTest extends LightQuickFixParameterizedTestCa
@Override
protected @NotNull LightProjectDescriptor getProjectDescriptor() {
return JAVA_17;
return JAVA_20;
}
@Override

View File

@@ -41,10 +41,6 @@ public class RedundantMethodOverrideInspectionTest extends LightJavaInspectionTe
IdeaTestUtil.withLevel(getModule(), LanguageLevel.JDK_19_PREVIEW, this::doTest);
}
public void testGuardedAndParenthesizedPatterns() {
IdeaTestUtil.withLevel(getModule(), LanguageLevel.JDK_17_PREVIEW, this::doTest);
}
public void testForEachPatterns() {
IdeaTestUtil.withLevel(getModule(), LanguageLevel.JDK_20_PREVIEW, this::doTest);
}

View File

@@ -23,7 +23,7 @@ public class IfCanBeSwitchInspectionTest extends LightJavaInspectionTestCase {
@Override
protected @NotNull LightProjectDescriptor getProjectDescriptor() {
return JAVA_17;
return JAVA_20;
}
@Nullable

View File

@@ -15,7 +15,7 @@ public class UnnecessaryInterfaceModifierInspectionTest extends LightJavaCodeIns
@NotNull
@Override
protected LightProjectDescriptor getProjectDescriptor() {
return JAVA_17;
return JAVA_20;
}
private void doTest() {