diff --git a/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/ast/internal/LanguageLevelChecker.java b/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/ast/internal/LanguageLevelChecker.java index 2b1267f9ee..e6dbcd8437 100644 --- a/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/ast/internal/LanguageLevelChecker.java +++ b/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/ast/internal/LanguageLevelChecker.java @@ -122,52 +122,6 @@ public class LanguageLevelChecker { * They might be also be standardized. */ private enum PreviewFeature implements LanguageFeature { - /** - * Pattern matching for switch - * @see JEP 406: Pattern Matching for switch (Preview) (Java 17) - * @see JEP 420: Pattern Matching for switch (Second Preview) (Java 18) - * @see JEP 427: Pattern Matching for switch (Third Preview) (Java 19) - * @see JEP 433: Pattern Matching for switch (Fourth Preview) (Java 20) - * @see JEP 441: Pattern Matching for switch (Java 21) - */ - PATTERNS_IN_SWITCH_STATEMENTS(17, 20, true), - - /** - * Part of pattern matching for switch - * @see #PATTERNS_IN_SWITCH_STATEMENTS - * @see JEP 406: Pattern Matching for switch (Preview) (Java 17) - * @see JEP 420: Pattern Matching for switch (Second Preview) (Java 18) - * @see JEP 427: Pattern Matching for switch (Third Preview) (Java 19) - * @see JEP 433: Pattern Matching for switch (Fourth Preview) (Java 20) - * @see JEP 441: Pattern Matching for switch (Java 21) - */ - NULL_IN_SWITCH_CASES(17, 20, true), - - /** - * Part of pattern matching for switch: Case refinement using "when" - * @see #PATTERNS_IN_SWITCH_STATEMENTS - * @see JEP 427: Pattern Matching for switch (Third Preview) (Java 19) - * @see JEP 433: Pattern Matching for switch (Fourth Preview) (Java 20) - * @see JEP 441: Pattern Matching for switch (Java 21) - */ - CASE_REFINEMENT(19, 20, true), - - /** - * Record patterns - * @see JEP 405: Record Patterns (Preview) (Java 19) - * @see JEP 432: Record Patterns (Second Preview) (Java 20) - * @see JEP 440: Record Patterns (Java 21) - */ - RECORD_PATTERNS(19, 20, true), - - /** - * Record deconstruction patterns in for-each loops. - * Note: support for this has been removed with Java 21 (JEP 440). - * @see JEP 432: Record Patterns (Second Preview) (Java 20) - * @see JEP 440: Record Patterns (Java 21) - */ - DECONSTRUCTION_PATTERNS_IN_ENHANCED_FOR_STATEMENT(20, 20, false), - /** * String Templates. * @see JEP 430: String Templates (Preview) (Java 21) @@ -378,6 +332,44 @@ public class LanguageLevelChecker { */ SEALED_CLASSES(17), + /** + * Pattern matching for switch + * @see JEP 406: Pattern Matching for switch (Preview) (Java 17) + * @see JEP 420: Pattern Matching for switch (Second Preview) (Java 18) + * @see JEP 427: Pattern Matching for switch (Third Preview) (Java 19) + * @see JEP 433: Pattern Matching for switch (Fourth Preview) (Java 20) + * @see JEP 441: Pattern Matching for switch (Java 21) + */ + PATTERNS_IN_SWITCH_STATEMENTS(21), + + /** + * Part of pattern matching for switch + * @see #PATTERNS_IN_SWITCH_STATEMENTS + * @see JEP 406: Pattern Matching for switch (Preview) (Java 17) + * @see JEP 420: Pattern Matching for switch (Second Preview) (Java 18) + * @see JEP 427: Pattern Matching for switch (Third Preview) (Java 19) + * @see JEP 433: Pattern Matching for switch (Fourth Preview) (Java 20) + * @see JEP 441: Pattern Matching for switch (Java 21) + */ + NULL_IN_SWITCH_CASES(21), + + /** + * Part of pattern matching for switch: Case refinement using "when" + * @see #PATTERNS_IN_SWITCH_STATEMENTS + * @see JEP 427: Pattern Matching for switch (Third Preview) (Java 19) + * @see JEP 433: Pattern Matching for switch (Fourth Preview) (Java 20) + * @see JEP 441: Pattern Matching for switch (Java 21) + */ + CASE_REFINEMENT(21), + + /** + * Record patterns + * @see JEP 405: Record Patterns (Preview) (Java 19) + * @see JEP 432: Record Patterns (Second Preview) (Java 20) + * @see JEP 440: Record Patterns (Java 21) + */ + RECORD_PATTERNS(21), + ; // SUPPRESS CHECKSTYLE enum trailing semi is awesome private final int minJdkLevel; @@ -512,9 +504,6 @@ public class LanguageLevelChecker { @Override public Void visit(ASTForeachStatement node, T data) { check(node, RegularLanguageFeature.FOREACH_LOOPS, data); - if (node.getFirstChild() instanceof ASTRecordPattern) { - check(node, PreviewFeature.DECONSTRUCTION_PATTERNS_IN_ENHANCED_FOR_STATEMENT, data); - } return null; } @@ -578,13 +567,13 @@ public class LanguageLevelChecker { @Override public Void visit(ASTRecordPattern node, T data) { - check(node, PreviewFeature.RECORD_PATTERNS, data); + check(node, RegularLanguageFeature.RECORD_PATTERNS, data); return null; } @Override public Void visit(ASTGuard node, T data) { - check(node, PreviewFeature.CASE_REFINEMENT, data); + check(node, RegularLanguageFeature.CASE_REFINEMENT, data); return null; } @@ -627,13 +616,13 @@ public class LanguageLevelChecker { check(node, RegularLanguageFeature.COMPOSITE_CASE_LABEL, data); } if (node.isDefault() && JavaTokenKinds.CASE == node.getFirstToken().getKind()) { - check(node, PreviewFeature.PATTERNS_IN_SWITCH_STATEMENTS, data); + check(node, RegularLanguageFeature.PATTERNS_IN_SWITCH_STATEMENTS, data); } if (node.getFirstChild() instanceof ASTNullLiteral) { - check(node, PreviewFeature.NULL_IN_SWITCH_CASES, data); + check(node, RegularLanguageFeature.NULL_IN_SWITCH_CASES, data); } if (node.getFirstChild() instanceof ASTPattern) { - check(node, PreviewFeature.PATTERNS_IN_SWITCH_STATEMENTS, data); + check(node, RegularLanguageFeature.PATTERNS_IN_SWITCH_STATEMENTS, data); } return null; } diff --git a/pmd-java/src/test/java/net/sourceforge/pmd/lang/java/ast/Java21TreeDumpTest.java b/pmd-java/src/test/java/net/sourceforge/pmd/lang/java/ast/Java21TreeDumpTest.java index 6ffde7d974..b5f7eed371 100644 --- a/pmd-java/src/test/java/net/sourceforge/pmd/lang/java/ast/Java21TreeDumpTest.java +++ b/pmd-java/src/test/java/net/sourceforge/pmd/lang/java/ast/Java21TreeDumpTest.java @@ -34,7 +34,7 @@ class Java21TreeDumpTest extends BaseJavaTreeDumpTest { @Test void patternMatchingForSwitchBeforeJava21() { ParseException thrown = assertThrows(ParseException.class, () -> java20.parseResource("Jep441_PatternMatchingForSwitch.java")); - assertThat(thrown.getMessage(), containsString("Patterns in switch statements is a preview feature of JDK 20, you should select your language version accordingly")); + assertThat(thrown.getMessage(), containsString("Patterns in switch statements are a feature of Java 21, you should select your language version accordingly")); } @Test @@ -45,7 +45,7 @@ class Java21TreeDumpTest extends BaseJavaTreeDumpTest { @Test void dealingWithNullBeforeJava21() { ParseException thrown = assertThrows(ParseException.class, () -> java20.parseResource("DealingWithNull.java")); - assertThat(thrown.getMessage(), containsString("Null in switch cases is a preview feature of JDK 20, you should select your language version accordingly")); + assertThat(thrown.getMessage(), containsString("Null in switch cases are a feature of Java 21, you should select your language version accordingly")); } @@ -67,7 +67,7 @@ class Java21TreeDumpTest extends BaseJavaTreeDumpTest { @Test void guardedPatternsBeforeJava21() { ParseException thrown = assertThrows(ParseException.class, () -> java20.parseResource("GuardedPatterns.java")); - assertThat(thrown.getMessage(), containsString("Patterns in switch statements is a preview feature of JDK 20, you should select your language version accordingly")); + assertThat(thrown.getMessage(), containsString("Patterns in switch statements are a feature of Java 21, you should select your language version accordingly")); } @Test @@ -78,7 +78,7 @@ class Java21TreeDumpTest extends BaseJavaTreeDumpTest { @Test void patternsInSwitchLabelsBeforeJava21() { ParseException thrown = assertThrows(ParseException.class, () -> java20.parseResource("PatternsInSwitchLabels.java")); - assertThat(thrown.getMessage(), containsString("Patterns in switch statements is a preview feature of JDK 20, you should select your language version accordingly")); + assertThat(thrown.getMessage(), containsString("Patterns in switch statements are a feature of Java 21, you should select your language version accordingly")); } @Test @@ -99,7 +99,7 @@ class Java21TreeDumpTest extends BaseJavaTreeDumpTest { @Test void recordPatternsJepBeforeJava21() { ParseException thrown = assertThrows(ParseException.class, () -> java20.parseResource("Jep440_RecordPatterns.java")); - assertThat(thrown.getMessage(), containsString("Record patterns is a preview feature of JDK 20, you should select your language version accordingly")); + assertThat(thrown.getMessage(), containsString("Record patterns are a feature of Java 21, you should select your language version accordingly")); } @Test @@ -110,7 +110,7 @@ class Java21TreeDumpTest extends BaseJavaTreeDumpTest { @Test void recordPatternsBeforeJava21() { ParseException thrown = assertThrows(ParseException.class, () -> java20.parseResource("RecordPatterns.java")); - assertThat(thrown.getMessage(), containsString("Record patterns is a preview feature of JDK 20, you should select your language version accordingly")); + assertThat(thrown.getMessage(), containsString("Record patterns are a feature of Java 21, you should select your language version accordingly")); } @Test