diff --git a/docs/pages/release_notes.md b/docs/pages/release_notes.md
index e9df137ccc..0d1a0b54dd 100644
--- a/docs/pages/release_notes.md
+++ b/docs/pages/release_notes.md
@@ -240,6 +240,8 @@ The rules have been moved into categories with PMD 6.
- method `getParenthesisDepth()` has been removed.
* {%jdoc java::lang.java.ast.ASTTemplateFragment %}: To get the content of the template, use now
{%jdoc java::lang.java.ast.ASTTemplateFragment#getContent() %} or `@Content` instead of `getImage()`/`@Image`.
+* {%jdoc java::lang.java.ast.ASTUnnamedPattern %} is not experimental anymore. The language feature
+ has been standardized with Java 22.
**New API**
diff --git a/pmd-java/etc/grammar/Java.jjt b/pmd-java/etc/grammar/Java.jjt
index cf66ce0cb0..3d01cd8830 100644
--- a/pmd-java/etc/grammar/Java.jjt
+++ b/pmd-java/etc/grammar/Java.jjt
@@ -1,4 +1,6 @@
/**
+ * Support "JEP 456: Unnamed Variables & Patterns" (Java 22)
+ * This is now a regular language feature. Otherwise no changes.
* Support "JEP 463: Implicitly Declared Classes and Instance Main Methods (Second Preview)" (Java 22)
* No changes.
* Support "JEP 459: String Templates (Second Preview)" (Java 22)
diff --git a/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/ast/ASTUnnamedPattern.java b/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/ast/ASTUnnamedPattern.java
index 6eed6e6d93..52a5534764 100644
--- a/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/ast/ASTUnnamedPattern.java
+++ b/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/ast/ASTUnnamedPattern.java
@@ -5,10 +5,8 @@
package net.sourceforge.pmd.lang.java.ast;
-import net.sourceforge.pmd.annotation.Experimental;
-
/**
- * An unnamed pattern, a Java 21 Preview language feature.
+ * An unnamed pattern, a Java 22 language feature.
*
*
*
@@ -16,9 +14,8 @@ import net.sourceforge.pmd.annotation.Experimental;
*
*
*
- * @see JEP 443: Unnamed patterns and variables (Preview) (Java 21)
+ * @see JEP 456: Unnamed Variables & Patterns (Java 22)
*/
-@Experimental
public final class ASTUnnamedPattern extends AbstractJavaNode implements ASTPattern {
ASTUnnamedPattern(int id) {
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 dccede5cc9..326e14b23a 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
@@ -130,10 +130,11 @@ public class LanguageLevelChecker {
STRING_TEMPLATES(21, 22, false),
/**
- * Unnamed patterns and variables.
+ * Unnamed variables and patterns.
* @see JEP 443: Unnamed patterns and variables (Preview) (Java 21)
+ * @see JEP 456: Unnamed Variables & Patterns (Java 22)
*/
- UNNAMED_PATTERNS_AND_VARIABLES(21, 22, false),
+ UNNAMED_VARIABLES_AND_PATTERNS(21, 21, true),
/**
* Unnamed Classes and Instance Main Methods
@@ -167,10 +168,10 @@ public class LanguageLevelChecker {
}
String message = StringUtils.capitalize(displayNameLower(name()));
- if (canBePreview) {
+ if (wasStandardized) {
+ message += " was only standardized in Java " + (maxPreviewVersion + 1);
+ } else if (canBePreview) {
message += " is a preview feature of JDK " + jdk;
- } else if (wasStandardized) {
- message = message + " was only standardized in Java " + (maxPreviewVersion + 1);
} else if (minPreviewVersion == maxPreviewVersion) {
message += " is a preview feature of JDK " + minPreviewVersion;
} else {
@@ -655,7 +656,7 @@ public class LanguageLevelChecker {
@Override
public Void visit(ASTUnnamedPattern node, T data) {
- check(node, PreviewFeature.UNNAMED_PATTERNS_AND_VARIABLES, data);
+ check(node, PreviewFeature.UNNAMED_VARIABLES_AND_PATTERNS, data);
return null;
}
@@ -688,8 +689,8 @@ public class LanguageLevelChecker {
} else if ("assert".equals(simpleName)) {
check(node, Keywords.ASSERT_AS_AN_IDENTIFIER, acc);
} else if ("_".equals(simpleName)) {
- if (LanguageLevelChecker.this.preview) {
- check(node, PreviewFeature.UNNAMED_PATTERNS_AND_VARIABLES, acc);
+ if (LanguageLevelChecker.this.jdkVersion >= 21) {
+ check(node, PreviewFeature.UNNAMED_VARIABLES_AND_PATTERNS, acc);
} else {
check(node, Keywords.UNDERSCORE_AS_AN_IDENTIFIER, acc);
}
diff --git a/pmd-java/src/test/java/net/sourceforge/pmd/lang/java/ast/AllJavaAstTreeDumpTest.java b/pmd-java/src/test/java/net/sourceforge/pmd/lang/java/ast/AllJavaAstTreeDumpTest.java
index 42794be992..64c8afd050 100644
--- a/pmd-java/src/test/java/net/sourceforge/pmd/lang/java/ast/AllJavaAstTreeDumpTest.java
+++ b/pmd-java/src/test/java/net/sourceforge/pmd/lang/java/ast/AllJavaAstTreeDumpTest.java
@@ -16,7 +16,8 @@ import org.junit.platform.suite.api.Suite;
Java16TreeDumpTest.class,
Java17TreeDumpTest.class,
Java21TreeDumpTest.class,
- Java21PreviewTreeDumpTest.class
+ Java21PreviewTreeDumpTest.class,
+ Java22TreeDumpTest.class
})
class AllJavaAstTreeDumpTest {
diff --git a/pmd-java/src/test/java/net/sourceforge/pmd/lang/java/ast/Java21PreviewTreeDumpTest.java b/pmd-java/src/test/java/net/sourceforge/pmd/lang/java/ast/Java21PreviewTreeDumpTest.java
index 26c055469d..802d43fdba 100644
--- a/pmd-java/src/test/java/net/sourceforge/pmd/lang/java/ast/Java21PreviewTreeDumpTest.java
+++ b/pmd-java/src/test/java/net/sourceforge/pmd/lang/java/ast/Java21PreviewTreeDumpTest.java
@@ -59,10 +59,7 @@ class Java21PreviewTreeDumpTest extends BaseJavaTreeDumpTest {
@Test
void unnamedPatternsAndVariablesBeforeJava21Preview() {
ParseException thrown = assertThrows(ParseException.class, () -> java21.parseResource("Jep443_UnnamedPatternsAndVariables.java"));
- assertThat(thrown.getMessage(), containsString("Since Java 9, '_' is reserved and cannot be used as an identifier"));
-
- thrown = assertThrows(ParseException.class, () -> java21.parseResource("Jep443_UnnamedPatternsAndVariables2.java"));
- assertThat(thrown.getMessage(), containsString("Unnamed patterns and variables is a preview feature of JDK 21, you should select your language version accordingly"));
+ assertThat(thrown.getMessage(), containsString("Unnamed variables and patterns was only standardized in Java 22, you should select your language version accordingly"));
}
@Test
diff --git a/pmd-java/src/test/java/net/sourceforge/pmd/lang/java/ast/Java22PreviewTreeDumpTest.java b/pmd-java/src/test/java/net/sourceforge/pmd/lang/java/ast/Java22PreviewTreeDumpTest.java
index 0b24ca452e..e6ceeed81d 100644
--- a/pmd-java/src/test/java/net/sourceforge/pmd/lang/java/ast/Java22PreviewTreeDumpTest.java
+++ b/pmd-java/src/test/java/net/sourceforge/pmd/lang/java/ast/Java22PreviewTreeDumpTest.java
@@ -51,20 +51,6 @@ class Java22PreviewTreeDumpTest extends BaseJavaTreeDumpTest {
assertEquals("java.lang.String", ((JClassSymbol) typeMirror.getSymbol()).getCanonicalName());
}
- @Test
- void unnamedPatternsAndVariables() {
- doTest("Jep443_UnnamedPatternsAndVariables");
- }
-
- @Test
- void unnamedPatternsAndVariablesBeforeJava22Preview() {
- ParseException thrown = assertThrows(ParseException.class, () -> java22.parseResource("Jep443_UnnamedPatternsAndVariables.java"));
- assertThat(thrown.getMessage(), containsString("Since Java 9, '_' is reserved and cannot be used as an identifier"));
-
- thrown = assertThrows(ParseException.class, () -> java22.parseResource("Jep443_UnnamedPatternsAndVariables2.java"));
- assertThat(thrown.getMessage(), containsString("Unnamed patterns and variables is a preview feature of JDK 22, you should select your language version accordingly"));
- }
-
@Test
void jep463UnnamedClasses1() {
doTest("Jep463_UnnamedClasses1");
diff --git a/pmd-java/src/test/java/net/sourceforge/pmd/lang/java/ast/Java22TreeDumpTest.java b/pmd-java/src/test/java/net/sourceforge/pmd/lang/java/ast/Java22TreeDumpTest.java
new file mode 100644
index 0000000000..b28af7a40e
--- /dev/null
+++ b/pmd-java/src/test/java/net/sourceforge/pmd/lang/java/ast/Java22TreeDumpTest.java
@@ -0,0 +1,46 @@
+/*
+ * BSD-style license; for more info see http://pmd.sourceforge.net/license.html
+ */
+
+package net.sourceforge.pmd.lang.java.ast;
+
+import static org.hamcrest.CoreMatchers.containsString;
+import static org.hamcrest.MatcherAssert.assertThat;
+import static org.junit.jupiter.api.Assertions.assertThrows;
+
+import org.junit.jupiter.api.Test;
+
+import net.sourceforge.pmd.lang.ast.ParseException;
+import net.sourceforge.pmd.lang.ast.test.BaseParsingHelper;
+import net.sourceforge.pmd.lang.java.BaseJavaTreeDumpTest;
+import net.sourceforge.pmd.lang.java.JavaParsingHelper;
+
+class Java22TreeDumpTest extends BaseJavaTreeDumpTest {
+ private final JavaParsingHelper java22 =
+ JavaParsingHelper.DEFAULT.withDefaultVersion("22")
+ .withResourceContext(Java21TreeDumpTest.class, "jdkversiontests/java22/");
+ private final JavaParsingHelper java21 = java22.withDefaultVersion("21");
+ private final JavaParsingHelper java17 = java22.withDefaultVersion("17");
+
+ @Override
+ public BaseParsingHelper, ?> getParser() {
+ return java22;
+ }
+
+ @Test
+ void jep456UnnamedPatternsAndVariables() {
+ doTest("Jep456_UnnamedPatternsAndVariables");
+ }
+
+ @Test
+ void jep456UnnamedPatternsAndVariablesBeforeJava22() {
+ ParseException thrown = assertThrows(ParseException.class, () -> java21.parseResource("Jep456_UnnamedPatternsAndVariables.java"));
+ assertThat(thrown.getMessage(), containsString("Unnamed variables and patterns was only standardized in Java 22, you should select your language version accordingly"));
+ }
+
+ @Test
+ void jep456UnnamedVariablesAndPatternsUnderscoreBeforeJava21() {
+ ParseException thrown = assertThrows(ParseException.class, () -> java17.parse("class Test { { for(Integer _ : java.util.Arrays.asList(1, 2, 3)) {} } }"));
+ assertThat(thrown.getMessage(), containsString("Since Java 9, '_' is reserved and cannot be used as an identifier"));
+ }
+}
diff --git a/pmd-java/src/test/resources/net/sourceforge/pmd/lang/java/ast/jdkversiontests/java21p/Jep443_UnnamedPatternsAndVariables2.java b/pmd-java/src/test/resources/net/sourceforge/pmd/lang/java/ast/jdkversiontests/java21p/Jep443_UnnamedPatternsAndVariables2.java
deleted file mode 100644
index 7d690d41e5..0000000000
--- a/pmd-java/src/test/resources/net/sourceforge/pmd/lang/java/ast/jdkversiontests/java21p/Jep443_UnnamedPatternsAndVariables2.java
+++ /dev/null
@@ -1,26 +0,0 @@
-/*
- * BSD-style license; for more info see http://pmd.sourceforge.net/license.html
- */
-
-
-import java.util.ArrayDeque;
-import java.util.List;
-import java.util.Queue;
-import java.util.stream.Collectors;
-
-/**
- * @see JEP 443: Unnamed Patterns and Variables (Preview)
- */
-class Jep443_UnamedPatternsAndVariables2 {
- record Point(int x, int y) { }
- enum Color { RED, GREEN, BLUE }
- record ColoredPoint(Point p, Color c) { }
-
- void unnamedPatterns1() {
- ColoredPoint r = new ColoredPoint(new Point(3,4), Color.GREEN);
-
- if (r instanceof ColoredPoint(Point(int x, int y), _)) {
- System.out.println(x + " " + y);
- }
- }
-}
diff --git a/pmd-java/src/test/resources/net/sourceforge/pmd/lang/java/ast/jdkversiontests/java22p/Jep443_UnnamedPatternsAndVariables.java b/pmd-java/src/test/resources/net/sourceforge/pmd/lang/java/ast/jdkversiontests/java22/Jep456_UnnamedPatternsAndVariables.java
similarity index 94%
rename from pmd-java/src/test/resources/net/sourceforge/pmd/lang/java/ast/jdkversiontests/java22p/Jep443_UnnamedPatternsAndVariables.java
rename to pmd-java/src/test/resources/net/sourceforge/pmd/lang/java/ast/jdkversiontests/java22/Jep456_UnnamedPatternsAndVariables.java
index dc2e9f4c7a..a9d8cb8004 100644
--- a/pmd-java/src/test/resources/net/sourceforge/pmd/lang/java/ast/jdkversiontests/java22p/Jep443_UnnamedPatternsAndVariables.java
+++ b/pmd-java/src/test/resources/net/sourceforge/pmd/lang/java/ast/jdkversiontests/java22/Jep456_UnnamedPatternsAndVariables.java
@@ -9,9 +9,10 @@ import java.util.Queue;
import java.util.stream.Collectors;
/**
- * @see JEP 443: Unnamed Patterns and Variables (Preview)
+ * @see JEP 443: Unnamed Patterns and Variables (Preview) (Java 21)
+ * @see JEP 456: Unnamed Variables & Patterns (Java 22)
*/
-class Jep443_UnamedPatternsAndVariables {
+class Jep456_UnamedPatternsAndVariables {
record Point(int x, int y) { }
enum Color { RED, GREEN, BLUE }
record ColoredPoint(Point p, Color c) { }
diff --git a/pmd-java/src/test/resources/net/sourceforge/pmd/lang/java/ast/jdkversiontests/java22p/Jep443_UnnamedPatternsAndVariables.txt b/pmd-java/src/test/resources/net/sourceforge/pmd/lang/java/ast/jdkversiontests/java22/Jep456_UnnamedPatternsAndVariables.txt
similarity index 98%
rename from pmd-java/src/test/resources/net/sourceforge/pmd/lang/java/ast/jdkversiontests/java22p/Jep443_UnnamedPatternsAndVariables.txt
rename to pmd-java/src/test/resources/net/sourceforge/pmd/lang/java/ast/jdkversiontests/java22/Jep456_UnnamedPatternsAndVariables.txt
index fcb1e37135..8ade7f7fcc 100644
--- a/pmd-java/src/test/resources/net/sourceforge/pmd/lang/java/ast/jdkversiontests/java22p/Jep443_UnnamedPatternsAndVariables.txt
+++ b/pmd-java/src/test/resources/net/sourceforge/pmd/lang/java/ast/jdkversiontests/java22/Jep456_UnnamedPatternsAndVariables.txt
@@ -3,10 +3,10 @@
+- ImportDeclaration[@ImportOnDemand = false, @ImportedName = "java.util.List", @ImportedSimpleName = "List", @PackageName = "java.util", @Static = false]
+- ImportDeclaration[@ImportOnDemand = false, @ImportedName = "java.util.Queue", @ImportedSimpleName = "Queue", @PackageName = "java.util", @Static = false]
+- ImportDeclaration[@ImportOnDemand = false, @ImportedName = "java.util.stream.Collectors", @ImportedSimpleName = "Collectors", @PackageName = "java.util.stream", @Static = false]
- +- ClassDeclaration[@Abstract = false, @Annotation = false, @Anonymous = false, @BinaryName = "Jep443_UnamedPatternsAndVariables", @CanonicalName = "Jep443_UnamedPatternsAndVariables", @EffectiveVisibility = Visibility.V_PACKAGE, @Enum = false, @Final = false, @Interface = false, @Local = false, @Nested = false, @PackageName = "", @Record = false, @RegularClass = true, @RegularInterface = false, @SimpleName = "Jep443_UnamedPatternsAndVariables", @Static = false, @TopLevel = true, @Visibility = Visibility.V_PACKAGE]
+ +- ClassDeclaration[@Abstract = false, @Annotation = false, @Anonymous = false, @BinaryName = "Jep456_UnamedPatternsAndVariables", @CanonicalName = "Jep456_UnamedPatternsAndVariables", @EffectiveVisibility = Visibility.V_PACKAGE, @Enum = false, @Final = false, @Interface = false, @Local = false, @Nested = false, @PackageName = "", @Record = false, @RegularClass = true, @RegularInterface = false, @SimpleName = "Jep456_UnamedPatternsAndVariables", @Static = false, @TopLevel = true, @Visibility = Visibility.V_PACKAGE]
+- ModifierList[@EffectiveModifiers = "{}", @ExplicitModifiers = "{}"]
+- ClassBody[@Empty = false, @Size = 19]
- +- RecordDeclaration[@Abstract = false, @Annotation = false, @Anonymous = false, @BinaryName = "Jep443_UnamedPatternsAndVariables$Point", @CanonicalName = "Jep443_UnamedPatternsAndVariables.Point", @EffectiveVisibility = Visibility.V_PACKAGE, @Enum = false, @Final = true, @Interface = false, @Local = false, @Nested = true, @PackageName = "", @Record = true, @RegularClass = false, @RegularInterface = false, @SimpleName = "Point", @Static = true, @TopLevel = false, @Visibility = Visibility.V_PACKAGE]
+ +- RecordDeclaration[@Abstract = false, @Annotation = false, @Anonymous = false, @BinaryName = "Jep456_UnamedPatternsAndVariables$Point", @CanonicalName = "Jep456_UnamedPatternsAndVariables.Point", @EffectiveVisibility = Visibility.V_PACKAGE, @Enum = false, @Final = true, @Interface = false, @Local = false, @Nested = true, @PackageName = "", @Record = true, @RegularClass = false, @RegularInterface = false, @SimpleName = "Point", @Static = true, @TopLevel = false, @Visibility = Visibility.V_PACKAGE]
| +- ModifierList[@EffectiveModifiers = "{static, final}", @ExplicitModifiers = "{}"]
| +- RecordComponentList[@Empty = false, @Size = 2, @Varargs = false]
| | +- RecordComponent[@EffectiveVisibility = Visibility.V_PRIVATE, @Varargs = false, @Visibility = Visibility.V_PRIVATE]
@@ -18,7 +18,7 @@
| | +- PrimitiveType[@Kind = PrimitiveTypeKind.INT]
| | +- VariableId[@ArrayType = false, @EffectiveVisibility = Visibility.V_PRIVATE, @EnumConstant = false, @ExceptionBlockParameter = false, @Field = false, @Final = true, @ForLoopVariable = false, @ForeachVariable = false, @FormalParameter = false, @LambdaParameter = false, @LocalVariable = false, @Name = "y", @PatternBinding = false, @RecordComponent = true, @ResourceDeclaration = false, @TypeInferred = false, @Visibility = Visibility.V_PRIVATE]
| +- RecordBody[@Empty = true, @Size = 0]
- +- EnumDeclaration[@Abstract = false, @Annotation = false, @Anonymous = false, @BinaryName = "Jep443_UnamedPatternsAndVariables$Color", @CanonicalName = "Jep443_UnamedPatternsAndVariables.Color", @EffectiveVisibility = Visibility.V_PACKAGE, @Enum = true, @Final = true, @Interface = false, @Local = false, @Nested = true, @PackageName = "", @Record = false, @RegularClass = false, @RegularInterface = false, @SimpleName = "Color", @Static = true, @TopLevel = false, @Visibility = Visibility.V_PACKAGE]
+ +- EnumDeclaration[@Abstract = false, @Annotation = false, @Anonymous = false, @BinaryName = "Jep456_UnamedPatternsAndVariables$Color", @CanonicalName = "Jep456_UnamedPatternsAndVariables.Color", @EffectiveVisibility = Visibility.V_PACKAGE, @Enum = true, @Final = true, @Interface = false, @Local = false, @Nested = true, @PackageName = "", @Record = false, @RegularClass = false, @RegularInterface = false, @SimpleName = "Color", @Static = true, @TopLevel = false, @Visibility = Visibility.V_PACKAGE]
| +- ModifierList[@EffectiveModifiers = "{static, final}", @ExplicitModifiers = "{}"]
| +- EnumBody[@Empty = false, @SeparatorSemi = false, @Size = 3, @TrailingComma = false]
| +- EnumConstant[@AnonymousClass = false, @EffectiveVisibility = Visibility.V_PACKAGE, @Image = "RED", @MethodName = "new", @Name = "RED", @Visibility = Visibility.V_PUBLIC]
@@ -30,7 +30,7 @@
| +- EnumConstant[@AnonymousClass = false, @EffectiveVisibility = Visibility.V_PACKAGE, @Image = "BLUE", @MethodName = "new", @Name = "BLUE", @Visibility = Visibility.V_PUBLIC]
| +- ModifierList[@EffectiveModifiers = "{public, static, final}", @ExplicitModifiers = "{}"]
| +- VariableId[@ArrayType = false, @EffectiveVisibility = Visibility.V_PACKAGE, @EnumConstant = true, @ExceptionBlockParameter = false, @Field = false, @Final = true, @ForLoopVariable = false, @ForeachVariable = false, @FormalParameter = false, @LambdaParameter = false, @LocalVariable = false, @Name = "BLUE", @PatternBinding = false, @RecordComponent = false, @ResourceDeclaration = false, @TypeInferred = true, @Visibility = Visibility.V_PUBLIC]
- +- RecordDeclaration[@Abstract = false, @Annotation = false, @Anonymous = false, @BinaryName = "Jep443_UnamedPatternsAndVariables$ColoredPoint", @CanonicalName = "Jep443_UnamedPatternsAndVariables.ColoredPoint", @EffectiveVisibility = Visibility.V_PACKAGE, @Enum = false, @Final = true, @Interface = false, @Local = false, @Nested = true, @PackageName = "", @Record = true, @RegularClass = false, @RegularInterface = false, @SimpleName = "ColoredPoint", @Static = true, @TopLevel = false, @Visibility = Visibility.V_PACKAGE]
+ +- RecordDeclaration[@Abstract = false, @Annotation = false, @Anonymous = false, @BinaryName = "Jep456_UnamedPatternsAndVariables$ColoredPoint", @CanonicalName = "Jep456_UnamedPatternsAndVariables.ColoredPoint", @EffectiveVisibility = Visibility.V_PACKAGE, @Enum = false, @Final = true, @Interface = false, @Local = false, @Nested = true, @PackageName = "", @Record = true, @RegularClass = false, @RegularInterface = false, @SimpleName = "ColoredPoint", @Static = true, @TopLevel = false, @Visibility = Visibility.V_PACKAGE]
| +- ModifierList[@EffectiveModifiers = "{static, final}", @ExplicitModifiers = "{}"]
| +- RecordComponentList[@Empty = false, @Size = 2, @Varargs = false]
| | +- RecordComponent[@EffectiveVisibility = Visibility.V_PRIVATE, @Varargs = false, @Visibility = Visibility.V_PRIVATE]
@@ -125,29 +125,29 @@
| | +- VariableAccess[@AccessType = AccessType.READ, @CompileTimeConstant = false, @Image = "x", @Name = "x", @ParenthesisDepth = 0, @Parenthesized = false]
| | +- StringLiteral[@CompileTimeConstant = true, @ConstValue = " ", @Empty = false, @Image = "\" \"", @Length = 1, @LiteralText = "\" \"", @ParenthesisDepth = 0, @Parenthesized = false, @TextBlock = false]
| +- VariableAccess[@AccessType = AccessType.READ, @CompileTimeConstant = false, @Image = "y", @Name = "y", @ParenthesisDepth = 0, @Parenthesized = false]
- +- ClassDeclaration[@Abstract = true, @Annotation = false, @Anonymous = false, @BinaryName = "Jep443_UnamedPatternsAndVariables$Ball", @CanonicalName = "Jep443_UnamedPatternsAndVariables.Ball", @EffectiveVisibility = Visibility.V_PACKAGE, @Enum = false, @Final = false, @Interface = false, @Local = false, @Nested = true, @PackageName = "", @Record = false, @RegularClass = true, @RegularInterface = false, @SimpleName = "Ball", @Static = false, @TopLevel = false, @Visibility = Visibility.V_PACKAGE]
+ +- ClassDeclaration[@Abstract = true, @Annotation = false, @Anonymous = false, @BinaryName = "Jep456_UnamedPatternsAndVariables$Ball", @CanonicalName = "Jep456_UnamedPatternsAndVariables.Ball", @EffectiveVisibility = Visibility.V_PACKAGE, @Enum = false, @Final = false, @Interface = false, @Local = false, @Nested = true, @PackageName = "", @Record = false, @RegularClass = true, @RegularInterface = false, @SimpleName = "Ball", @Static = false, @TopLevel = false, @Visibility = Visibility.V_PACKAGE]
| +- ModifierList[@EffectiveModifiers = "{sealed, abstract}", @ExplicitModifiers = "{sealed, abstract}"]
| +- PermitsList[@Empty = false, @Size = 3]
| | +- ClassType[@FullyQualified = false, @SimpleName = "RedBall"]
| | +- ClassType[@FullyQualified = false, @SimpleName = "BlueBall"]
| | +- ClassType[@FullyQualified = false, @SimpleName = "GreenBall"]
| +- ClassBody[@Empty = true, @Size = 0]
- +- ClassDeclaration[@Abstract = false, @Annotation = false, @Anonymous = false, @BinaryName = "Jep443_UnamedPatternsAndVariables$RedBall", @CanonicalName = "Jep443_UnamedPatternsAndVariables.RedBall", @EffectiveVisibility = Visibility.V_PACKAGE, @Enum = false, @Final = true, @Interface = false, @Local = false, @Nested = true, @PackageName = "", @Record = false, @RegularClass = true, @RegularInterface = false, @SimpleName = "RedBall", @Static = false, @TopLevel = false, @Visibility = Visibility.V_PACKAGE]
+ +- ClassDeclaration[@Abstract = false, @Annotation = false, @Anonymous = false, @BinaryName = "Jep456_UnamedPatternsAndVariables$RedBall", @CanonicalName = "Jep456_UnamedPatternsAndVariables.RedBall", @EffectiveVisibility = Visibility.V_PACKAGE, @Enum = false, @Final = true, @Interface = false, @Local = false, @Nested = true, @PackageName = "", @Record = false, @RegularClass = true, @RegularInterface = false, @SimpleName = "RedBall", @Static = false, @TopLevel = false, @Visibility = Visibility.V_PACKAGE]
| +- ModifierList[@EffectiveModifiers = "{final}", @ExplicitModifiers = "{final}"]
| +- ExtendsList[@Empty = false, @Size = 1]
| | +- ClassType[@FullyQualified = false, @SimpleName = "Ball"]
| +- ClassBody[@Empty = true, @Size = 0]
- +- ClassDeclaration[@Abstract = false, @Annotation = false, @Anonymous = false, @BinaryName = "Jep443_UnamedPatternsAndVariables$BlueBall", @CanonicalName = "Jep443_UnamedPatternsAndVariables.BlueBall", @EffectiveVisibility = Visibility.V_PACKAGE, @Enum = false, @Final = true, @Interface = false, @Local = false, @Nested = true, @PackageName = "", @Record = false, @RegularClass = true, @RegularInterface = false, @SimpleName = "BlueBall", @Static = false, @TopLevel = false, @Visibility = Visibility.V_PACKAGE]
+ +- ClassDeclaration[@Abstract = false, @Annotation = false, @Anonymous = false, @BinaryName = "Jep456_UnamedPatternsAndVariables$BlueBall", @CanonicalName = "Jep456_UnamedPatternsAndVariables.BlueBall", @EffectiveVisibility = Visibility.V_PACKAGE, @Enum = false, @Final = true, @Interface = false, @Local = false, @Nested = true, @PackageName = "", @Record = false, @RegularClass = true, @RegularInterface = false, @SimpleName = "BlueBall", @Static = false, @TopLevel = false, @Visibility = Visibility.V_PACKAGE]
| +- ModifierList[@EffectiveModifiers = "{final}", @ExplicitModifiers = "{final}"]
| +- ExtendsList[@Empty = false, @Size = 1]
| | +- ClassType[@FullyQualified = false, @SimpleName = "Ball"]
| +- ClassBody[@Empty = true, @Size = 0]
- +- ClassDeclaration[@Abstract = false, @Annotation = false, @Anonymous = false, @BinaryName = "Jep443_UnamedPatternsAndVariables$GreenBall", @CanonicalName = "Jep443_UnamedPatternsAndVariables.GreenBall", @EffectiveVisibility = Visibility.V_PACKAGE, @Enum = false, @Final = true, @Interface = false, @Local = false, @Nested = true, @PackageName = "", @Record = false, @RegularClass = true, @RegularInterface = false, @SimpleName = "GreenBall", @Static = false, @TopLevel = false, @Visibility = Visibility.V_PACKAGE]
+ +- ClassDeclaration[@Abstract = false, @Annotation = false, @Anonymous = false, @BinaryName = "Jep456_UnamedPatternsAndVariables$GreenBall", @CanonicalName = "Jep456_UnamedPatternsAndVariables.GreenBall", @EffectiveVisibility = Visibility.V_PACKAGE, @Enum = false, @Final = true, @Interface = false, @Local = false, @Nested = true, @PackageName = "", @Record = false, @RegularClass = true, @RegularInterface = false, @SimpleName = "GreenBall", @Static = false, @TopLevel = false, @Visibility = Visibility.V_PACKAGE]
| +- ModifierList[@EffectiveModifiers = "{final}", @ExplicitModifiers = "{final}"]
| +- ExtendsList[@Empty = false, @Size = 1]
| | +- ClassType[@FullyQualified = false, @SimpleName = "Ball"]
| +- ClassBody[@Empty = true, @Size = 0]
- +- RecordDeclaration[@Abstract = false, @Annotation = false, @Anonymous = false, @BinaryName = "Jep443_UnamedPatternsAndVariables$Box", @CanonicalName = "Jep443_UnamedPatternsAndVariables.Box", @EffectiveVisibility = Visibility.V_PACKAGE, @Enum = false, @Final = true, @Interface = false, @Local = false, @Nested = true, @PackageName = "", @Record = true, @RegularClass = false, @RegularInterface = false, @SimpleName = "Box", @Static = true, @TopLevel = false, @Visibility = Visibility.V_PACKAGE]
+ +- RecordDeclaration[@Abstract = false, @Annotation = false, @Anonymous = false, @BinaryName = "Jep456_UnamedPatternsAndVariables$Box", @CanonicalName = "Jep456_UnamedPatternsAndVariables.Box", @EffectiveVisibility = Visibility.V_PACKAGE, @Enum = false, @Final = true, @Interface = false, @Local = false, @Nested = true, @PackageName = "", @Record = true, @RegularClass = false, @RegularInterface = false, @SimpleName = "Box", @Static = true, @TopLevel = false, @Visibility = Visibility.V_PACKAGE]
| +- ModifierList[@EffectiveModifiers = "{static, final}", @ExplicitModifiers = "{}"]
| +- TypeParameters[@Empty = false, @Size = 1]
| | +- TypeParameter[@Image = "T", @Name = "T", @TypeBound = true]
@@ -316,7 +316,7 @@
| +- VoidType[]
| +- FormalParameters[@Empty = true, @Size = 0]
| +- Block[@Empty = true, @Size = 0, @containsComment = false]
- +- ClassDeclaration[@Abstract = false, @Annotation = false, @Anonymous = false, @BinaryName = "Jep443_UnamedPatternsAndVariables$Order", @CanonicalName = "Jep443_UnamedPatternsAndVariables.Order", @EffectiveVisibility = Visibility.V_PACKAGE, @Enum = false, @Final = false, @Interface = false, @Local = false, @Nested = true, @PackageName = "", @Record = false, @RegularClass = true, @RegularInterface = false, @SimpleName = "Order", @Static = false, @TopLevel = false, @Visibility = Visibility.V_PACKAGE]
+ +- ClassDeclaration[@Abstract = false, @Annotation = false, @Anonymous = false, @BinaryName = "Jep456_UnamedPatternsAndVariables$Order", @CanonicalName = "Jep456_UnamedPatternsAndVariables.Order", @EffectiveVisibility = Visibility.V_PACKAGE, @Enum = false, @Final = false, @Interface = false, @Local = false, @Nested = true, @PackageName = "", @Record = false, @RegularClass = true, @RegularInterface = false, @SimpleName = "Order", @Static = false, @TopLevel = false, @Visibility = Visibility.V_PACKAGE]
| +- ModifierList[@EffectiveModifiers = "{}", @ExplicitModifiers = "{}"]
| +- ClassBody[@Empty = true, @Size = 0]
+- FieldDeclaration[@EffectiveVisibility = Visibility.V_PRIVATE, @Static = true, @Visibility = Visibility.V_PRIVATE]
@@ -491,7 +491,7 @@
| +- ArgumentList[@Empty = false, @Size = 2]
| +- VariableAccess[@AccessType = AccessType.READ, @CompileTimeConstant = false, @Image = "x", @Name = "x", @ParenthesisDepth = 0, @Parenthesized = false]
| +- NumericLiteral[@Base = 10, @CompileTimeConstant = true, @DoubleLiteral = false, @FloatLiteral = false, @Image = "0", @IntLiteral = true, @Integral = true, @LiteralText = "0", @LongLiteral = false, @ParenthesisDepth = 0, @Parenthesized = false, @ValueAsDouble = 0.0, @ValueAsFloat = 0.0, @ValueAsInt = 0, @ValueAsLong = 0]
- +- ClassDeclaration[@Abstract = false, @Annotation = false, @Anonymous = false, @BinaryName = "Jep443_UnamedPatternsAndVariables$ScopedContext", @CanonicalName = "Jep443_UnamedPatternsAndVariables.ScopedContext", @EffectiveVisibility = Visibility.V_PACKAGE, @Enum = false, @Final = false, @Interface = false, @Local = false, @Nested = true, @PackageName = "", @Record = false, @RegularClass = true, @RegularInterface = false, @SimpleName = "ScopedContext", @Static = true, @TopLevel = false, @Visibility = Visibility.V_PACKAGE]
+ +- ClassDeclaration[@Abstract = false, @Annotation = false, @Anonymous = false, @BinaryName = "Jep456_UnamedPatternsAndVariables$ScopedContext", @CanonicalName = "Jep456_UnamedPatternsAndVariables.ScopedContext", @EffectiveVisibility = Visibility.V_PACKAGE, @Enum = false, @Final = false, @Interface = false, @Local = false, @Nested = true, @PackageName = "", @Record = false, @RegularClass = true, @RegularInterface = false, @SimpleName = "ScopedContext", @Static = true, @TopLevel = false, @Visibility = Visibility.V_PACKAGE]
| +- ModifierList[@EffectiveModifiers = "{static}", @ExplicitModifiers = "{static}"]
| +- ImplementsList[@Empty = false, @Size = 1]
| | +- ClassType[@FullyQualified = false, @SimpleName = "AutoCloseable"]
diff --git a/pmd-java/src/test/resources/net/sourceforge/pmd/lang/java/ast/jdkversiontests/java22p/Jep443_UnnamedPatternsAndVariables2.java b/pmd-java/src/test/resources/net/sourceforge/pmd/lang/java/ast/jdkversiontests/java22p/Jep443_UnnamedPatternsAndVariables2.java
deleted file mode 100644
index 7d690d41e5..0000000000
--- a/pmd-java/src/test/resources/net/sourceforge/pmd/lang/java/ast/jdkversiontests/java22p/Jep443_UnnamedPatternsAndVariables2.java
+++ /dev/null
@@ -1,26 +0,0 @@
-/*
- * BSD-style license; for more info see http://pmd.sourceforge.net/license.html
- */
-
-
-import java.util.ArrayDeque;
-import java.util.List;
-import java.util.Queue;
-import java.util.stream.Collectors;
-
-/**
- * @see JEP 443: Unnamed Patterns and Variables (Preview)
- */
-class Jep443_UnamedPatternsAndVariables2 {
- record Point(int x, int y) { }
- enum Color { RED, GREEN, BLUE }
- record ColoredPoint(Point p, Color c) { }
-
- void unnamedPatterns1() {
- ColoredPoint r = new ColoredPoint(new Point(3,4), Color.GREEN);
-
- if (r instanceof ColoredPoint(Point(int x, int y), _)) {
- System.out.println(x + " " + y);
- }
- }
-}