diff --git a/docs/pages/pmd/languages/java.md b/docs/pages/pmd/languages/java.md
index 477406fa08..fded9847ac 100644
--- a/docs/pages/pmd/languages/java.md
+++ b/docs/pages/pmd/languages/java.md
@@ -9,8 +9,10 @@ Usually the latest non-preview Java Version is the default version.
| Java Version | Alias | Supported by PMD since |
|--------------|-------|------------------------|
+| 20-preview | | 6.55.0 |
+| 20 (default) | | 6.55.0 |
| 19-preview | | 6.48.0 |
-| 19 (default) | | 6.48.0 |
+| 19 | | 6.48.0 |
| 18-preview | | 6.44.0 |
| 18 | | 6.44.0 |
| 17 | | 6.37.0 |
@@ -32,13 +34,14 @@ Usually the latest non-preview Java Version is the default version.
## Using Java preview features
In order to analyze a project with PMD that uses preview language features, you'll need to enable
-it via the environment variable `PMD_JAVA_OPTS` and select the new language version, e.g. `19-preview`:
+it via the environment variable `PMD_JAVA_OPTS` and select the new language version, e.g. `20-preview`:
export PMD_JAVA_OPTS=--enable-preview
- ./run.sh pmd --use-version java-19-preview ...
+ ./run.sh pmd --use-version java-20-preview ...
Note: we only support preview language features for the latest two java versions.
-Note: `--use-version` is only supported since PMD 6.52.0. Older versions of PMD use two CLI options that have to be specified together: `-language java -version 19-preview`.
+Note: `--use-version` is only supported since PMD 6.52.0. Older versions of PMD use two CLI options that have to
+be specified together: `-language java -version 20-preview`.
diff --git a/docs/pages/pmd/userdocs/tools/ant.md b/docs/pages/pmd/userdocs/tools/ant.md
index 9cf33b6564..5b750dc99a 100644
--- a/docs/pages/pmd/userdocs/tools/ant.md
+++ b/docs/pages/pmd/userdocs/tools/ant.md
@@ -248,8 +248,10 @@ nested element. Possible values are:
-
+
+
+
diff --git a/pmd-java/etc/grammar/Java.jjt b/pmd-java/etc/grammar/Java.jjt
index 0cd718f87b..8130c4409d 100644
--- a/pmd-java/etc/grammar/Java.jjt
+++ b/pmd-java/etc/grammar/Java.jjt
@@ -542,24 +542,24 @@ public class JavaParser {
}
private boolean isJEP406Supported() {
- return (jdkVersion == 18 || jdkVersion == 19) && preview;
+ return (jdkVersion == 18 || jdkVersion == 19 || jdkVersion == 20) && preview;
}
private void checkForPatternMatchingInSwitch() {
if (!isJEP406Supported()) {
- throwParseException("Pattern Matching in Switch is only supported with JDK 18 Preview or JDK 19 Preview.");
+ throwParseException("Pattern Matching in Switch is only supported with JDK 18 Preview or JDK 19 Preview or JDK 20 Preview.");
}
}
private void checkForNullCaseLabel() {
if (!isJEP406Supported()) {
- throwParseException("Null case labels in switch are only supported with JDK 18 Preview or JDK 19 Preview.");
+ throwParseException("Null case labels in switch are only supported with JDK 18 Preview or JDK 19 Preview or JDK 20 Preview.");
}
}
private void checkForDefaultCaseLabel() {
if (!isJEP406Supported()) {
- throwParseException("Default case labels in switch are only supported with JDK 18 Preview or JDK 19 Preview.");
+ throwParseException("Default case labels in switch are only supported with JDK 18 Preview or JDK 19 Preview or JDK 20 Preview.");
}
}
@@ -576,14 +576,14 @@ public class JavaParser {
}
private void checkForGuard() {
- if (!((jdkVersion == 19) && preview)) {
- throwParseException("Guards are only supported with JDK 19 Preview.");
+ if (!((jdkVersion == 19 || jdkVersion == 20) && preview)) {
+ throwParseException("Guards are only supported with JDK 19 Preview or JDK 20 Preview.");
}
}
private void checkForRecordPatterns() {
- if (!((jdkVersion == 19) && preview)) {
- throwParseException("Record Patterns are only supported with JDK 19 Preview.");
+ if (!((jdkVersion == 19 || jdkVersion == 20) && preview)) {
+ throwParseException("Record Patterns are only supported with JDK 19 Preview or JDK 20 Preview.");
}
}
diff --git a/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/JavaLanguageModule.java b/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/JavaLanguageModule.java
index 5a75b18018..854089f127 100644
--- a/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/JavaLanguageModule.java
+++ b/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/JavaLanguageModule.java
@@ -33,8 +33,10 @@ public class JavaLanguageModule extends BaseLanguageModule {
addVersion("17", new JavaLanguageHandler(17));
addVersion("18", new JavaLanguageHandler(18));
addVersion("18-preview", new JavaLanguageHandler(18, true));
- addDefaultVersion("19", new JavaLanguageHandler(19)); // 19 is the default
+ addVersion("19", new JavaLanguageHandler(19));
addVersion("19-preview", new JavaLanguageHandler(19, true));
+ addDefaultVersion("20", new JavaLanguageHandler(20)); // 20 is the default
+ addVersion("20-preview", new JavaLanguageHandler(20, true));
}
}
diff --git a/pmd-java/src/test/java/net/sourceforge/pmd/lang/java/ast/Java18PreviewTreeDumpTest.java b/pmd-java/src/test/java/net/sourceforge/pmd/lang/java/ast/Java18PreviewTreeDumpTest.java
index 26647b33f9..4fd64f2a78 100644
--- a/pmd-java/src/test/java/net/sourceforge/pmd/lang/java/ast/Java18PreviewTreeDumpTest.java
+++ b/pmd-java/src/test/java/net/sourceforge/pmd/lang/java/ast/Java18PreviewTreeDumpTest.java
@@ -38,7 +38,7 @@ public class Java18PreviewTreeDumpTest extends BaseTreeDumpTest {
}
});
Assert.assertTrue("Unexpected message: " + thrown.getMessage(),
- thrown.getMessage().contains("Null case labels in switch are only supported with JDK 18 Preview or JDK 19 Preview."));
+ thrown.getMessage().contains("Null case labels in switch are only supported with JDK 18 Preview or JDK 19 Preview or JDK 20 Preview."));
}
@Test
@@ -82,7 +82,7 @@ public class Java18PreviewTreeDumpTest extends BaseTreeDumpTest {
}
});
Assert.assertTrue("Unexpected message: " + thrown.getMessage(),
- thrown.getMessage().contains("Pattern Matching in Switch is only supported with JDK 18 Preview or JDK 19 Preview."));
+ thrown.getMessage().contains("Pattern Matching in Switch is only supported with JDK 18 Preview or JDK 19 Preview or JDK 20 Preview."));
}
@Test
diff --git a/pmd-java/src/test/java/net/sourceforge/pmd/lang/java/ast/Java19PreviewTreeDumpTest.java b/pmd-java/src/test/java/net/sourceforge/pmd/lang/java/ast/Java19PreviewTreeDumpTest.java
index 1e8c80cd5d..b64919ab61 100644
--- a/pmd-java/src/test/java/net/sourceforge/pmd/lang/java/ast/Java19PreviewTreeDumpTest.java
+++ b/pmd-java/src/test/java/net/sourceforge/pmd/lang/java/ast/Java19PreviewTreeDumpTest.java
@@ -40,7 +40,7 @@ public class Java19PreviewTreeDumpTest extends BaseTreeDumpTest {
}
});
assertTrue("Unexpected message: " + thrown.getMessage(),
- thrown.getMessage().contains("Null case labels in switch are only supported with JDK 18 Preview or JDK 19 Preview."));
+ thrown.getMessage().contains("Null case labels in switch are only supported with JDK 18 Preview or JDK 19 Preview or JDK 20 Preview."));
}
@Test
@@ -67,7 +67,7 @@ public class Java19PreviewTreeDumpTest extends BaseTreeDumpTest {
}
});
assertTrue("Unexpected message: " + thrown.getMessage(),
- thrown.getMessage().contains("Pattern Matching in Switch is only supported with JDK 18 Preview or JDK 19 Preview."));
+ thrown.getMessage().contains("Pattern Matching in Switch is only supported with JDK 18 Preview or JDK 19 Preview or JDK 20 Preview."));
}
@Test
@@ -84,7 +84,7 @@ public class Java19PreviewTreeDumpTest extends BaseTreeDumpTest {
}
});
assertTrue("Unexpected message: " + thrown.getMessage(),
- thrown.getMessage().contains("Pattern Matching in Switch is only supported with JDK 18 Preview or JDK 19 Preview."));
+ thrown.getMessage().contains("Pattern Matching in Switch is only supported with JDK 18 Preview or JDK 19 Preview or JDK 20 Preview."));
}
@Test
@@ -116,6 +116,6 @@ public class Java19PreviewTreeDumpTest extends BaseTreeDumpTest {
}
});
assertTrue("Unexpected message: " + thrown.getMessage(),
- thrown.getMessage().contains("Record Patterns are only supported with JDK 19 Preview."));
+ thrown.getMessage().contains("Record Patterns are only supported with JDK 19 Preview or JDK 20 Preview."));
}
}
diff --git a/pmd-java/src/test/java/net/sourceforge/pmd/lang/java/ast/Java20PreviewTreeDumpTest.java b/pmd-java/src/test/java/net/sourceforge/pmd/lang/java/ast/Java20PreviewTreeDumpTest.java
new file mode 100644
index 0000000000..00bded708a
--- /dev/null
+++ b/pmd-java/src/test/java/net/sourceforge/pmd/lang/java/ast/Java20PreviewTreeDumpTest.java
@@ -0,0 +1,121 @@
+/*
+ * BSD-style license; for more info see http://pmd.sourceforge.net/license.html
+ */
+
+package net.sourceforge.pmd.lang.java.ast;
+
+import static org.junit.Assert.assertThrows;
+import static org.junit.Assert.assertTrue;
+
+import org.junit.Test;
+import org.junit.function.ThrowingRunnable;
+
+import net.sourceforge.pmd.lang.ast.ParseException;
+import net.sourceforge.pmd.lang.ast.test.BaseParsingHelper;
+import net.sourceforge.pmd.lang.ast.test.BaseTreeDumpTest;
+import net.sourceforge.pmd.lang.ast.test.RelevantAttributePrinter;
+import net.sourceforge.pmd.lang.java.JavaParsingHelper;
+
+public class Java20PreviewTreeDumpTest extends BaseTreeDumpTest {
+ private final JavaParsingHelper java20p =
+ JavaParsingHelper.WITH_PROCESSING.withDefaultVersion("20-preview")
+ .withResourceContext(Java20PreviewTreeDumpTest.class, "jdkversiontests/java20p/");
+ private final JavaParsingHelper java20 = java20p.withDefaultVersion("19");
+
+ public Java20PreviewTreeDumpTest() {
+ super(new RelevantAttributePrinter(), ".java");
+ }
+
+ @Override
+ public BaseParsingHelper, ?> getParser() {
+ return java20p;
+ }
+
+ @Test
+ public void dealingWithNullBeforeJava20Preview() {
+ ParseException thrown = assertThrows(ParseException.class, new ThrowingRunnable() {
+ @Override
+ public void run() throws Throwable {
+ java20.parseResource("DealingWithNull.java");
+ }
+ });
+ assertTrue("Unexpected message: " + thrown.getMessage(),
+ thrown.getMessage().contains("Null case labels in switch are only supported with JDK 18 Preview or JDK 19 Preview or JDK 20 Preview."));
+ }
+
+ @Test
+ public void dealingWithNull() {
+ doTest("DealingWithNull");
+ }
+
+ @Test
+ public void enhancedTypeCheckingSwitch() {
+ doTest("EnhancedTypeCheckingSwitch");
+ }
+
+ @Test
+ public void exhaustiveSwitch() {
+ doTest("ExhaustiveSwitch");
+ }
+
+ @Test
+ public void guardedAndParenthesizedPatternsBeforeJava19Preview() {
+ ParseException thrown = assertThrows(ParseException.class, new ThrowingRunnable() {
+ @Override
+ public void run() throws Throwable {
+ java20.parseResource("GuardedAndParenthesizedPatterns.java");
+ }
+ });
+ assertTrue("Unexpected message: " + thrown.getMessage(),
+ thrown.getMessage().contains("Pattern Matching in Switch is only supported with JDK 18 Preview or JDK 19 Preview or JDK 20 Preview."));
+ }
+
+ @Test
+ public void guardedAndParenthesizedPatterns() {
+ doTest("GuardedAndParenthesizedPatterns");
+ }
+
+ @Test
+ public void patternsInSwitchLabelsBeforeJava19Preview() {
+ ParseException thrown = assertThrows(ParseException.class, new ThrowingRunnable() {
+ @Override
+ public void run() throws Throwable {
+ java20.parseResource("PatternsInSwitchLabels.java");
+ }
+ });
+ assertTrue("Unexpected message: " + thrown.getMessage(),
+ thrown.getMessage().contains("Pattern Matching in Switch is only supported with JDK 18 Preview or JDK 19 Preview or JDK 20 Preview."));
+ }
+
+ @Test
+ public void patternsInSwitchLabels() {
+ doTest("PatternsInSwitchLabels");
+ }
+
+ @Test
+ public void refiningPatternsInSwitch() {
+ doTest("RefiningPatternsInSwitch");
+ }
+
+ @Test
+ public void scopeOfPatternVariableDeclarations() {
+ doTest("ScopeOfPatternVariableDeclarations");
+ }
+
+ @Test
+ public void recordPatterns() {
+ doTest("RecordPatterns");
+ }
+
+ @Test
+ public void recordPatternsBeforeJava19Preview() {
+ ParseException thrown = assertThrows(ParseException.class, new ThrowingRunnable() {
+ @Override
+ public void run() throws Throwable {
+ java20.parseResource("RecordPatterns.java");
+ }
+ });
+ assertTrue("Unexpected message: " + thrown.getMessage(),
+ thrown.getMessage().contains("Record Patterns are only supported with JDK 19 Preview or JDK 20 Preview."));
+ }
+}
diff --git a/pmd-java/src/test/kotlin/net/sourceforge/pmd/lang/java/ast/KotlinTestingDsl.kt b/pmd-java/src/test/kotlin/net/sourceforge/pmd/lang/java/ast/KotlinTestingDsl.kt
index 631207ee02..d08c744018 100644
--- a/pmd-java/src/test/kotlin/net/sourceforge/pmd/lang/java/ast/KotlinTestingDsl.kt
+++ b/pmd-java/src/test/kotlin/net/sourceforge/pmd/lang/java/ast/KotlinTestingDsl.kt
@@ -27,7 +27,8 @@ enum class JavaVersion : Comparable {
J16,
J17,
J18, J18__PREVIEW,
- J19, J19__PREVIEW;
+ J19, J19__PREVIEW,
+ J20, J20__PREVIEW;
/** Name suitable for use with e.g. [JavaParsingHelper.parse] */
val pmdName: String = name.removePrefix("J").replaceFirst("__", "-").replace('_', '.').lowercase()
diff --git a/pmd-java/src/test/resources/net/sourceforge/pmd/lang/java/ast/jdkversiontests/java20p/DealingWithNull.java b/pmd-java/src/test/resources/net/sourceforge/pmd/lang/java/ast/jdkversiontests/java20p/DealingWithNull.java
new file mode 100644
index 0000000000..990fcc2522
--- /dev/null
+++ b/pmd-java/src/test/resources/net/sourceforge/pmd/lang/java/ast/jdkversiontests/java20p/DealingWithNull.java
@@ -0,0 +1,90 @@
+/*
+ * BSD-style license; for more info see http://pmd.sourceforge.net/license.html
+ */
+
+/**
+ * @see JEP 427: Pattern Matching for switch (Third Preview)
+ */
+public class DealingWithNull {
+
+ static void testFooBar(String s) {
+ switch (s) {
+ case null -> System.out.println("Oops");
+ case "Foo", "Bar" -> System.out.println("Great");
+ default -> System.out.println("Ok");
+ }
+ }
+
+ static void testStringOrNull(Object o) {
+ switch (o) {
+ case null, String s -> System.out.println("String: " + s);
+ case default -> System.out.print("default case");
+ }
+ }
+
+ static void test(Object o) {
+ switch (o) {
+ case null -> System.out.println("null!");
+ case String s -> System.out.println("String");
+ default -> System.out.println("Something else");
+ }
+ }
+
+
+ static void test2(Object o) {
+ switch (o) {
+ case null -> throw new NullPointerException();
+ case String s -> System.out.println("String: "+s);
+ case Integer i -> System.out.println("Integer");
+ default -> System.out.println("default");
+ }
+ }
+
+
+ static void test3(Object o) {
+ switch(o) {
+ case null: case String s:
+ System.out.println("String, including null");
+ break;
+ default:
+ System.out.println("default case");
+ break;
+ }
+
+ switch(o) {
+ case null, String s -> System.out.println("String, including null");
+ default -> System.out.println("default case");
+ }
+
+ switch(o) {
+ case null: default:
+ System.out.println("The rest (including null)");
+ }
+
+ switch(o) {
+ case null, default ->
+ System.out.println("The rest (including null)");
+ }
+ }
+
+ public static void main(String[] args) {
+ test("test");
+ test2(2);
+ try {
+ test2(null);
+ } catch (NullPointerException e) {
+ System.out.println(e);
+ }
+ test3(3);
+ test3("test");
+ test3(null);
+
+ testFooBar(null);
+ testFooBar("Foo");
+ testFooBar("Bar");
+ testFooBar("baz");
+
+ testStringOrNull(null);
+ testStringOrNull("some string");
+ }
+}
diff --git a/pmd-java/src/test/resources/net/sourceforge/pmd/lang/java/ast/jdkversiontests/java20p/DealingWithNull.txt b/pmd-java/src/test/resources/net/sourceforge/pmd/lang/java/ast/jdkversiontests/java20p/DealingWithNull.txt
new file mode 100644
index 0000000000..de92235cf5
--- /dev/null
+++ b/pmd-java/src/test/resources/net/sourceforge/pmd/lang/java/ast/jdkversiontests/java20p/DealingWithNull.txt
@@ -0,0 +1,637 @@
++- CompilationUnit[@PackageName = "", @declarationsAreInDefaultPackage = true]
+ +- TypeDeclaration[]
+ +- ClassOrInterfaceDeclaration[@Abstract = false, @BinaryName = "DealingWithNull", @Default = false, @Final = false, @Image = "DealingWithNull", @Interface = false, @Local = false, @Modifiers = 1, @Native = false, @Nested = false, @NonSealed = false, @PackagePrivate = false, @Private = false, @Protected = false, @Public = true, @Sealed = false, @SimpleName = "DealingWithNull", @Static = false, @Strictfp = false, @Synchronized = false, @Transient = false, @TypeKind = TypeKind.CLASS, @Volatile = false]
+ +- ClassOrInterfaceBody[@AnonymousInnerClass = false, @EnumChild = false]
+ +- ClassOrInterfaceBodyDeclaration[@AnonymousInnerClass = false, @EnumChild = false, @Kind = DeclarationKind.METHOD]
+ | +- MethodDeclaration[@Abstract = false, @Arity = 1, @Default = false, @Final = false, @InterfaceMember = false, @Kind = MethodLikeKind.METHOD, @MethodName = "testFooBar", @Modifiers = 16, @Name = "testFooBar", @Native = false, @PackagePrivate = true, @Private = false, @Protected = false, @Public = false, @Static = true, @Strictfp = false, @Synchronized = false, @SyntacticallyAbstract = false, @SyntacticallyPublic = false, @Transient = false, @Void = true, @Volatile = false]
+ | +- ResultType[@Void = true, @returnsArray = false]
+ | +- MethodDeclarator[@Image = "testFooBar", @ParameterCount = 1]
+ | | +- FormalParameters[@ParameterCount = 1, @Size = 1]
+ | | +- FormalParameter[@Abstract = false, @Array = false, @ArrayDepth = 0, @Default = false, @ExplicitReceiverParameter = false, @Final = false, @Modifiers = 0, @Native = false, @PackagePrivate = true, @Private = false, @Protected = false, @Public = false, @Static = false, @Strictfp = false, @Synchronized = false, @Transient = false, @TypeInferred = false, @Varargs = false, @Volatile = false]
+ | | +- Type[@Array = false, @ArrayDepth = 0, @ArrayType = false, @TypeImage = "String"]
+ | | | +- ReferenceType[@Array = false, @ArrayDepth = 0]
+ | | | +- ClassOrInterfaceType[@AnonymousClass = false, @Array = false, @ArrayDepth = 0, @Image = "String", @ReferenceToClassSameCompilationUnit = false]
+ | | +- VariableDeclaratorId[@Array = false, @ArrayDepth = 0, @ArrayType = false, @ExceptionBlockParameter = false, @ExplicitReceiverParameter = false, @Field = false, @Final = false, @ForeachVariable = false, @FormalParameter = true, @Image = "s", @LambdaParameter = false, @LocalVariable = false, @Name = "s", @PatternBinding = false, @ResourceDeclaration = false, @TypeInferred = false, @VariableName = "s"]
+ | +- Block[@containsComment = false]
+ | +- BlockStatement[@Allocation = false]
+ | +- Statement[]
+ | +- SwitchStatement[@DefaultCase = true, @ExhaustiveEnumSwitch = false, @FallthroughSwitch = false]
+ | +- Expression[@StandAlonePrimitive = false]
+ | | +- PrimaryExpression[]
+ | | +- PrimaryPrefix[@SuperModifier = false, @ThisModifier = false]
+ | | +- Name[@Image = "s"]
+ | +- SwitchLabeledExpression[]
+ | | +- SwitchLabel[@Default = false]
+ | | | +- Expression[@StandAlonePrimitive = false]
+ | | | +- PrimaryExpression[]
+ | | | +- PrimaryPrefix[@SuperModifier = false, @ThisModifier = false]
+ | | | +- Literal[@CharLiteral = false, @DoubleLiteral = false, @EscapedStringLiteral = null, @FloatLiteral = false, @IntLiteral = false, @LongLiteral = false, @SingleCharacterStringLiteral = false, @StringLiteral = false, @TextBlock = false, @TextBlockContent = null, @ValueAsDouble = NaN, @ValueAsFloat = NaN, @ValueAsInt = 0, @ValueAsLong = 0]
+ | | | +- NullLiteral[]
+ | | +- Expression[@StandAlonePrimitive = false]
+ | | +- PrimaryExpression[]
+ | | +- PrimaryPrefix[@SuperModifier = false, @ThisModifier = false]
+ | | | +- Name[@Image = "System.out.println"]
+ | | +- PrimarySuffix[@ArgumentCount = 1, @Arguments = true, @ArrayDereference = false]
+ | | +- Arguments[@ArgumentCount = 1, @Size = 1]
+ | | +- ArgumentList[@Size = 1]
+ | | +- Expression[@StandAlonePrimitive = false]
+ | | +- PrimaryExpression[]
+ | | +- PrimaryPrefix[@SuperModifier = false, @ThisModifier = false]
+ | | +- Literal[@CharLiteral = false, @DoubleLiteral = false, @EscapedStringLiteral = "\"Oops\"", @FloatLiteral = false, @Image = "\"Oops\"", @IntLiteral = false, @LongLiteral = false, @SingleCharacterStringLiteral = false, @StringLiteral = true, @TextBlock = false, @TextBlockContent = "\"Oops\"", @ValueAsDouble = NaN, @ValueAsFloat = NaN, @ValueAsInt = 0, @ValueAsLong = 0]
+ | +- SwitchLabeledExpression[]
+ | | +- SwitchLabel[@Default = false]
+ | | | +- Expression[@StandAlonePrimitive = false]
+ | | | | +- PrimaryExpression[]
+ | | | | +- PrimaryPrefix[@SuperModifier = false, @ThisModifier = false]
+ | | | | +- Literal[@CharLiteral = false, @DoubleLiteral = false, @EscapedStringLiteral = "\"Foo\"", @FloatLiteral = false, @Image = "\"Foo\"", @IntLiteral = false, @LongLiteral = false, @SingleCharacterStringLiteral = false, @StringLiteral = true, @TextBlock = false, @TextBlockContent = "\"Foo\"", @ValueAsDouble = NaN, @ValueAsFloat = NaN, @ValueAsInt = 0, @ValueAsLong = 0]
+ | | | +- Expression[@StandAlonePrimitive = false]
+ | | | +- PrimaryExpression[]
+ | | | +- PrimaryPrefix[@SuperModifier = false, @ThisModifier = false]
+ | | | +- Literal[@CharLiteral = false, @DoubleLiteral = false, @EscapedStringLiteral = "\"Bar\"", @FloatLiteral = false, @Image = "\"Bar\"", @IntLiteral = false, @LongLiteral = false, @SingleCharacterStringLiteral = false, @StringLiteral = true, @TextBlock = false, @TextBlockContent = "\"Bar\"", @ValueAsDouble = NaN, @ValueAsFloat = NaN, @ValueAsInt = 0, @ValueAsLong = 0]
+ | | +- Expression[@StandAlonePrimitive = false]
+ | | +- PrimaryExpression[]
+ | | +- PrimaryPrefix[@SuperModifier = false, @ThisModifier = false]
+ | | | +- Name[@Image = "System.out.println"]
+ | | +- PrimarySuffix[@ArgumentCount = 1, @Arguments = true, @ArrayDereference = false]
+ | | +- Arguments[@ArgumentCount = 1, @Size = 1]
+ | | +- ArgumentList[@Size = 1]
+ | | +- Expression[@StandAlonePrimitive = false]
+ | | +- PrimaryExpression[]
+ | | +- PrimaryPrefix[@SuperModifier = false, @ThisModifier = false]
+ | | +- Literal[@CharLiteral = false, @DoubleLiteral = false, @EscapedStringLiteral = "\"Great\"", @FloatLiteral = false, @Image = "\"Great\"", @IntLiteral = false, @LongLiteral = false, @SingleCharacterStringLiteral = false, @StringLiteral = true, @TextBlock = false, @TextBlockContent = "\"Great\"", @ValueAsDouble = NaN, @ValueAsFloat = NaN, @ValueAsInt = 0, @ValueAsLong = 0]
+ | +- SwitchLabeledExpression[]
+ | +- SwitchLabel[@Default = true]
+ | +- Expression[@StandAlonePrimitive = false]
+ | +- PrimaryExpression[]
+ | +- PrimaryPrefix[@SuperModifier = false, @ThisModifier = false]
+ | | +- Name[@Image = "System.out.println"]
+ | +- PrimarySuffix[@ArgumentCount = 1, @Arguments = true, @ArrayDereference = false]
+ | +- Arguments[@ArgumentCount = 1, @Size = 1]
+ | +- ArgumentList[@Size = 1]
+ | +- Expression[@StandAlonePrimitive = false]
+ | +- PrimaryExpression[]
+ | +- PrimaryPrefix[@SuperModifier = false, @ThisModifier = false]
+ | +- Literal[@CharLiteral = false, @DoubleLiteral = false, @EscapedStringLiteral = "\"Ok\"", @FloatLiteral = false, @Image = "\"Ok\"", @IntLiteral = false, @LongLiteral = false, @SingleCharacterStringLiteral = false, @StringLiteral = true, @TextBlock = false, @TextBlockContent = "\"Ok\"", @ValueAsDouble = NaN, @ValueAsFloat = NaN, @ValueAsInt = 0, @ValueAsLong = 0]
+ +- ClassOrInterfaceBodyDeclaration[@AnonymousInnerClass = false, @EnumChild = false, @Kind = DeclarationKind.METHOD]
+ | +- MethodDeclaration[@Abstract = false, @Arity = 1, @Default = false, @Final = false, @InterfaceMember = false, @Kind = MethodLikeKind.METHOD, @MethodName = "testStringOrNull", @Modifiers = 16, @Name = "testStringOrNull", @Native = false, @PackagePrivate = true, @Private = false, @Protected = false, @Public = false, @Static = true, @Strictfp = false, @Synchronized = false, @SyntacticallyAbstract = false, @SyntacticallyPublic = false, @Transient = false, @Void = true, @Volatile = false]
+ | +- ResultType[@Void = true, @returnsArray = false]
+ | +- MethodDeclarator[@Image = "testStringOrNull", @ParameterCount = 1]
+ | | +- FormalParameters[@ParameterCount = 1, @Size = 1]
+ | | +- FormalParameter[@Abstract = false, @Array = false, @ArrayDepth = 0, @Default = false, @ExplicitReceiverParameter = false, @Final = false, @Modifiers = 0, @Native = false, @PackagePrivate = true, @Private = false, @Protected = false, @Public = false, @Static = false, @Strictfp = false, @Synchronized = false, @Transient = false, @TypeInferred = false, @Varargs = false, @Volatile = false]
+ | | +- Type[@Array = false, @ArrayDepth = 0, @ArrayType = false, @TypeImage = "Object"]
+ | | | +- ReferenceType[@Array = false, @ArrayDepth = 0]
+ | | | +- ClassOrInterfaceType[@AnonymousClass = false, @Array = false, @ArrayDepth = 0, @Image = "Object", @ReferenceToClassSameCompilationUnit = false]
+ | | +- VariableDeclaratorId[@Array = false, @ArrayDepth = 0, @ArrayType = false, @ExceptionBlockParameter = false, @ExplicitReceiverParameter = false, @Field = false, @Final = false, @ForeachVariable = false, @FormalParameter = true, @Image = "o", @LambdaParameter = false, @LocalVariable = false, @Name = "o", @PatternBinding = false, @ResourceDeclaration = false, @TypeInferred = false, @VariableName = "o"]
+ | +- Block[@containsComment = false]
+ | +- BlockStatement[@Allocation = false]
+ | +- Statement[]
+ | +- SwitchStatement[@DefaultCase = true, @ExhaustiveEnumSwitch = false, @FallthroughSwitch = false]
+ | +- Expression[@StandAlonePrimitive = false]
+ | | +- PrimaryExpression[]
+ | | +- PrimaryPrefix[@SuperModifier = false, @ThisModifier = false]
+ | | +- Name[@Image = "o"]
+ | +- SwitchLabeledExpression[]
+ | | +- SwitchLabel[@Default = false]
+ | | | +- Expression[@StandAlonePrimitive = false]
+ | | | | +- PrimaryExpression[]
+ | | | | +- PrimaryPrefix[@SuperModifier = false, @ThisModifier = false]
+ | | | | +- Literal[@CharLiteral = false, @DoubleLiteral = false, @EscapedStringLiteral = null, @FloatLiteral = false, @IntLiteral = false, @LongLiteral = false, @SingleCharacterStringLiteral = false, @StringLiteral = false, @TextBlock = false, @TextBlockContent = null, @ValueAsDouble = NaN, @ValueAsFloat = NaN, @ValueAsInt = 0, @ValueAsLong = 0]
+ | | | | +- NullLiteral[]
+ | | | +- TypePattern[@ParenthesisDepth = 0]
+ | | | +- Type[@Array = false, @ArrayDepth = 0, @ArrayType = false, @TypeImage = "String"]
+ | | | | +- ReferenceType[@Array = false, @ArrayDepth = 0]
+ | | | | +- ClassOrInterfaceType[@AnonymousClass = false, @Array = false, @ArrayDepth = 0, @Image = "String", @ReferenceToClassSameCompilationUnit = false]
+ | | | +- VariableDeclaratorId[@Array = false, @ArrayDepth = 0, @ArrayType = false, @ExceptionBlockParameter = false, @ExplicitReceiverParameter = false, @Field = false, @Final = false, @ForeachVariable = false, @FormalParameter = false, @Image = "s", @LambdaParameter = false, @LocalVariable = false, @Name = "s", @PatternBinding = true, @ResourceDeclaration = false, @TypeInferred = false, @VariableName = "s"]
+ | | +- Expression[@StandAlonePrimitive = false]
+ | | +- PrimaryExpression[]
+ | | +- PrimaryPrefix[@SuperModifier = false, @ThisModifier = false]
+ | | | +- Name[@Image = "System.out.println"]
+ | | +- PrimarySuffix[@ArgumentCount = 1, @Arguments = true, @ArrayDereference = false]
+ | | +- Arguments[@ArgumentCount = 1, @Size = 1]
+ | | +- ArgumentList[@Size = 1]
+ | | +- Expression[@StandAlonePrimitive = false]
+ | | +- AdditiveExpression[@Image = "+", @Operator = "+"]
+ | | +- PrimaryExpression[]
+ | | | +- PrimaryPrefix[@SuperModifier = false, @ThisModifier = false]
+ | | | +- Literal[@CharLiteral = false, @DoubleLiteral = false, @EscapedStringLiteral = "\"String: \"", @FloatLiteral = false, @Image = "\"String: \"", @IntLiteral = false, @LongLiteral = false, @SingleCharacterStringLiteral = false, @StringLiteral = true, @TextBlock = false, @TextBlockContent = "\"String: \"", @ValueAsDouble = NaN, @ValueAsFloat = NaN, @ValueAsInt = 0, @ValueAsLong = 0]
+ | | +- PrimaryExpression[]
+ | | +- PrimaryPrefix[@SuperModifier = false, @ThisModifier = false]
+ | | +- Name[@Image = "s"]
+ | +- SwitchLabeledExpression[]
+ | +- SwitchLabel[@Default = true]
+ | +- Expression[@StandAlonePrimitive = false]
+ | +- PrimaryExpression[]
+ | +- PrimaryPrefix[@SuperModifier = false, @ThisModifier = false]
+ | | +- Name[@Image = "System.out.print"]
+ | +- PrimarySuffix[@ArgumentCount = 1, @Arguments = true, @ArrayDereference = false]
+ | +- Arguments[@ArgumentCount = 1, @Size = 1]
+ | +- ArgumentList[@Size = 1]
+ | +- Expression[@StandAlonePrimitive = false]
+ | +- PrimaryExpression[]
+ | +- PrimaryPrefix[@SuperModifier = false, @ThisModifier = false]
+ | +- Literal[@CharLiteral = false, @DoubleLiteral = false, @EscapedStringLiteral = "\"default case\"", @FloatLiteral = false, @Image = "\"default case\"", @IntLiteral = false, @LongLiteral = false, @SingleCharacterStringLiteral = false, @StringLiteral = true, @TextBlock = false, @TextBlockContent = "\"default case\"", @ValueAsDouble = NaN, @ValueAsFloat = NaN, @ValueAsInt = 0, @ValueAsLong = 0]
+ +- ClassOrInterfaceBodyDeclaration[@AnonymousInnerClass = false, @EnumChild = false, @Kind = DeclarationKind.METHOD]
+ | +- MethodDeclaration[@Abstract = false, @Arity = 1, @Default = false, @Final = false, @InterfaceMember = false, @Kind = MethodLikeKind.METHOD, @MethodName = "test", @Modifiers = 16, @Name = "test", @Native = false, @PackagePrivate = true, @Private = false, @Protected = false, @Public = false, @Static = true, @Strictfp = false, @Synchronized = false, @SyntacticallyAbstract = false, @SyntacticallyPublic = false, @Transient = false, @Void = true, @Volatile = false]
+ | +- ResultType[@Void = true, @returnsArray = false]
+ | +- MethodDeclarator[@Image = "test", @ParameterCount = 1]
+ | | +- FormalParameters[@ParameterCount = 1, @Size = 1]
+ | | +- FormalParameter[@Abstract = false, @Array = false, @ArrayDepth = 0, @Default = false, @ExplicitReceiverParameter = false, @Final = false, @Modifiers = 0, @Native = false, @PackagePrivate = true, @Private = false, @Protected = false, @Public = false, @Static = false, @Strictfp = false, @Synchronized = false, @Transient = false, @TypeInferred = false, @Varargs = false, @Volatile = false]
+ | | +- Type[@Array = false, @ArrayDepth = 0, @ArrayType = false, @TypeImage = "Object"]
+ | | | +- ReferenceType[@Array = false, @ArrayDepth = 0]
+ | | | +- ClassOrInterfaceType[@AnonymousClass = false, @Array = false, @ArrayDepth = 0, @Image = "Object", @ReferenceToClassSameCompilationUnit = false]
+ | | +- VariableDeclaratorId[@Array = false, @ArrayDepth = 0, @ArrayType = false, @ExceptionBlockParameter = false, @ExplicitReceiverParameter = false, @Field = false, @Final = false, @ForeachVariable = false, @FormalParameter = true, @Image = "o", @LambdaParameter = false, @LocalVariable = false, @Name = "o", @PatternBinding = false, @ResourceDeclaration = false, @TypeInferred = false, @VariableName = "o"]
+ | +- Block[@containsComment = false]
+ | +- BlockStatement[@Allocation = false]
+ | +- Statement[]
+ | +- SwitchStatement[@DefaultCase = true, @ExhaustiveEnumSwitch = false, @FallthroughSwitch = false]
+ | +- Expression[@StandAlonePrimitive = false]
+ | | +- PrimaryExpression[]
+ | | +- PrimaryPrefix[@SuperModifier = false, @ThisModifier = false]
+ | | +- Name[@Image = "o"]
+ | +- SwitchLabeledExpression[]
+ | | +- SwitchLabel[@Default = false]
+ | | | +- Expression[@StandAlonePrimitive = false]
+ | | | +- PrimaryExpression[]
+ | | | +- PrimaryPrefix[@SuperModifier = false, @ThisModifier = false]
+ | | | +- Literal[@CharLiteral = false, @DoubleLiteral = false, @EscapedStringLiteral = null, @FloatLiteral = false, @IntLiteral = false, @LongLiteral = false, @SingleCharacterStringLiteral = false, @StringLiteral = false, @TextBlock = false, @TextBlockContent = null, @ValueAsDouble = NaN, @ValueAsFloat = NaN, @ValueAsInt = 0, @ValueAsLong = 0]
+ | | | +- NullLiteral[]
+ | | +- Expression[@StandAlonePrimitive = false]
+ | | +- PrimaryExpression[]
+ | | +- PrimaryPrefix[@SuperModifier = false, @ThisModifier = false]
+ | | | +- Name[@Image = "System.out.println"]
+ | | +- PrimarySuffix[@ArgumentCount = 1, @Arguments = true, @ArrayDereference = false]
+ | | +- Arguments[@ArgumentCount = 1, @Size = 1]
+ | | +- ArgumentList[@Size = 1]
+ | | +- Expression[@StandAlonePrimitive = false]
+ | | +- PrimaryExpression[]
+ | | +- PrimaryPrefix[@SuperModifier = false, @ThisModifier = false]
+ | | +- Literal[@CharLiteral = false, @DoubleLiteral = false, @EscapedStringLiteral = "\"null!\"", @FloatLiteral = false, @Image = "\"null!\"", @IntLiteral = false, @LongLiteral = false, @SingleCharacterStringLiteral = false, @StringLiteral = true, @TextBlock = false, @TextBlockContent = "\"null!\"", @ValueAsDouble = NaN, @ValueAsFloat = NaN, @ValueAsInt = 0, @ValueAsLong = 0]
+ | +- SwitchLabeledExpression[]
+ | | +- SwitchLabel[@Default = false]
+ | | | +- TypePattern[@ParenthesisDepth = 0]
+ | | | +- Type[@Array = false, @ArrayDepth = 0, @ArrayType = false, @TypeImage = "String"]
+ | | | | +- ReferenceType[@Array = false, @ArrayDepth = 0]
+ | | | | +- ClassOrInterfaceType[@AnonymousClass = false, @Array = false, @ArrayDepth = 0, @Image = "String", @ReferenceToClassSameCompilationUnit = false]
+ | | | +- VariableDeclaratorId[@Array = false, @ArrayDepth = 0, @ArrayType = false, @ExceptionBlockParameter = false, @ExplicitReceiverParameter = false, @Field = false, @Final = false, @ForeachVariable = false, @FormalParameter = false, @Image = "s", @LambdaParameter = false, @LocalVariable = false, @Name = "s", @PatternBinding = true, @ResourceDeclaration = false, @TypeInferred = false, @VariableName = "s"]
+ | | +- Expression[@StandAlonePrimitive = false]
+ | | +- PrimaryExpression[]
+ | | +- PrimaryPrefix[@SuperModifier = false, @ThisModifier = false]
+ | | | +- Name[@Image = "System.out.println"]
+ | | +- PrimarySuffix[@ArgumentCount = 1, @Arguments = true, @ArrayDereference = false]
+ | | +- Arguments[@ArgumentCount = 1, @Size = 1]
+ | | +- ArgumentList[@Size = 1]
+ | | +- Expression[@StandAlonePrimitive = false]
+ | | +- PrimaryExpression[]
+ | | +- PrimaryPrefix[@SuperModifier = false, @ThisModifier = false]
+ | | +- Literal[@CharLiteral = false, @DoubleLiteral = false, @EscapedStringLiteral = "\"String\"", @FloatLiteral = false, @Image = "\"String\"", @IntLiteral = false, @LongLiteral = false, @SingleCharacterStringLiteral = false, @StringLiteral = true, @TextBlock = false, @TextBlockContent = "\"String\"", @ValueAsDouble = NaN, @ValueAsFloat = NaN, @ValueAsInt = 0, @ValueAsLong = 0]
+ | +- SwitchLabeledExpression[]
+ | +- SwitchLabel[@Default = true]
+ | +- Expression[@StandAlonePrimitive = false]
+ | +- PrimaryExpression[]
+ | +- PrimaryPrefix[@SuperModifier = false, @ThisModifier = false]
+ | | +- Name[@Image = "System.out.println"]
+ | +- PrimarySuffix[@ArgumentCount = 1, @Arguments = true, @ArrayDereference = false]
+ | +- Arguments[@ArgumentCount = 1, @Size = 1]
+ | +- ArgumentList[@Size = 1]
+ | +- Expression[@StandAlonePrimitive = false]
+ | +- PrimaryExpression[]
+ | +- PrimaryPrefix[@SuperModifier = false, @ThisModifier = false]
+ | +- Literal[@CharLiteral = false, @DoubleLiteral = false, @EscapedStringLiteral = "\"Something else\"", @FloatLiteral = false, @Image = "\"Something else\"", @IntLiteral = false, @LongLiteral = false, @SingleCharacterStringLiteral = false, @StringLiteral = true, @TextBlock = false, @TextBlockContent = "\"Something else\"", @ValueAsDouble = NaN, @ValueAsFloat = NaN, @ValueAsInt = 0, @ValueAsLong = 0]
+ +- ClassOrInterfaceBodyDeclaration[@AnonymousInnerClass = false, @EnumChild = false, @Kind = DeclarationKind.METHOD]
+ | +- MethodDeclaration[@Abstract = false, @Arity = 1, @Default = false, @Final = false, @InterfaceMember = false, @Kind = MethodLikeKind.METHOD, @MethodName = "test2", @Modifiers = 16, @Name = "test2", @Native = false, @PackagePrivate = true, @Private = false, @Protected = false, @Public = false, @Static = true, @Strictfp = false, @Synchronized = false, @SyntacticallyAbstract = false, @SyntacticallyPublic = false, @Transient = false, @Void = true, @Volatile = false]
+ | +- ResultType[@Void = true, @returnsArray = false]
+ | +- MethodDeclarator[@Image = "test2", @ParameterCount = 1]
+ | | +- FormalParameters[@ParameterCount = 1, @Size = 1]
+ | | +- FormalParameter[@Abstract = false, @Array = false, @ArrayDepth = 0, @Default = false, @ExplicitReceiverParameter = false, @Final = false, @Modifiers = 0, @Native = false, @PackagePrivate = true, @Private = false, @Protected = false, @Public = false, @Static = false, @Strictfp = false, @Synchronized = false, @Transient = false, @TypeInferred = false, @Varargs = false, @Volatile = false]
+ | | +- Type[@Array = false, @ArrayDepth = 0, @ArrayType = false, @TypeImage = "Object"]
+ | | | +- ReferenceType[@Array = false, @ArrayDepth = 0]
+ | | | +- ClassOrInterfaceType[@AnonymousClass = false, @Array = false, @ArrayDepth = 0, @Image = "Object", @ReferenceToClassSameCompilationUnit = false]
+ | | +- VariableDeclaratorId[@Array = false, @ArrayDepth = 0, @ArrayType = false, @ExceptionBlockParameter = false, @ExplicitReceiverParameter = false, @Field = false, @Final = false, @ForeachVariable = false, @FormalParameter = true, @Image = "o", @LambdaParameter = false, @LocalVariable = false, @Name = "o", @PatternBinding = false, @ResourceDeclaration = false, @TypeInferred = false, @VariableName = "o"]
+ | +- Block[@containsComment = false]
+ | +- BlockStatement[@Allocation = true]
+ | +- Statement[]
+ | +- SwitchStatement[@DefaultCase = true, @ExhaustiveEnumSwitch = false, @FallthroughSwitch = false]
+ | +- Expression[@StandAlonePrimitive = false]
+ | | +- PrimaryExpression[]
+ | | +- PrimaryPrefix[@SuperModifier = false, @ThisModifier = false]
+ | | +- Name[@Image = "o"]
+ | +- SwitchLabeledThrowStatement[]
+ | | +- SwitchLabel[@Default = false]
+ | | | +- Expression[@StandAlonePrimitive = false]
+ | | | +- PrimaryExpression[]
+ | | | +- PrimaryPrefix[@SuperModifier = false, @ThisModifier = false]
+ | | | +- Literal[@CharLiteral = false, @DoubleLiteral = false, @EscapedStringLiteral = null, @FloatLiteral = false, @IntLiteral = false, @LongLiteral = false, @SingleCharacterStringLiteral = false, @StringLiteral = false, @TextBlock = false, @TextBlockContent = null, @ValueAsDouble = NaN, @ValueAsFloat = NaN, @ValueAsInt = 0, @ValueAsLong = 0]
+ | | | +- NullLiteral[]
+ | | +- ThrowStatement[@FirstClassOrInterfaceTypeImage = "NullPointerException"]
+ | | +- Expression[@StandAlonePrimitive = false]
+ | | +- PrimaryExpression[]
+ | | +- PrimaryPrefix[@SuperModifier = false, @ThisModifier = false]
+ | | +- AllocationExpression[@AnonymousClass = false]
+ | | +- ClassOrInterfaceType[@AnonymousClass = false, @Array = false, @ArrayDepth = 0, @Image = "NullPointerException", @ReferenceToClassSameCompilationUnit = false]
+ | | +- Arguments[@ArgumentCount = 0, @Size = 0]
+ | +- SwitchLabeledExpression[]
+ | | +- SwitchLabel[@Default = false]
+ | | | +- TypePattern[@ParenthesisDepth = 0]
+ | | | +- Type[@Array = false, @ArrayDepth = 0, @ArrayType = false, @TypeImage = "String"]
+ | | | | +- ReferenceType[@Array = false, @ArrayDepth = 0]
+ | | | | +- ClassOrInterfaceType[@AnonymousClass = false, @Array = false, @ArrayDepth = 0, @Image = "String", @ReferenceToClassSameCompilationUnit = false]
+ | | | +- VariableDeclaratorId[@Array = false, @ArrayDepth = 0, @ArrayType = false, @ExceptionBlockParameter = false, @ExplicitReceiverParameter = false, @Field = false, @Final = false, @ForeachVariable = false, @FormalParameter = false, @Image = "s", @LambdaParameter = false, @LocalVariable = false, @Name = "s", @PatternBinding = true, @ResourceDeclaration = false, @TypeInferred = false, @VariableName = "s"]
+ | | +- Expression[@StandAlonePrimitive = false]
+ | | +- PrimaryExpression[]
+ | | +- PrimaryPrefix[@SuperModifier = false, @ThisModifier = false]
+ | | | +- Name[@Image = "System.out.println"]
+ | | +- PrimarySuffix[@ArgumentCount = 1, @Arguments = true, @ArrayDereference = false]
+ | | +- Arguments[@ArgumentCount = 1, @Size = 1]
+ | | +- ArgumentList[@Size = 1]
+ | | +- Expression[@StandAlonePrimitive = false]
+ | | +- AdditiveExpression[@Image = "+", @Operator = "+"]
+ | | +- PrimaryExpression[]
+ | | | +- PrimaryPrefix[@SuperModifier = false, @ThisModifier = false]
+ | | | +- Literal[@CharLiteral = false, @DoubleLiteral = false, @EscapedStringLiteral = "\"String: \"", @FloatLiteral = false, @Image = "\"String: \"", @IntLiteral = false, @LongLiteral = false, @SingleCharacterStringLiteral = false, @StringLiteral = true, @TextBlock = false, @TextBlockContent = "\"String: \"", @ValueAsDouble = NaN, @ValueAsFloat = NaN, @ValueAsInt = 0, @ValueAsLong = 0]
+ | | +- PrimaryExpression[]
+ | | +- PrimaryPrefix[@SuperModifier = false, @ThisModifier = false]
+ | | +- Name[@Image = "s"]
+ | +- SwitchLabeledExpression[]
+ | | +- SwitchLabel[@Default = false]
+ | | | +- TypePattern[@ParenthesisDepth = 0]
+ | | | +- Type[@Array = false, @ArrayDepth = 0, @ArrayType = false, @TypeImage = "Integer"]
+ | | | | +- ReferenceType[@Array = false, @ArrayDepth = 0]
+ | | | | +- ClassOrInterfaceType[@AnonymousClass = false, @Array = false, @ArrayDepth = 0, @Image = "Integer", @ReferenceToClassSameCompilationUnit = false]
+ | | | +- VariableDeclaratorId[@Array = false, @ArrayDepth = 0, @ArrayType = false, @ExceptionBlockParameter = false, @ExplicitReceiverParameter = false, @Field = false, @Final = false, @ForeachVariable = false, @FormalParameter = false, @Image = "i", @LambdaParameter = false, @LocalVariable = false, @Name = "i", @PatternBinding = true, @ResourceDeclaration = false, @TypeInferred = false, @VariableName = "i"]
+ | | +- Expression[@StandAlonePrimitive = false]
+ | | +- PrimaryExpression[]
+ | | +- PrimaryPrefix[@SuperModifier = false, @ThisModifier = false]
+ | | | +- Name[@Image = "System.out.println"]
+ | | +- PrimarySuffix[@ArgumentCount = 1, @Arguments = true, @ArrayDereference = false]
+ | | +- Arguments[@ArgumentCount = 1, @Size = 1]
+ | | +- ArgumentList[@Size = 1]
+ | | +- Expression[@StandAlonePrimitive = false]
+ | | +- PrimaryExpression[]
+ | | +- PrimaryPrefix[@SuperModifier = false, @ThisModifier = false]
+ | | +- Literal[@CharLiteral = false, @DoubleLiteral = false, @EscapedStringLiteral = "\"Integer\"", @FloatLiteral = false, @Image = "\"Integer\"", @IntLiteral = false, @LongLiteral = false, @SingleCharacterStringLiteral = false, @StringLiteral = true, @TextBlock = false, @TextBlockContent = "\"Integer\"", @ValueAsDouble = NaN, @ValueAsFloat = NaN, @ValueAsInt = 0, @ValueAsLong = 0]
+ | +- SwitchLabeledExpression[]
+ | +- SwitchLabel[@Default = true]
+ | +- Expression[@StandAlonePrimitive = false]
+ | +- PrimaryExpression[]
+ | +- PrimaryPrefix[@SuperModifier = false, @ThisModifier = false]
+ | | +- Name[@Image = "System.out.println"]
+ | +- PrimarySuffix[@ArgumentCount = 1, @Arguments = true, @ArrayDereference = false]
+ | +- Arguments[@ArgumentCount = 1, @Size = 1]
+ | +- ArgumentList[@Size = 1]
+ | +- Expression[@StandAlonePrimitive = false]
+ | +- PrimaryExpression[]
+ | +- PrimaryPrefix[@SuperModifier = false, @ThisModifier = false]
+ | +- Literal[@CharLiteral = false, @DoubleLiteral = false, @EscapedStringLiteral = "\"default\"", @FloatLiteral = false, @Image = "\"default\"", @IntLiteral = false, @LongLiteral = false, @SingleCharacterStringLiteral = false, @StringLiteral = true, @TextBlock = false, @TextBlockContent = "\"default\"", @ValueAsDouble = NaN, @ValueAsFloat = NaN, @ValueAsInt = 0, @ValueAsLong = 0]
+ +- ClassOrInterfaceBodyDeclaration[@AnonymousInnerClass = false, @EnumChild = false, @Kind = DeclarationKind.METHOD]
+ | +- MethodDeclaration[@Abstract = false, @Arity = 1, @Default = false, @Final = false, @InterfaceMember = false, @Kind = MethodLikeKind.METHOD, @MethodName = "test3", @Modifiers = 16, @Name = "test3", @Native = false, @PackagePrivate = true, @Private = false, @Protected = false, @Public = false, @Static = true, @Strictfp = false, @Synchronized = false, @SyntacticallyAbstract = false, @SyntacticallyPublic = false, @Transient = false, @Void = true, @Volatile = false]
+ | +- ResultType[@Void = true, @returnsArray = false]
+ | +- MethodDeclarator[@Image = "test3", @ParameterCount = 1]
+ | | +- FormalParameters[@ParameterCount = 1, @Size = 1]
+ | | +- FormalParameter[@Abstract = false, @Array = false, @ArrayDepth = 0, @Default = false, @ExplicitReceiverParameter = false, @Final = false, @Modifiers = 0, @Native = false, @PackagePrivate = true, @Private = false, @Protected = false, @Public = false, @Static = false, @Strictfp = false, @Synchronized = false, @Transient = false, @TypeInferred = false, @Varargs = false, @Volatile = false]
+ | | +- Type[@Array = false, @ArrayDepth = 0, @ArrayType = false, @TypeImage = "Object"]
+ | | | +- ReferenceType[@Array = false, @ArrayDepth = 0]
+ | | | +- ClassOrInterfaceType[@AnonymousClass = false, @Array = false, @ArrayDepth = 0, @Image = "Object", @ReferenceToClassSameCompilationUnit = false]
+ | | +- VariableDeclaratorId[@Array = false, @ArrayDepth = 0, @ArrayType = false, @ExceptionBlockParameter = false, @ExplicitReceiverParameter = false, @Field = false, @Final = false, @ForeachVariable = false, @FormalParameter = true, @Image = "o", @LambdaParameter = false, @LocalVariable = false, @Name = "o", @PatternBinding = false, @ResourceDeclaration = false, @TypeInferred = false, @VariableName = "o"]
+ | +- Block[@containsComment = false]
+ | +- BlockStatement[@Allocation = false]
+ | | +- Statement[]
+ | | +- SwitchStatement[@DefaultCase = true, @ExhaustiveEnumSwitch = false, @FallthroughSwitch = true]
+ | | +- Expression[@StandAlonePrimitive = false]
+ | | | +- PrimaryExpression[]
+ | | | +- PrimaryPrefix[@SuperModifier = false, @ThisModifier = false]
+ | | | +- Name[@Image = "o"]
+ | | +- SwitchLabel[@Default = false]
+ | | | +- Expression[@StandAlonePrimitive = false]
+ | | | +- PrimaryExpression[]
+ | | | +- PrimaryPrefix[@SuperModifier = false, @ThisModifier = false]
+ | | | +- Literal[@CharLiteral = false, @DoubleLiteral = false, @EscapedStringLiteral = null, @FloatLiteral = false, @IntLiteral = false, @LongLiteral = false, @SingleCharacterStringLiteral = false, @StringLiteral = false, @TextBlock = false, @TextBlockContent = null, @ValueAsDouble = NaN, @ValueAsFloat = NaN, @ValueAsInt = 0, @ValueAsLong = 0]
+ | | | +- NullLiteral[]
+ | | +- SwitchLabel[@Default = false]
+ | | | +- TypePattern[@ParenthesisDepth = 0]
+ | | | +- Type[@Array = false, @ArrayDepth = 0, @ArrayType = false, @TypeImage = "String"]
+ | | | | +- ReferenceType[@Array = false, @ArrayDepth = 0]
+ | | | | +- ClassOrInterfaceType[@AnonymousClass = false, @Array = false, @ArrayDepth = 0, @Image = "String", @ReferenceToClassSameCompilationUnit = false]
+ | | | +- VariableDeclaratorId[@Array = false, @ArrayDepth = 0, @ArrayType = false, @ExceptionBlockParameter = false, @ExplicitReceiverParameter = false, @Field = false, @Final = false, @ForeachVariable = false, @FormalParameter = false, @Image = "s", @LambdaParameter = false, @LocalVariable = false, @Name = "s", @PatternBinding = true, @ResourceDeclaration = false, @TypeInferred = false, @VariableName = "s"]
+ | | +- BlockStatement[@Allocation = false]
+ | | | +- Statement[]
+ | | | +- StatementExpression[]
+ | | | +- PrimaryExpression[]
+ | | | +- PrimaryPrefix[@SuperModifier = false, @ThisModifier = false]
+ | | | | +- Name[@Image = "System.out.println"]
+ | | | +- PrimarySuffix[@ArgumentCount = 1, @Arguments = true, @ArrayDereference = false]
+ | | | +- Arguments[@ArgumentCount = 1, @Size = 1]
+ | | | +- ArgumentList[@Size = 1]
+ | | | +- Expression[@StandAlonePrimitive = false]
+ | | | +- PrimaryExpression[]
+ | | | +- PrimaryPrefix[@SuperModifier = false, @ThisModifier = false]
+ | | | +- Literal[@CharLiteral = false, @DoubleLiteral = false, @EscapedStringLiteral = "\"String, including null\"", @FloatLiteral = false, @Image = "\"String, including null\"", @IntLiteral = false, @LongLiteral = false, @SingleCharacterStringLiteral = false, @StringLiteral = true, @TextBlock = false, @TextBlockContent = "\"String, including null\"", @ValueAsDouble = NaN, @ValueAsFloat = NaN, @ValueAsInt = 0, @ValueAsLong = 0]
+ | | +- BlockStatement[@Allocation = false]
+ | | | +- Statement[]
+ | | | +- BreakStatement[]
+ | | +- SwitchLabel[@Default = true]
+ | | +- BlockStatement[@Allocation = false]
+ | | | +- Statement[]
+ | | | +- StatementExpression[]
+ | | | +- PrimaryExpression[]
+ | | | +- PrimaryPrefix[@SuperModifier = false, @ThisModifier = false]
+ | | | | +- Name[@Image = "System.out.println"]
+ | | | +- PrimarySuffix[@ArgumentCount = 1, @Arguments = true, @ArrayDereference = false]
+ | | | +- Arguments[@ArgumentCount = 1, @Size = 1]
+ | | | +- ArgumentList[@Size = 1]
+ | | | +- Expression[@StandAlonePrimitive = false]
+ | | | +- PrimaryExpression[]
+ | | | +- PrimaryPrefix[@SuperModifier = false, @ThisModifier = false]
+ | | | +- Literal[@CharLiteral = false, @DoubleLiteral = false, @EscapedStringLiteral = "\"default case\"", @FloatLiteral = false, @Image = "\"default case\"", @IntLiteral = false, @LongLiteral = false, @SingleCharacterStringLiteral = false, @StringLiteral = true, @TextBlock = false, @TextBlockContent = "\"default case\"", @ValueAsDouble = NaN, @ValueAsFloat = NaN, @ValueAsInt = 0, @ValueAsLong = 0]
+ | | +- BlockStatement[@Allocation = false]
+ | | +- Statement[]
+ | | +- BreakStatement[]
+ | +- BlockStatement[@Allocation = false]
+ | | +- Statement[]
+ | | +- SwitchStatement[@DefaultCase = true, @ExhaustiveEnumSwitch = false, @FallthroughSwitch = false]
+ | | +- Expression[@StandAlonePrimitive = false]
+ | | | +- PrimaryExpression[]
+ | | | +- PrimaryPrefix[@SuperModifier = false, @ThisModifier = false]
+ | | | +- Name[@Image = "o"]
+ | | +- SwitchLabeledExpression[]
+ | | | +- SwitchLabel[@Default = false]
+ | | | | +- Expression[@StandAlonePrimitive = false]
+ | | | | | +- PrimaryExpression[]
+ | | | | | +- PrimaryPrefix[@SuperModifier = false, @ThisModifier = false]
+ | | | | | +- Literal[@CharLiteral = false, @DoubleLiteral = false, @EscapedStringLiteral = null, @FloatLiteral = false, @IntLiteral = false, @LongLiteral = false, @SingleCharacterStringLiteral = false, @StringLiteral = false, @TextBlock = false, @TextBlockContent = null, @ValueAsDouble = NaN, @ValueAsFloat = NaN, @ValueAsInt = 0, @ValueAsLong = 0]
+ | | | | | +- NullLiteral[]
+ | | | | +- TypePattern[@ParenthesisDepth = 0]
+ | | | | +- Type[@Array = false, @ArrayDepth = 0, @ArrayType = false, @TypeImage = "String"]
+ | | | | | +- ReferenceType[@Array = false, @ArrayDepth = 0]
+ | | | | | +- ClassOrInterfaceType[@AnonymousClass = false, @Array = false, @ArrayDepth = 0, @Image = "String", @ReferenceToClassSameCompilationUnit = false]
+ | | | | +- VariableDeclaratorId[@Array = false, @ArrayDepth = 0, @ArrayType = false, @ExceptionBlockParameter = false, @ExplicitReceiverParameter = false, @Field = false, @Final = false, @ForeachVariable = false, @FormalParameter = false, @Image = "s", @LambdaParameter = false, @LocalVariable = false, @Name = "s", @PatternBinding = true, @ResourceDeclaration = false, @TypeInferred = false, @VariableName = "s"]
+ | | | +- Expression[@StandAlonePrimitive = false]
+ | | | +- PrimaryExpression[]
+ | | | +- PrimaryPrefix[@SuperModifier = false, @ThisModifier = false]
+ | | | | +- Name[@Image = "System.out.println"]
+ | | | +- PrimarySuffix[@ArgumentCount = 1, @Arguments = true, @ArrayDereference = false]
+ | | | +- Arguments[@ArgumentCount = 1, @Size = 1]
+ | | | +- ArgumentList[@Size = 1]
+ | | | +- Expression[@StandAlonePrimitive = false]
+ | | | +- PrimaryExpression[]
+ | | | +- PrimaryPrefix[@SuperModifier = false, @ThisModifier = false]
+ | | | +- Literal[@CharLiteral = false, @DoubleLiteral = false, @EscapedStringLiteral = "\"String, including null\"", @FloatLiteral = false, @Image = "\"String, including null\"", @IntLiteral = false, @LongLiteral = false, @SingleCharacterStringLiteral = false, @StringLiteral = true, @TextBlock = false, @TextBlockContent = "\"String, including null\"", @ValueAsDouble = NaN, @ValueAsFloat = NaN, @ValueAsInt = 0, @ValueAsLong = 0]
+ | | +- SwitchLabeledExpression[]
+ | | +- SwitchLabel[@Default = true]
+ | | +- Expression[@StandAlonePrimitive = false]
+ | | +- PrimaryExpression[]
+ | | +- PrimaryPrefix[@SuperModifier = false, @ThisModifier = false]
+ | | | +- Name[@Image = "System.out.println"]
+ | | +- PrimarySuffix[@ArgumentCount = 1, @Arguments = true, @ArrayDereference = false]
+ | | +- Arguments[@ArgumentCount = 1, @Size = 1]
+ | | +- ArgumentList[@Size = 1]
+ | | +- Expression[@StandAlonePrimitive = false]
+ | | +- PrimaryExpression[]
+ | | +- PrimaryPrefix[@SuperModifier = false, @ThisModifier = false]
+ | | +- Literal[@CharLiteral = false, @DoubleLiteral = false, @EscapedStringLiteral = "\"default case\"", @FloatLiteral = false, @Image = "\"default case\"", @IntLiteral = false, @LongLiteral = false, @SingleCharacterStringLiteral = false, @StringLiteral = true, @TextBlock = false, @TextBlockContent = "\"default case\"", @ValueAsDouble = NaN, @ValueAsFloat = NaN, @ValueAsInt = 0, @ValueAsLong = 0]
+ | +- BlockStatement[@Allocation = false]
+ | | +- Statement[]
+ | | +- SwitchStatement[@DefaultCase = true, @ExhaustiveEnumSwitch = false, @FallthroughSwitch = true]
+ | | +- Expression[@StandAlonePrimitive = false]
+ | | | +- PrimaryExpression[]
+ | | | +- PrimaryPrefix[@SuperModifier = false, @ThisModifier = false]
+ | | | +- Name[@Image = "o"]
+ | | +- SwitchLabel[@Default = false]
+ | | | +- Expression[@StandAlonePrimitive = false]
+ | | | +- PrimaryExpression[]
+ | | | +- PrimaryPrefix[@SuperModifier = false, @ThisModifier = false]
+ | | | +- Literal[@CharLiteral = false, @DoubleLiteral = false, @EscapedStringLiteral = null, @FloatLiteral = false, @IntLiteral = false, @LongLiteral = false, @SingleCharacterStringLiteral = false, @StringLiteral = false, @TextBlock = false, @TextBlockContent = null, @ValueAsDouble = NaN, @ValueAsFloat = NaN, @ValueAsInt = 0, @ValueAsLong = 0]
+ | | | +- NullLiteral[]
+ | | +- SwitchLabel[@Default = true]
+ | | +- BlockStatement[@Allocation = false]
+ | | +- Statement[]
+ | | +- StatementExpression[]
+ | | +- PrimaryExpression[]
+ | | +- PrimaryPrefix[@SuperModifier = false, @ThisModifier = false]
+ | | | +- Name[@Image = "System.out.println"]
+ | | +- PrimarySuffix[@ArgumentCount = 1, @Arguments = true, @ArrayDereference = false]
+ | | +- Arguments[@ArgumentCount = 1, @Size = 1]
+ | | +- ArgumentList[@Size = 1]
+ | | +- Expression[@StandAlonePrimitive = false]
+ | | +- PrimaryExpression[]
+ | | +- PrimaryPrefix[@SuperModifier = false, @ThisModifier = false]
+ | | +- Literal[@CharLiteral = false, @DoubleLiteral = false, @EscapedStringLiteral = "\"The rest (including null)\"", @FloatLiteral = false, @Image = "\"The rest (including null)\"", @IntLiteral = false, @LongLiteral = false, @SingleCharacterStringLiteral = false, @StringLiteral = true, @TextBlock = false, @TextBlockContent = "\"The rest (including null)\"", @ValueAsDouble = NaN, @ValueAsFloat = NaN, @ValueAsInt = 0, @ValueAsLong = 0]
+ | +- BlockStatement[@Allocation = false]
+ | +- Statement[]
+ | +- SwitchStatement[@DefaultCase = true, @ExhaustiveEnumSwitch = false, @FallthroughSwitch = false]
+ | +- Expression[@StandAlonePrimitive = false]
+ | | +- PrimaryExpression[]
+ | | +- PrimaryPrefix[@SuperModifier = false, @ThisModifier = false]
+ | | +- Name[@Image = "o"]
+ | +- SwitchLabeledExpression[]
+ | +- SwitchLabel[@Default = true]
+ | | +- Expression[@StandAlonePrimitive = false]
+ | | +- PrimaryExpression[]
+ | | +- PrimaryPrefix[@SuperModifier = false, @ThisModifier = false]
+ | | +- Literal[@CharLiteral = false, @DoubleLiteral = false, @EscapedStringLiteral = null, @FloatLiteral = false, @IntLiteral = false, @LongLiteral = false, @SingleCharacterStringLiteral = false, @StringLiteral = false, @TextBlock = false, @TextBlockContent = null, @ValueAsDouble = NaN, @ValueAsFloat = NaN, @ValueAsInt = 0, @ValueAsLong = 0]
+ | | +- NullLiteral[]
+ | +- Expression[@StandAlonePrimitive = false]
+ | +- PrimaryExpression[]
+ | +- PrimaryPrefix[@SuperModifier = false, @ThisModifier = false]
+ | | +- Name[@Image = "System.out.println"]
+ | +- PrimarySuffix[@ArgumentCount = 1, @Arguments = true, @ArrayDereference = false]
+ | +- Arguments[@ArgumentCount = 1, @Size = 1]
+ | +- ArgumentList[@Size = 1]
+ | +- Expression[@StandAlonePrimitive = false]
+ | +- PrimaryExpression[]
+ | +- PrimaryPrefix[@SuperModifier = false, @ThisModifier = false]
+ | +- Literal[@CharLiteral = false, @DoubleLiteral = false, @EscapedStringLiteral = "\"The rest (including null)\"", @FloatLiteral = false, @Image = "\"The rest (including null)\"", @IntLiteral = false, @LongLiteral = false, @SingleCharacterStringLiteral = false, @StringLiteral = true, @TextBlock = false, @TextBlockContent = "\"The rest (including null)\"", @ValueAsDouble = NaN, @ValueAsFloat = NaN, @ValueAsInt = 0, @ValueAsLong = 0]
+ +- ClassOrInterfaceBodyDeclaration[@AnonymousInnerClass = false, @EnumChild = false, @Kind = DeclarationKind.METHOD]
+ +- MethodDeclaration[@Abstract = false, @Arity = 1, @Default = false, @Final = false, @InterfaceMember = false, @Kind = MethodLikeKind.METHOD, @MethodName = "main", @Modifiers = 17, @Name = "main", @Native = false, @PackagePrivate = false, @Private = false, @Protected = false, @Public = true, @Static = true, @Strictfp = false, @Synchronized = false, @SyntacticallyAbstract = false, @SyntacticallyPublic = true, @Transient = false, @Void = true, @Volatile = false]
+ +- ResultType[@Void = true, @returnsArray = false]
+ +- MethodDeclarator[@Image = "main", @ParameterCount = 1]
+ | +- FormalParameters[@ParameterCount = 1, @Size = 1]
+ | +- FormalParameter[@Abstract = false, @Array = true, @ArrayDepth = 1, @Default = false, @ExplicitReceiverParameter = false, @Final = false, @Modifiers = 0, @Native = false, @PackagePrivate = true, @Private = false, @Protected = false, @Public = false, @Static = false, @Strictfp = false, @Synchronized = false, @Transient = false, @TypeInferred = false, @Varargs = false, @Volatile = false]
+ | +- Type[@Array = true, @ArrayDepth = 1, @ArrayType = true, @TypeImage = "String"]
+ | | +- ReferenceType[@Array = true, @ArrayDepth = 1]
+ | | +- ClassOrInterfaceType[@AnonymousClass = false, @Array = true, @ArrayDepth = 1, @Image = "String", @ReferenceToClassSameCompilationUnit = false]
+ | +- VariableDeclaratorId[@Array = false, @ArrayDepth = 0, @ArrayType = true, @ExceptionBlockParameter = false, @ExplicitReceiverParameter = false, @Field = false, @Final = false, @ForeachVariable = false, @FormalParameter = true, @Image = "args", @LambdaParameter = false, @LocalVariable = false, @Name = "args", @PatternBinding = false, @ResourceDeclaration = false, @TypeInferred = false, @VariableName = "args"]
+ +- Block[@containsComment = false]
+ +- BlockStatement[@Allocation = false]
+ | +- Statement[]
+ | +- StatementExpression[]
+ | +- PrimaryExpression[]
+ | +- PrimaryPrefix[@SuperModifier = false, @ThisModifier = false]
+ | | +- Name[@Image = "test"]
+ | +- PrimarySuffix[@ArgumentCount = 1, @Arguments = true, @ArrayDereference = false]
+ | +- Arguments[@ArgumentCount = 1, @Size = 1]
+ | +- ArgumentList[@Size = 1]
+ | +- Expression[@StandAlonePrimitive = false]
+ | +- PrimaryExpression[]
+ | +- PrimaryPrefix[@SuperModifier = false, @ThisModifier = false]
+ | +- Literal[@CharLiteral = false, @DoubleLiteral = false, @EscapedStringLiteral = "\"test\"", @FloatLiteral = false, @Image = "\"test\"", @IntLiteral = false, @LongLiteral = false, @SingleCharacterStringLiteral = false, @StringLiteral = true, @TextBlock = false, @TextBlockContent = "\"test\"", @ValueAsDouble = NaN, @ValueAsFloat = NaN, @ValueAsInt = 0, @ValueAsLong = 0]
+ +- BlockStatement[@Allocation = false]
+ | +- Statement[]
+ | +- StatementExpression[]
+ | +- PrimaryExpression[]
+ | +- PrimaryPrefix[@SuperModifier = false, @ThisModifier = false]
+ | | +- Name[@Image = "test2"]
+ | +- PrimarySuffix[@ArgumentCount = 1, @Arguments = true, @ArrayDereference = false]
+ | +- Arguments[@ArgumentCount = 1, @Size = 1]
+ | +- ArgumentList[@Size = 1]
+ | +- Expression[@StandAlonePrimitive = true]
+ | +- PrimaryExpression[]
+ | +- PrimaryPrefix[@SuperModifier = false, @ThisModifier = false]
+ | +- Literal[@CharLiteral = false, @DoubleLiteral = false, @EscapedStringLiteral = "2", @FloatLiteral = false, @Image = "2", @IntLiteral = true, @LongLiteral = false, @SingleCharacterStringLiteral = false, @StringLiteral = false, @TextBlock = false, @TextBlockContent = "2", @ValueAsDouble = NaN, @ValueAsFloat = NaN, @ValueAsInt = 2, @ValueAsLong = 2]
+ +- BlockStatement[@Allocation = false]
+ | +- Statement[]
+ | +- TryStatement[@Finally = false, @TryWithResources = false]
+ | +- Block[@containsComment = false]
+ | | +- BlockStatement[@Allocation = false]
+ | | +- Statement[]
+ | | +- StatementExpression[]
+ | | +- PrimaryExpression[]
+ | | +- PrimaryPrefix[@SuperModifier = false, @ThisModifier = false]
+ | | | +- Name[@Image = "test2"]
+ | | +- PrimarySuffix[@ArgumentCount = 1, @Arguments = true, @ArrayDereference = false]
+ | | +- Arguments[@ArgumentCount = 1, @Size = 1]
+ | | +- ArgumentList[@Size = 1]
+ | | +- Expression[@StandAlonePrimitive = false]
+ | | +- PrimaryExpression[]
+ | | +- PrimaryPrefix[@SuperModifier = false, @ThisModifier = false]
+ | | +- Literal[@CharLiteral = false, @DoubleLiteral = false, @EscapedStringLiteral = null, @FloatLiteral = false, @IntLiteral = false, @LongLiteral = false, @SingleCharacterStringLiteral = false, @StringLiteral = false, @TextBlock = false, @TextBlockContent = null, @ValueAsDouble = NaN, @ValueAsFloat = NaN, @ValueAsInt = 0, @ValueAsLong = 0]
+ | | +- NullLiteral[]
+ | +- CatchStatement[@ExceptionName = "e", @MulticatchStatement = false]
+ | +- FormalParameter[@Abstract = false, @Array = false, @ArrayDepth = 0, @Default = false, @ExplicitReceiverParameter = false, @Final = false, @Modifiers = 0, @Native = false, @PackagePrivate = true, @Private = false, @Protected = false, @Public = false, @Static = false, @Strictfp = false, @Synchronized = false, @Transient = false, @TypeInferred = false, @Varargs = false, @Volatile = false]
+ | | +- Type[@Array = false, @ArrayDepth = 0, @ArrayType = false, @TypeImage = "NullPointerException"]
+ | | | +- ReferenceType[@Array = false, @ArrayDepth = 0]
+ | | | +- ClassOrInterfaceType[@AnonymousClass = false, @Array = false, @ArrayDepth = 0, @Image = "NullPointerException", @ReferenceToClassSameCompilationUnit = false]
+ | | +- VariableDeclaratorId[@Array = false, @ArrayDepth = 0, @ArrayType = false, @ExceptionBlockParameter = true, @ExplicitReceiverParameter = false, @Field = false, @Final = false, @ForeachVariable = false, @FormalParameter = false, @Image = "e", @LambdaParameter = false, @LocalVariable = false, @Name = "e", @PatternBinding = false, @ResourceDeclaration = false, @TypeInferred = false, @VariableName = "e"]
+ | +- Block[@containsComment = false]
+ | +- BlockStatement[@Allocation = false]
+ | +- Statement[]
+ | +- StatementExpression[]
+ | +- PrimaryExpression[]
+ | +- PrimaryPrefix[@SuperModifier = false, @ThisModifier = false]
+ | | +- Name[@Image = "System.out.println"]
+ | +- PrimarySuffix[@ArgumentCount = 1, @Arguments = true, @ArrayDereference = false]
+ | +- Arguments[@ArgumentCount = 1, @Size = 1]
+ | +- ArgumentList[@Size = 1]
+ | +- Expression[@StandAlonePrimitive = false]
+ | +- PrimaryExpression[]
+ | +- PrimaryPrefix[@SuperModifier = false, @ThisModifier = false]
+ | +- Name[@Image = "e"]
+ +- BlockStatement[@Allocation = false]
+ | +- Statement[]
+ | +- StatementExpression[]
+ | +- PrimaryExpression[]
+ | +- PrimaryPrefix[@SuperModifier = false, @ThisModifier = false]
+ | | +- Name[@Image = "test3"]
+ | +- PrimarySuffix[@ArgumentCount = 1, @Arguments = true, @ArrayDereference = false]
+ | +- Arguments[@ArgumentCount = 1, @Size = 1]
+ | +- ArgumentList[@Size = 1]
+ | +- Expression[@StandAlonePrimitive = true]
+ | +- PrimaryExpression[]
+ | +- PrimaryPrefix[@SuperModifier = false, @ThisModifier = false]
+ | +- Literal[@CharLiteral = false, @DoubleLiteral = false, @EscapedStringLiteral = "3", @FloatLiteral = false, @Image = "3", @IntLiteral = true, @LongLiteral = false, @SingleCharacterStringLiteral = false, @StringLiteral = false, @TextBlock = false, @TextBlockContent = "3", @ValueAsDouble = NaN, @ValueAsFloat = NaN, @ValueAsInt = 3, @ValueAsLong = 3]
+ +- BlockStatement[@Allocation = false]
+ | +- Statement[]
+ | +- StatementExpression[]
+ | +- PrimaryExpression[]
+ | +- PrimaryPrefix[@SuperModifier = false, @ThisModifier = false]
+ | | +- Name[@Image = "test3"]
+ | +- PrimarySuffix[@ArgumentCount = 1, @Arguments = true, @ArrayDereference = false]
+ | +- Arguments[@ArgumentCount = 1, @Size = 1]
+ | +- ArgumentList[@Size = 1]
+ | +- Expression[@StandAlonePrimitive = false]
+ | +- PrimaryExpression[]
+ | +- PrimaryPrefix[@SuperModifier = false, @ThisModifier = false]
+ | +- Literal[@CharLiteral = false, @DoubleLiteral = false, @EscapedStringLiteral = "\"test\"", @FloatLiteral = false, @Image = "\"test\"", @IntLiteral = false, @LongLiteral = false, @SingleCharacterStringLiteral = false, @StringLiteral = true, @TextBlock = false, @TextBlockContent = "\"test\"", @ValueAsDouble = NaN, @ValueAsFloat = NaN, @ValueAsInt = 0, @ValueAsLong = 0]
+ +- BlockStatement[@Allocation = false]
+ | +- Statement[]
+ | +- StatementExpression[]
+ | +- PrimaryExpression[]
+ | +- PrimaryPrefix[@SuperModifier = false, @ThisModifier = false]
+ | | +- Name[@Image = "test3"]
+ | +- PrimarySuffix[@ArgumentCount = 1, @Arguments = true, @ArrayDereference = false]
+ | +- Arguments[@ArgumentCount = 1, @Size = 1]
+ | +- ArgumentList[@Size = 1]
+ | +- Expression[@StandAlonePrimitive = false]
+ | +- PrimaryExpression[]
+ | +- PrimaryPrefix[@SuperModifier = false, @ThisModifier = false]
+ | +- Literal[@CharLiteral = false, @DoubleLiteral = false, @EscapedStringLiteral = null, @FloatLiteral = false, @IntLiteral = false, @LongLiteral = false, @SingleCharacterStringLiteral = false, @StringLiteral = false, @TextBlock = false, @TextBlockContent = null, @ValueAsDouble = NaN, @ValueAsFloat = NaN, @ValueAsInt = 0, @ValueAsLong = 0]
+ | +- NullLiteral[]
+ +- BlockStatement[@Allocation = false]
+ | +- Statement[]
+ | +- StatementExpression[]
+ | +- PrimaryExpression[]
+ | +- PrimaryPrefix[@SuperModifier = false, @ThisModifier = false]
+ | | +- Name[@Image = "testFooBar"]
+ | +- PrimarySuffix[@ArgumentCount = 1, @Arguments = true, @ArrayDereference = false]
+ | +- Arguments[@ArgumentCount = 1, @Size = 1]
+ | +- ArgumentList[@Size = 1]
+ | +- Expression[@StandAlonePrimitive = false]
+ | +- PrimaryExpression[]
+ | +- PrimaryPrefix[@SuperModifier = false, @ThisModifier = false]
+ | +- Literal[@CharLiteral = false, @DoubleLiteral = false, @EscapedStringLiteral = null, @FloatLiteral = false, @IntLiteral = false, @LongLiteral = false, @SingleCharacterStringLiteral = false, @StringLiteral = false, @TextBlock = false, @TextBlockContent = null, @ValueAsDouble = NaN, @ValueAsFloat = NaN, @ValueAsInt = 0, @ValueAsLong = 0]
+ | +- NullLiteral[]
+ +- BlockStatement[@Allocation = false]
+ | +- Statement[]
+ | +- StatementExpression[]
+ | +- PrimaryExpression[]
+ | +- PrimaryPrefix[@SuperModifier = false, @ThisModifier = false]
+ | | +- Name[@Image = "testFooBar"]
+ | +- PrimarySuffix[@ArgumentCount = 1, @Arguments = true, @ArrayDereference = false]
+ | +- Arguments[@ArgumentCount = 1, @Size = 1]
+ | +- ArgumentList[@Size = 1]
+ | +- Expression[@StandAlonePrimitive = false]
+ | +- PrimaryExpression[]
+ | +- PrimaryPrefix[@SuperModifier = false, @ThisModifier = false]
+ | +- Literal[@CharLiteral = false, @DoubleLiteral = false, @EscapedStringLiteral = "\"Foo\"", @FloatLiteral = false, @Image = "\"Foo\"", @IntLiteral = false, @LongLiteral = false, @SingleCharacterStringLiteral = false, @StringLiteral = true, @TextBlock = false, @TextBlockContent = "\"Foo\"", @ValueAsDouble = NaN, @ValueAsFloat = NaN, @ValueAsInt = 0, @ValueAsLong = 0]
+ +- BlockStatement[@Allocation = false]
+ | +- Statement[]
+ | +- StatementExpression[]
+ | +- PrimaryExpression[]
+ | +- PrimaryPrefix[@SuperModifier = false, @ThisModifier = false]
+ | | +- Name[@Image = "testFooBar"]
+ | +- PrimarySuffix[@ArgumentCount = 1, @Arguments = true, @ArrayDereference = false]
+ | +- Arguments[@ArgumentCount = 1, @Size = 1]
+ | +- ArgumentList[@Size = 1]
+ | +- Expression[@StandAlonePrimitive = false]
+ | +- PrimaryExpression[]
+ | +- PrimaryPrefix[@SuperModifier = false, @ThisModifier = false]
+ | +- Literal[@CharLiteral = false, @DoubleLiteral = false, @EscapedStringLiteral = "\"Bar\"", @FloatLiteral = false, @Image = "\"Bar\"", @IntLiteral = false, @LongLiteral = false, @SingleCharacterStringLiteral = false, @StringLiteral = true, @TextBlock = false, @TextBlockContent = "\"Bar\"", @ValueAsDouble = NaN, @ValueAsFloat = NaN, @ValueAsInt = 0, @ValueAsLong = 0]
+ +- BlockStatement[@Allocation = false]
+ | +- Statement[]
+ | +- StatementExpression[]
+ | +- PrimaryExpression[]
+ | +- PrimaryPrefix[@SuperModifier = false, @ThisModifier = false]
+ | | +- Name[@Image = "testFooBar"]
+ | +- PrimarySuffix[@ArgumentCount = 1, @Arguments = true, @ArrayDereference = false]
+ | +- Arguments[@ArgumentCount = 1, @Size = 1]
+ | +- ArgumentList[@Size = 1]
+ | +- Expression[@StandAlonePrimitive = false]
+ | +- PrimaryExpression[]
+ | +- PrimaryPrefix[@SuperModifier = false, @ThisModifier = false]
+ | +- Literal[@CharLiteral = false, @DoubleLiteral = false, @EscapedStringLiteral = "\"baz\"", @FloatLiteral = false, @Image = "\"baz\"", @IntLiteral = false, @LongLiteral = false, @SingleCharacterStringLiteral = false, @StringLiteral = true, @TextBlock = false, @TextBlockContent = "\"baz\"", @ValueAsDouble = NaN, @ValueAsFloat = NaN, @ValueAsInt = 0, @ValueAsLong = 0]
+ +- BlockStatement[@Allocation = false]
+ | +- Statement[]
+ | +- StatementExpression[]
+ | +- PrimaryExpression[]
+ | +- PrimaryPrefix[@SuperModifier = false, @ThisModifier = false]
+ | | +- Name[@Image = "testStringOrNull"]
+ | +- PrimarySuffix[@ArgumentCount = 1, @Arguments = true, @ArrayDereference = false]
+ | +- Arguments[@ArgumentCount = 1, @Size = 1]
+ | +- ArgumentList[@Size = 1]
+ | +- Expression[@StandAlonePrimitive = false]
+ | +- PrimaryExpression[]
+ | +- PrimaryPrefix[@SuperModifier = false, @ThisModifier = false]
+ | +- Literal[@CharLiteral = false, @DoubleLiteral = false, @EscapedStringLiteral = null, @FloatLiteral = false, @IntLiteral = false, @LongLiteral = false, @SingleCharacterStringLiteral = false, @StringLiteral = false, @TextBlock = false, @TextBlockContent = null, @ValueAsDouble = NaN, @ValueAsFloat = NaN, @ValueAsInt = 0, @ValueAsLong = 0]
+ | +- NullLiteral[]
+ +- BlockStatement[@Allocation = false]
+ +- Statement[]
+ +- StatementExpression[]
+ +- PrimaryExpression[]
+ +- PrimaryPrefix[@SuperModifier = false, @ThisModifier = false]
+ | +- Name[@Image = "testStringOrNull"]
+ +- PrimarySuffix[@ArgumentCount = 1, @Arguments = true, @ArrayDereference = false]
+ +- Arguments[@ArgumentCount = 1, @Size = 1]
+ +- ArgumentList[@Size = 1]
+ +- Expression[@StandAlonePrimitive = false]
+ +- PrimaryExpression[]
+ +- PrimaryPrefix[@SuperModifier = false, @ThisModifier = false]
+ +- Literal[@CharLiteral = false, @DoubleLiteral = false, @EscapedStringLiteral = "\"some string\"", @FloatLiteral = false, @Image = "\"some string\"", @IntLiteral = false, @LongLiteral = false, @SingleCharacterStringLiteral = false, @StringLiteral = true, @TextBlock = false, @TextBlockContent = "\"some string\"", @ValueAsDouble = NaN, @ValueAsFloat = NaN, @ValueAsInt = 0, @ValueAsLong = 0]
diff --git a/pmd-java/src/test/resources/net/sourceforge/pmd/lang/java/ast/jdkversiontests/java20p/EnhancedTypeCheckingSwitch.java b/pmd-java/src/test/resources/net/sourceforge/pmd/lang/java/ast/jdkversiontests/java20p/EnhancedTypeCheckingSwitch.java
new file mode 100644
index 0000000000..ad8fe31898
--- /dev/null
+++ b/pmd-java/src/test/resources/net/sourceforge/pmd/lang/java/ast/jdkversiontests/java20p/EnhancedTypeCheckingSwitch.java
@@ -0,0 +1,29 @@
+/*
+ * BSD-style license; for more info see http://pmd.sourceforge.net/license.html
+ */
+
+/**
+ * @see JEP 427: Pattern Matching for switch (Third Preview)
+ */
+public class EnhancedTypeCheckingSwitch {
+
+
+ static void typeTester(Object o) {
+ switch (o) {
+ case null -> System.out.println("null");
+ case String s -> System.out.println("String");
+ case Color c -> System.out.println("Color with " + c.values().length + " values");
+ case Point p -> System.out.println("Record class: " + p.toString());
+ case int[] ia -> System.out.println("Array of ints of length" + ia.length);
+ default -> System.out.println("Something else");
+ }
+ }
+
+ public static void main(String[] args) {
+ Object o = "test";
+ typeTester(o);
+ }
+}
+
+record Point(int i, int j) {}
+enum Color { RED, GREEN, BLUE; }
diff --git a/pmd-java/src/test/resources/net/sourceforge/pmd/lang/java/ast/jdkversiontests/java20p/EnhancedTypeCheckingSwitch.txt b/pmd-java/src/test/resources/net/sourceforge/pmd/lang/java/ast/jdkversiontests/java20p/EnhancedTypeCheckingSwitch.txt
new file mode 100644
index 0000000000..15082ceb4e
--- /dev/null
+++ b/pmd-java/src/test/resources/net/sourceforge/pmd/lang/java/ast/jdkversiontests/java20p/EnhancedTypeCheckingSwitch.txt
@@ -0,0 +1,199 @@
++- CompilationUnit[@PackageName = "", @declarationsAreInDefaultPackage = true]
+ +- TypeDeclaration[]
+ | +- ClassOrInterfaceDeclaration[@Abstract = false, @BinaryName = "EnhancedTypeCheckingSwitch", @Default = false, @Final = false, @Image = "EnhancedTypeCheckingSwitch", @Interface = false, @Local = false, @Modifiers = 1, @Native = false, @Nested = false, @NonSealed = false, @PackagePrivate = false, @Private = false, @Protected = false, @Public = true, @Sealed = false, @SimpleName = "EnhancedTypeCheckingSwitch", @Static = false, @Strictfp = false, @Synchronized = false, @Transient = false, @TypeKind = TypeKind.CLASS, @Volatile = false]
+ | +- ClassOrInterfaceBody[@AnonymousInnerClass = false, @EnumChild = false]
+ | +- ClassOrInterfaceBodyDeclaration[@AnonymousInnerClass = false, @EnumChild = false, @Kind = DeclarationKind.METHOD]
+ | | +- MethodDeclaration[@Abstract = false, @Arity = 1, @Default = false, @Final = false, @InterfaceMember = false, @Kind = MethodLikeKind.METHOD, @MethodName = "typeTester", @Modifiers = 16, @Name = "typeTester", @Native = false, @PackagePrivate = true, @Private = false, @Protected = false, @Public = false, @Static = true, @Strictfp = false, @Synchronized = false, @SyntacticallyAbstract = false, @SyntacticallyPublic = false, @Transient = false, @Void = true, @Volatile = false]
+ | | +- ResultType[@Void = true, @returnsArray = false]
+ | | +- MethodDeclarator[@Image = "typeTester", @ParameterCount = 1]
+ | | | +- FormalParameters[@ParameterCount = 1, @Size = 1]
+ | | | +- FormalParameter[@Abstract = false, @Array = false, @ArrayDepth = 0, @Default = false, @ExplicitReceiverParameter = false, @Final = false, @Modifiers = 0, @Native = false, @PackagePrivate = true, @Private = false, @Protected = false, @Public = false, @Static = false, @Strictfp = false, @Synchronized = false, @Transient = false, @TypeInferred = false, @Varargs = false, @Volatile = false]
+ | | | +- Type[@Array = false, @ArrayDepth = 0, @ArrayType = false, @TypeImage = "Object"]
+ | | | | +- ReferenceType[@Array = false, @ArrayDepth = 0]
+ | | | | +- ClassOrInterfaceType[@AnonymousClass = false, @Array = false, @ArrayDepth = 0, @Image = "Object", @ReferenceToClassSameCompilationUnit = false]
+ | | | +- VariableDeclaratorId[@Array = false, @ArrayDepth = 0, @ArrayType = false, @ExceptionBlockParameter = false, @ExplicitReceiverParameter = false, @Field = false, @Final = false, @ForeachVariable = false, @FormalParameter = true, @Image = "o", @LambdaParameter = false, @LocalVariable = false, @Name = "o", @PatternBinding = false, @ResourceDeclaration = false, @TypeInferred = false, @VariableName = "o"]
+ | | +- Block[@containsComment = false]
+ | | +- BlockStatement[@Allocation = false]
+ | | +- Statement[]
+ | | +- SwitchStatement[@DefaultCase = true, @ExhaustiveEnumSwitch = false, @FallthroughSwitch = false]
+ | | +- Expression[@StandAlonePrimitive = false]
+ | | | +- PrimaryExpression[]
+ | | | +- PrimaryPrefix[@SuperModifier = false, @ThisModifier = false]
+ | | | +- Name[@Image = "o"]
+ | | +- SwitchLabeledExpression[]
+ | | | +- SwitchLabel[@Default = false]
+ | | | | +- Expression[@StandAlonePrimitive = false]
+ | | | | +- PrimaryExpression[]
+ | | | | +- PrimaryPrefix[@SuperModifier = false, @ThisModifier = false]
+ | | | | +- Literal[@CharLiteral = false, @DoubleLiteral = false, @EscapedStringLiteral = null, @FloatLiteral = false, @IntLiteral = false, @LongLiteral = false, @SingleCharacterStringLiteral = false, @StringLiteral = false, @TextBlock = false, @TextBlockContent = null, @ValueAsDouble = NaN, @ValueAsFloat = NaN, @ValueAsInt = 0, @ValueAsLong = 0]
+ | | | | +- NullLiteral[]
+ | | | +- Expression[@StandAlonePrimitive = false]
+ | | | +- PrimaryExpression[]
+ | | | +- PrimaryPrefix[@SuperModifier = false, @ThisModifier = false]
+ | | | | +- Name[@Image = "System.out.println"]
+ | | | +- PrimarySuffix[@ArgumentCount = 1, @Arguments = true, @ArrayDereference = false]
+ | | | +- Arguments[@ArgumentCount = 1, @Size = 1]
+ | | | +- ArgumentList[@Size = 1]
+ | | | +- Expression[@StandAlonePrimitive = false]
+ | | | +- PrimaryExpression[]
+ | | | +- PrimaryPrefix[@SuperModifier = false, @ThisModifier = false]
+ | | | +- Literal[@CharLiteral = false, @DoubleLiteral = false, @EscapedStringLiteral = "\"null\"", @FloatLiteral = false, @Image = "\"null\"", @IntLiteral = false, @LongLiteral = false, @SingleCharacterStringLiteral = false, @StringLiteral = true, @TextBlock = false, @TextBlockContent = "\"null\"", @ValueAsDouble = NaN, @ValueAsFloat = NaN, @ValueAsInt = 0, @ValueAsLong = 0]
+ | | +- SwitchLabeledExpression[]
+ | | | +- SwitchLabel[@Default = false]
+ | | | | +- TypePattern[@ParenthesisDepth = 0]
+ | | | | +- Type[@Array = false, @ArrayDepth = 0, @ArrayType = false, @TypeImage = "String"]
+ | | | | | +- ReferenceType[@Array = false, @ArrayDepth = 0]
+ | | | | | +- ClassOrInterfaceType[@AnonymousClass = false, @Array = false, @ArrayDepth = 0, @Image = "String", @ReferenceToClassSameCompilationUnit = false]
+ | | | | +- VariableDeclaratorId[@Array = false, @ArrayDepth = 0, @ArrayType = false, @ExceptionBlockParameter = false, @ExplicitReceiverParameter = false, @Field = false, @Final = false, @ForeachVariable = false, @FormalParameter = false, @Image = "s", @LambdaParameter = false, @LocalVariable = false, @Name = "s", @PatternBinding = true, @ResourceDeclaration = false, @TypeInferred = false, @VariableName = "s"]
+ | | | +- Expression[@StandAlonePrimitive = false]
+ | | | +- PrimaryExpression[]
+ | | | +- PrimaryPrefix[@SuperModifier = false, @ThisModifier = false]
+ | | | | +- Name[@Image = "System.out.println"]
+ | | | +- PrimarySuffix[@ArgumentCount = 1, @Arguments = true, @ArrayDereference = false]
+ | | | +- Arguments[@ArgumentCount = 1, @Size = 1]
+ | | | +- ArgumentList[@Size = 1]
+ | | | +- Expression[@StandAlonePrimitive = false]
+ | | | +- PrimaryExpression[]
+ | | | +- PrimaryPrefix[@SuperModifier = false, @ThisModifier = false]
+ | | | +- Literal[@CharLiteral = false, @DoubleLiteral = false, @EscapedStringLiteral = "\"String\"", @FloatLiteral = false, @Image = "\"String\"", @IntLiteral = false, @LongLiteral = false, @SingleCharacterStringLiteral = false, @StringLiteral = true, @TextBlock = false, @TextBlockContent = "\"String\"", @ValueAsDouble = NaN, @ValueAsFloat = NaN, @ValueAsInt = 0, @ValueAsLong = 0]
+ | | +- SwitchLabeledExpression[]
+ | | | +- SwitchLabel[@Default = false]
+ | | | | +- TypePattern[@ParenthesisDepth = 0]
+ | | | | +- Type[@Array = false, @ArrayDepth = 0, @ArrayType = false, @TypeImage = "Color"]
+ | | | | | +- ReferenceType[@Array = false, @ArrayDepth = 0]
+ | | | | | +- ClassOrInterfaceType[@AnonymousClass = false, @Array = false, @ArrayDepth = 0, @Image = "Color", @ReferenceToClassSameCompilationUnit = true]
+ | | | | +- VariableDeclaratorId[@Array = false, @ArrayDepth = 0, @ArrayType = false, @ExceptionBlockParameter = false, @ExplicitReceiverParameter = false, @Field = false, @Final = false, @ForeachVariable = false, @FormalParameter = false, @Image = "c", @LambdaParameter = false, @LocalVariable = false, @Name = "c", @PatternBinding = true, @ResourceDeclaration = false, @TypeInferred = false, @VariableName = "c"]
+ | | | +- Expression[@StandAlonePrimitive = false]
+ | | | +- PrimaryExpression[]
+ | | | +- PrimaryPrefix[@SuperModifier = false, @ThisModifier = false]
+ | | | | +- Name[@Image = "System.out.println"]
+ | | | +- PrimarySuffix[@ArgumentCount = 1, @Arguments = true, @ArrayDereference = false]
+ | | | +- Arguments[@ArgumentCount = 1, @Size = 1]
+ | | | +- ArgumentList[@Size = 1]
+ | | | +- Expression[@StandAlonePrimitive = false]
+ | | | +- AdditiveExpression[@Image = "+", @Operator = "+"]
+ | | | +- PrimaryExpression[]
+ | | | | +- PrimaryPrefix[@SuperModifier = false, @ThisModifier = false]
+ | | | | +- Literal[@CharLiteral = false, @DoubleLiteral = false, @EscapedStringLiteral = "\"Color with \"", @FloatLiteral = false, @Image = "\"Color with \"", @IntLiteral = false, @LongLiteral = false, @SingleCharacterStringLiteral = false, @StringLiteral = true, @TextBlock = false, @TextBlockContent = "\"Color with \"", @ValueAsDouble = NaN, @ValueAsFloat = NaN, @ValueAsInt = 0, @ValueAsLong = 0]
+ | | | +- PrimaryExpression[]
+ | | | | +- PrimaryPrefix[@SuperModifier = false, @ThisModifier = false]
+ | | | | | +- Name[@Image = "c.values"]
+ | | | | +- PrimarySuffix[@ArgumentCount = 0, @Arguments = true, @ArrayDereference = false]
+ | | | | | +- Arguments[@ArgumentCount = 0, @Size = 0]
+ | | | | +- PrimarySuffix[@ArgumentCount = -1, @Arguments = false, @ArrayDereference = false, @Image = "length"]
+ | | | +- PrimaryExpression[]
+ | | | +- PrimaryPrefix[@SuperModifier = false, @ThisModifier = false]
+ | | | +- Literal[@CharLiteral = false, @DoubleLiteral = false, @EscapedStringLiteral = "\" values\"", @FloatLiteral = false, @Image = "\" values\"", @IntLiteral = false, @LongLiteral = false, @SingleCharacterStringLiteral = false, @StringLiteral = true, @TextBlock = false, @TextBlockContent = "\" values\"", @ValueAsDouble = NaN, @ValueAsFloat = NaN, @ValueAsInt = 0, @ValueAsLong = 0]
+ | | +- SwitchLabeledExpression[]
+ | | | +- SwitchLabel[@Default = false]
+ | | | | +- TypePattern[@ParenthesisDepth = 0]
+ | | | | +- Type[@Array = false, @ArrayDepth = 0, @ArrayType = false, @TypeImage = "Point"]
+ | | | | | +- ReferenceType[@Array = false, @ArrayDepth = 0]
+ | | | | | +- ClassOrInterfaceType[@AnonymousClass = false, @Array = false, @ArrayDepth = 0, @Image = "Point", @ReferenceToClassSameCompilationUnit = false]
+ | | | | +- VariableDeclaratorId[@Array = false, @ArrayDepth = 0, @ArrayType = false, @ExceptionBlockParameter = false, @ExplicitReceiverParameter = false, @Field = false, @Final = false, @ForeachVariable = false, @FormalParameter = false, @Image = "p", @LambdaParameter = false, @LocalVariable = false, @Name = "p", @PatternBinding = true, @ResourceDeclaration = false, @TypeInferred = false, @VariableName = "p"]
+ | | | +- Expression[@StandAlonePrimitive = false]
+ | | | +- PrimaryExpression[]
+ | | | +- PrimaryPrefix[@SuperModifier = false, @ThisModifier = false]
+ | | | | +- Name[@Image = "System.out.println"]
+ | | | +- PrimarySuffix[@ArgumentCount = 1, @Arguments = true, @ArrayDereference = false]
+ | | | +- Arguments[@ArgumentCount = 1, @Size = 1]
+ | | | +- ArgumentList[@Size = 1]
+ | | | +- Expression[@StandAlonePrimitive = false]
+ | | | +- AdditiveExpression[@Image = "+", @Operator = "+"]
+ | | | +- PrimaryExpression[]
+ | | | | +- PrimaryPrefix[@SuperModifier = false, @ThisModifier = false]
+ | | | | +- Literal[@CharLiteral = false, @DoubleLiteral = false, @EscapedStringLiteral = "\"Record class: \"", @FloatLiteral = false, @Image = "\"Record class: \"", @IntLiteral = false, @LongLiteral = false, @SingleCharacterStringLiteral = false, @StringLiteral = true, @TextBlock = false, @TextBlockContent = "\"Record class: \"", @ValueAsDouble = NaN, @ValueAsFloat = NaN, @ValueAsInt = 0, @ValueAsLong = 0]
+ | | | +- PrimaryExpression[]
+ | | | +- PrimaryPrefix[@SuperModifier = false, @ThisModifier = false]
+ | | | | +- Name[@Image = "p.toString"]
+ | | | +- PrimarySuffix[@ArgumentCount = 0, @Arguments = true, @ArrayDereference = false]
+ | | | +- Arguments[@ArgumentCount = 0, @Size = 0]
+ | | +- SwitchLabeledExpression[]
+ | | | +- SwitchLabel[@Default = false]
+ | | | | +- TypePattern[@ParenthesisDepth = 0]
+ | | | | +- Type[@Array = true, @ArrayDepth = 1, @ArrayType = true, @TypeImage = "int"]
+ | | | | | +- ReferenceType[@Array = true, @ArrayDepth = 1]
+ | | | | | +- PrimitiveType[@Array = false, @ArrayDepth = 0, @Boolean = false, @Image = "int"]
+ | | | | +- VariableDeclaratorId[@Array = false, @ArrayDepth = 0, @ArrayType = true, @ExceptionBlockParameter = false, @ExplicitReceiverParameter = false, @Field = false, @Final = false, @ForeachVariable = false, @FormalParameter = false, @Image = "ia", @LambdaParameter = false, @LocalVariable = false, @Name = "ia", @PatternBinding = true, @ResourceDeclaration = false, @TypeInferred = false, @VariableName = "ia"]
+ | | | +- Expression[@StandAlonePrimitive = false]
+ | | | +- PrimaryExpression[]
+ | | | +- PrimaryPrefix[@SuperModifier = false, @ThisModifier = false]
+ | | | | +- Name[@Image = "System.out.println"]
+ | | | +- PrimarySuffix[@ArgumentCount = 1, @Arguments = true, @ArrayDereference = false]
+ | | | +- Arguments[@ArgumentCount = 1, @Size = 1]
+ | | | +- ArgumentList[@Size = 1]
+ | | | +- Expression[@StandAlonePrimitive = false]
+ | | | +- AdditiveExpression[@Image = "+", @Operator = "+"]
+ | | | +- PrimaryExpression[]
+ | | | | +- PrimaryPrefix[@SuperModifier = false, @ThisModifier = false]
+ | | | | +- Literal[@CharLiteral = false, @DoubleLiteral = false, @EscapedStringLiteral = "\"Array of ints of length\"", @FloatLiteral = false, @Image = "\"Array of ints of length\"", @IntLiteral = false, @LongLiteral = false, @SingleCharacterStringLiteral = false, @StringLiteral = true, @TextBlock = false, @TextBlockContent = "\"Array of ints of length\"", @ValueAsDouble = NaN, @ValueAsFloat = NaN, @ValueAsInt = 0, @ValueAsLong = 0]
+ | | | +- PrimaryExpression[]
+ | | | +- PrimaryPrefix[@SuperModifier = false, @ThisModifier = false]
+ | | | +- Name[@Image = "ia.length"]
+ | | +- SwitchLabeledExpression[]
+ | | +- SwitchLabel[@Default = true]
+ | | +- Expression[@StandAlonePrimitive = false]
+ | | +- PrimaryExpression[]
+ | | +- PrimaryPrefix[@SuperModifier = false, @ThisModifier = false]
+ | | | +- Name[@Image = "System.out.println"]
+ | | +- PrimarySuffix[@ArgumentCount = 1, @Arguments = true, @ArrayDereference = false]
+ | | +- Arguments[@ArgumentCount = 1, @Size = 1]
+ | | +- ArgumentList[@Size = 1]
+ | | +- Expression[@StandAlonePrimitive = false]
+ | | +- PrimaryExpression[]
+ | | +- PrimaryPrefix[@SuperModifier = false, @ThisModifier = false]
+ | | +- Literal[@CharLiteral = false, @DoubleLiteral = false, @EscapedStringLiteral = "\"Something else\"", @FloatLiteral = false, @Image = "\"Something else\"", @IntLiteral = false, @LongLiteral = false, @SingleCharacterStringLiteral = false, @StringLiteral = true, @TextBlock = false, @TextBlockContent = "\"Something else\"", @ValueAsDouble = NaN, @ValueAsFloat = NaN, @ValueAsInt = 0, @ValueAsLong = 0]
+ | +- ClassOrInterfaceBodyDeclaration[@AnonymousInnerClass = false, @EnumChild = false, @Kind = DeclarationKind.METHOD]
+ | +- MethodDeclaration[@Abstract = false, @Arity = 1, @Default = false, @Final = false, @InterfaceMember = false, @Kind = MethodLikeKind.METHOD, @MethodName = "main", @Modifiers = 17, @Name = "main", @Native = false, @PackagePrivate = false, @Private = false, @Protected = false, @Public = true, @Static = true, @Strictfp = false, @Synchronized = false, @SyntacticallyAbstract = false, @SyntacticallyPublic = true, @Transient = false, @Void = true, @Volatile = false]
+ | +- ResultType[@Void = true, @returnsArray = false]
+ | +- MethodDeclarator[@Image = "main", @ParameterCount = 1]
+ | | +- FormalParameters[@ParameterCount = 1, @Size = 1]
+ | | +- FormalParameter[@Abstract = false, @Array = true, @ArrayDepth = 1, @Default = false, @ExplicitReceiverParameter = false, @Final = false, @Modifiers = 0, @Native = false, @PackagePrivate = true, @Private = false, @Protected = false, @Public = false, @Static = false, @Strictfp = false, @Synchronized = false, @Transient = false, @TypeInferred = false, @Varargs = false, @Volatile = false]
+ | | +- Type[@Array = true, @ArrayDepth = 1, @ArrayType = true, @TypeImage = "String"]
+ | | | +- ReferenceType[@Array = true, @ArrayDepth = 1]
+ | | | +- ClassOrInterfaceType[@AnonymousClass = false, @Array = true, @ArrayDepth = 1, @Image = "String", @ReferenceToClassSameCompilationUnit = false]
+ | | +- VariableDeclaratorId[@Array = false, @ArrayDepth = 0, @ArrayType = true, @ExceptionBlockParameter = false, @ExplicitReceiverParameter = false, @Field = false, @Final = false, @ForeachVariable = false, @FormalParameter = true, @Image = "args", @LambdaParameter = false, @LocalVariable = false, @Name = "args", @PatternBinding = false, @ResourceDeclaration = false, @TypeInferred = false, @VariableName = "args"]
+ | +- Block[@containsComment = false]
+ | +- BlockStatement[@Allocation = false]
+ | | +- LocalVariableDeclaration[@Abstract = false, @Array = false, @ArrayDepth = 0, @Default = false, @Final = false, @Modifiers = 0, @Native = false, @PackagePrivate = true, @Private = false, @Protected = false, @Public = false, @Static = false, @Strictfp = false, @Synchronized = false, @Transient = false, @TypeInferred = false, @VariableName = "o", @Volatile = false]
+ | | +- Type[@Array = false, @ArrayDepth = 0, @ArrayType = false, @TypeImage = "Object"]
+ | | | +- ReferenceType[@Array = false, @ArrayDepth = 0]
+ | | | +- ClassOrInterfaceType[@AnonymousClass = false, @Array = false, @ArrayDepth = 0, @Image = "Object", @ReferenceToClassSameCompilationUnit = false]
+ | | +- VariableDeclarator[@Initializer = true, @Name = "o"]
+ | | +- VariableDeclaratorId[@Array = false, @ArrayDepth = 0, @ArrayType = false, @ExceptionBlockParameter = false, @ExplicitReceiverParameter = false, @Field = false, @Final = false, @ForeachVariable = false, @FormalParameter = false, @Image = "o", @LambdaParameter = false, @LocalVariable = true, @Name = "o", @PatternBinding = false, @ResourceDeclaration = false, @TypeInferred = false, @VariableName = "o"]
+ | | +- VariableInitializer[]
+ | | +- Expression[@StandAlonePrimitive = false]
+ | | +- PrimaryExpression[]
+ | | +- PrimaryPrefix[@SuperModifier = false, @ThisModifier = false]
+ | | +- Literal[@CharLiteral = false, @DoubleLiteral = false, @EscapedStringLiteral = "\"test\"", @FloatLiteral = false, @Image = "\"test\"", @IntLiteral = false, @LongLiteral = false, @SingleCharacterStringLiteral = false, @StringLiteral = true, @TextBlock = false, @TextBlockContent = "\"test\"", @ValueAsDouble = NaN, @ValueAsFloat = NaN, @ValueAsInt = 0, @ValueAsLong = 0]
+ | +- BlockStatement[@Allocation = false]
+ | +- Statement[]
+ | +- StatementExpression[]
+ | +- PrimaryExpression[]
+ | +- PrimaryPrefix[@SuperModifier = false, @ThisModifier = false]
+ | | +- Name[@Image = "typeTester"]
+ | +- PrimarySuffix[@ArgumentCount = 1, @Arguments = true, @ArrayDereference = false]
+ | +- Arguments[@ArgumentCount = 1, @Size = 1]
+ | +- ArgumentList[@Size = 1]
+ | +- Expression[@StandAlonePrimitive = false]
+ | +- PrimaryExpression[]
+ | +- PrimaryPrefix[@SuperModifier = false, @ThisModifier = false]
+ | +- Name[@Image = "o"]
+ +- TypeDeclaration[]
+ | +- RecordDeclaration[@Abstract = false, @BinaryName = "Point", @Default = false, @Final = true, @Image = "Point", @Local = false, @Modifiers = 0, @Native = false, @Nested = false, @PackagePrivate = true, @Private = false, @Protected = false, @Public = false, @SimpleName = "Point", @Static = false, @Strictfp = false, @Synchronized = false, @SyntacticallyFinal = false, @Transient = false, @TypeKind = TypeKind.RECORD, @Volatile = false]
+ | +- RecordComponentList[@Size = 2]
+ | | +- RecordComponent[@Varargs = false]
+ | | | +- Type[@Array = false, @ArrayDepth = 0, @ArrayType = false, @TypeImage = "int"]
+ | | | | +- PrimitiveType[@Array = false, @ArrayDepth = 0, @Boolean = false, @Image = "int"]
+ | | | +- VariableDeclaratorId[@Array = false, @ArrayDepth = 0, @ArrayType = false, @ExceptionBlockParameter = false, @ExplicitReceiverParameter = false, @Field = false, @Final = true, @ForeachVariable = false, @FormalParameter = false, @Image = "i", @LambdaParameter = false, @LocalVariable = false, @Name = "i", @PatternBinding = false, @ResourceDeclaration = false, @TypeInferred = false, @VariableName = "i"]
+ | | +- RecordComponent[@Varargs = false]
+ | | +- Type[@Array = false, @ArrayDepth = 0, @ArrayType = false, @TypeImage = "int"]
+ | | | +- PrimitiveType[@Array = false, @ArrayDepth = 0, @Boolean = false, @Image = "int"]
+ | | +- VariableDeclaratorId[@Array = false, @ArrayDepth = 0, @ArrayType = false, @ExceptionBlockParameter = false, @ExplicitReceiverParameter = false, @Field = false, @Final = true, @ForeachVariable = false, @FormalParameter = false, @Image = "j", @LambdaParameter = false, @LocalVariable = false, @Name = "j", @PatternBinding = false, @ResourceDeclaration = false, @TypeInferred = false, @VariableName = "j"]
+ | +- RecordBody[]
+ +- TypeDeclaration[]
+ +- EnumDeclaration[@Abstract = false, @BinaryName = "Color", @Default = false, @Final = false, @Image = "Color", @Local = false, @Modifiers = 0, @Native = false, @Nested = false, @PackagePrivate = true, @Private = false, @Protected = false, @Public = false, @SimpleName = "Color", @Static = false, @Strictfp = false, @Synchronized = false, @Transient = false, @TypeKind = TypeKind.ENUM, @Volatile = false]
+ +- EnumBody[]
+ +- EnumConstant[@AnonymousClass = false, @Image = "RED"]
+ +- EnumConstant[@AnonymousClass = false, @Image = "GREEN"]
+ +- EnumConstant[@AnonymousClass = false, @Image = "BLUE"]
diff --git a/pmd-java/src/test/resources/net/sourceforge/pmd/lang/java/ast/jdkversiontests/java20p/ExhaustiveSwitch.java b/pmd-java/src/test/resources/net/sourceforge/pmd/lang/java/ast/jdkversiontests/java20p/ExhaustiveSwitch.java
new file mode 100644
index 0000000000..44b5bb9fa7
--- /dev/null
+++ b/pmd-java/src/test/resources/net/sourceforge/pmd/lang/java/ast/jdkversiontests/java20p/ExhaustiveSwitch.java
@@ -0,0 +1,95 @@
+/*
+ * BSD-style license; for more info see http://pmd.sourceforge.net/license.html
+ */
+
+/**
+ * @see JEP 427: Pattern Matching for switch (Third Preview)
+ */
+public class ExhaustiveSwitch {
+
+ static int coverage(Object o) {
+ return switch (o) {
+ case String s -> s.length();
+ case Integer i -> i;
+ default -> 0;
+ };
+ }
+
+ static int coverageDefaultCase(Object o) {
+ return switch (o) {
+ case String s -> s.length();
+ case Integer i -> i;
+ case default -> 0;
+ };
+ }
+
+ static void coverageStatement(Object o) {
+ switch (o) {
+ case String s:
+ System.out.println(s);
+ break;
+ case Integer i:
+ System.out.println("Integer");
+ break;
+ default: // Now exhaustive!
+ break;
+ }
+ }
+
+ sealed interface S permits A, B, C {}
+ final static class A implements S {}
+ final static class B implements S {}
+ record C(int i) implements S {} // Implicitly final
+
+ static int testSealedExhaustive(S s) {
+ return switch (s) {
+ case A a -> 1;
+ case B b -> 2;
+ case C c -> 3;
+ };
+ }
+
+ static void switchStatementExhaustive(S s) {
+ switch (s) {
+ case A a :
+ System.out.println("A");
+ break;
+ case C c :
+ System.out.println("C");
+ break;
+ default:
+ System.out.println("default case, should be B");
+ break;
+ };
+ }
+ sealed interface I permits E, F {}
+ final static class E implements I {}
+ final static class F implements I {}
+
+ static int testGenericSealedExhaustive(I i) {
+ return switch (i) {
+ // Exhaustive as no E case possible!
+ case F bi -> 42;
+ };
+ }
+
+ public static void main(String[] args) {
+ System.out.println(coverage("a string"));
+ System.out.println(coverage(42));
+ System.out.println(coverage(new Object()));
+
+ coverageStatement("a string");
+ coverageStatement(21);
+ coverageStatement(new Object());
+
+ System.out.println("A:" + testSealedExhaustive(new A()));
+ System.out.println("B:" + testSealedExhaustive(new B()));
+ System.out.println("C:" + testSealedExhaustive(new C(1)));
+
+ switchStatementExhaustive(new A());
+ switchStatementExhaustive(new B());
+ switchStatementExhaustive(new C(2));
+
+ System.out.println("F:" + testGenericSealedExhaustive(new F()));
+ }
+}
\ No newline at end of file
diff --git a/pmd-java/src/test/resources/net/sourceforge/pmd/lang/java/ast/jdkversiontests/java20p/ExhaustiveSwitch.txt b/pmd-java/src/test/resources/net/sourceforge/pmd/lang/java/ast/jdkversiontests/java20p/ExhaustiveSwitch.txt
new file mode 100644
index 0000000000..3c62b1a3e2
--- /dev/null
+++ b/pmd-java/src/test/resources/net/sourceforge/pmd/lang/java/ast/jdkversiontests/java20p/ExhaustiveSwitch.txt
@@ -0,0 +1,686 @@
++- CompilationUnit[@PackageName = "", @declarationsAreInDefaultPackage = true]
+ +- TypeDeclaration[]
+ +- ClassOrInterfaceDeclaration[@Abstract = false, @BinaryName = "ExhaustiveSwitch", @Default = false, @Final = false, @Image = "ExhaustiveSwitch", @Interface = false, @Local = false, @Modifiers = 1, @Native = false, @Nested = false, @NonSealed = false, @PackagePrivate = false, @Private = false, @Protected = false, @Public = true, @Sealed = false, @SimpleName = "ExhaustiveSwitch", @Static = false, @Strictfp = false, @Synchronized = false, @Transient = false, @TypeKind = TypeKind.CLASS, @Volatile = false]
+ +- ClassOrInterfaceBody[@AnonymousInnerClass = false, @EnumChild = false]
+ +- ClassOrInterfaceBodyDeclaration[@AnonymousInnerClass = false, @EnumChild = false, @Kind = DeclarationKind.METHOD]
+ | +- MethodDeclaration[@Abstract = false, @Arity = 1, @Default = false, @Final = false, @InterfaceMember = false, @Kind = MethodLikeKind.METHOD, @MethodName = "coverage", @Modifiers = 16, @Name = "coverage", @Native = false, @PackagePrivate = true, @Private = false, @Protected = false, @Public = false, @Static = true, @Strictfp = false, @Synchronized = false, @SyntacticallyAbstract = false, @SyntacticallyPublic = false, @Transient = false, @Void = false, @Volatile = false]
+ | +- ResultType[@Void = false, @returnsArray = false]
+ | | +- Type[@Array = false, @ArrayDepth = 0, @ArrayType = false, @TypeImage = "int"]
+ | | +- PrimitiveType[@Array = false, @ArrayDepth = 0, @Boolean = false, @Image = "int"]
+ | +- MethodDeclarator[@Image = "coverage", @ParameterCount = 1]
+ | | +- FormalParameters[@ParameterCount = 1, @Size = 1]
+ | | +- FormalParameter[@Abstract = false, @Array = false, @ArrayDepth = 0, @Default = false, @ExplicitReceiverParameter = false, @Final = false, @Modifiers = 0, @Native = false, @PackagePrivate = true, @Private = false, @Protected = false, @Public = false, @Static = false, @Strictfp = false, @Synchronized = false, @Transient = false, @TypeInferred = false, @Varargs = false, @Volatile = false]
+ | | +- Type[@Array = false, @ArrayDepth = 0, @ArrayType = false, @TypeImage = "Object"]
+ | | | +- ReferenceType[@Array = false, @ArrayDepth = 0]
+ | | | +- ClassOrInterfaceType[@AnonymousClass = false, @Array = false, @ArrayDepth = 0, @Image = "Object", @ReferenceToClassSameCompilationUnit = false]
+ | | +- VariableDeclaratorId[@Array = false, @ArrayDepth = 0, @ArrayType = false, @ExceptionBlockParameter = false, @ExplicitReceiverParameter = false, @Field = false, @Final = false, @ForeachVariable = false, @FormalParameter = true, @Image = "o", @LambdaParameter = false, @LocalVariable = false, @Name = "o", @PatternBinding = false, @ResourceDeclaration = false, @TypeInferred = false, @VariableName = "o"]
+ | +- Block[@containsComment = false]
+ | +- BlockStatement[@Allocation = false]
+ | +- Statement[]
+ | +- ReturnStatement[]
+ | +- Expression[@StandAlonePrimitive = false]
+ | +- SwitchExpression[]
+ | +- Expression[@StandAlonePrimitive = false]
+ | | +- PrimaryExpression[]
+ | | +- PrimaryPrefix[@SuperModifier = false, @ThisModifier = false]
+ | | +- Name[@Image = "o"]
+ | +- SwitchLabeledExpression[]
+ | | +- SwitchLabel[@Default = false]
+ | | | +- TypePattern[@ParenthesisDepth = 0]
+ | | | +- Type[@Array = false, @ArrayDepth = 0, @ArrayType = false, @TypeImage = "String"]
+ | | | | +- ReferenceType[@Array = false, @ArrayDepth = 0]
+ | | | | +- ClassOrInterfaceType[@AnonymousClass = false, @Array = false, @ArrayDepth = 0, @Image = "String", @ReferenceToClassSameCompilationUnit = false]
+ | | | +- VariableDeclaratorId[@Array = false, @ArrayDepth = 0, @ArrayType = false, @ExceptionBlockParameter = false, @ExplicitReceiverParameter = false, @Field = false, @Final = false, @ForeachVariable = false, @FormalParameter = false, @Image = "s", @LambdaParameter = false, @LocalVariable = false, @Name = "s", @PatternBinding = true, @ResourceDeclaration = false, @TypeInferred = false, @VariableName = "s"]
+ | | +- Expression[@StandAlonePrimitive = false]
+ | | +- PrimaryExpression[]
+ | | +- PrimaryPrefix[@SuperModifier = false, @ThisModifier = false]
+ | | | +- Name[@Image = "s.length"]
+ | | +- PrimarySuffix[@ArgumentCount = 0, @Arguments = true, @ArrayDereference = false]
+ | | +- Arguments[@ArgumentCount = 0, @Size = 0]
+ | +- SwitchLabeledExpression[]
+ | | +- SwitchLabel[@Default = false]
+ | | | +- TypePattern[@ParenthesisDepth = 0]
+ | | | +- Type[@Array = false, @ArrayDepth = 0, @ArrayType = false, @TypeImage = "Integer"]
+ | | | | +- ReferenceType[@Array = false, @ArrayDepth = 0]
+ | | | | +- ClassOrInterfaceType[@AnonymousClass = false, @Array = false, @ArrayDepth = 0, @Image = "Integer", @ReferenceToClassSameCompilationUnit = false]
+ | | | +- VariableDeclaratorId[@Array = false, @ArrayDepth = 0, @ArrayType = false, @ExceptionBlockParameter = false, @ExplicitReceiverParameter = false, @Field = false, @Final = false, @ForeachVariable = false, @FormalParameter = false, @Image = "i", @LambdaParameter = false, @LocalVariable = false, @Name = "i", @PatternBinding = true, @ResourceDeclaration = false, @TypeInferred = false, @VariableName = "i"]
+ | | +- Expression[@StandAlonePrimitive = false]
+ | | +- PrimaryExpression[]
+ | | +- PrimaryPrefix[@SuperModifier = false, @ThisModifier = false]
+ | | +- Name[@Image = "i"]
+ | +- SwitchLabeledExpression[]
+ | +- SwitchLabel[@Default = true]
+ | +- Expression[@StandAlonePrimitive = true]
+ | +- PrimaryExpression[]
+ | +- PrimaryPrefix[@SuperModifier = false, @ThisModifier = false]
+ | +- Literal[@CharLiteral = false, @DoubleLiteral = false, @EscapedStringLiteral = "0", @FloatLiteral = false, @Image = "0", @IntLiteral = true, @LongLiteral = false, @SingleCharacterStringLiteral = false, @StringLiteral = false, @TextBlock = false, @TextBlockContent = "0", @ValueAsDouble = NaN, @ValueAsFloat = NaN, @ValueAsInt = 0, @ValueAsLong = 0]
+ +- ClassOrInterfaceBodyDeclaration[@AnonymousInnerClass = false, @EnumChild = false, @Kind = DeclarationKind.METHOD]
+ | +- MethodDeclaration[@Abstract = false, @Arity = 1, @Default = false, @Final = false, @InterfaceMember = false, @Kind = MethodLikeKind.METHOD, @MethodName = "coverageDefaultCase", @Modifiers = 16, @Name = "coverageDefaultCase", @Native = false, @PackagePrivate = true, @Private = false, @Protected = false, @Public = false, @Static = true, @Strictfp = false, @Synchronized = false, @SyntacticallyAbstract = false, @SyntacticallyPublic = false, @Transient = false, @Void = false, @Volatile = false]
+ | +- ResultType[@Void = false, @returnsArray = false]
+ | | +- Type[@Array = false, @ArrayDepth = 0, @ArrayType = false, @TypeImage = "int"]
+ | | +- PrimitiveType[@Array = false, @ArrayDepth = 0, @Boolean = false, @Image = "int"]
+ | +- MethodDeclarator[@Image = "coverageDefaultCase", @ParameterCount = 1]
+ | | +- FormalParameters[@ParameterCount = 1, @Size = 1]
+ | | +- FormalParameter[@Abstract = false, @Array = false, @ArrayDepth = 0, @Default = false, @ExplicitReceiverParameter = false, @Final = false, @Modifiers = 0, @Native = false, @PackagePrivate = true, @Private = false, @Protected = false, @Public = false, @Static = false, @Strictfp = false, @Synchronized = false, @Transient = false, @TypeInferred = false, @Varargs = false, @Volatile = false]
+ | | +- Type[@Array = false, @ArrayDepth = 0, @ArrayType = false, @TypeImage = "Object"]
+ | | | +- ReferenceType[@Array = false, @ArrayDepth = 0]
+ | | | +- ClassOrInterfaceType[@AnonymousClass = false, @Array = false, @ArrayDepth = 0, @Image = "Object", @ReferenceToClassSameCompilationUnit = false]
+ | | +- VariableDeclaratorId[@Array = false, @ArrayDepth = 0, @ArrayType = false, @ExceptionBlockParameter = false, @ExplicitReceiverParameter = false, @Field = false, @Final = false, @ForeachVariable = false, @FormalParameter = true, @Image = "o", @LambdaParameter = false, @LocalVariable = false, @Name = "o", @PatternBinding = false, @ResourceDeclaration = false, @TypeInferred = false, @VariableName = "o"]
+ | +- Block[@containsComment = false]
+ | +- BlockStatement[@Allocation = false]
+ | +- Statement[]
+ | +- ReturnStatement[]
+ | +- Expression[@StandAlonePrimitive = false]
+ | +- SwitchExpression[]
+ | +- Expression[@StandAlonePrimitive = false]
+ | | +- PrimaryExpression[]
+ | | +- PrimaryPrefix[@SuperModifier = false, @ThisModifier = false]
+ | | +- Name[@Image = "o"]
+ | +- SwitchLabeledExpression[]
+ | | +- SwitchLabel[@Default = false]
+ | | | +- TypePattern[@ParenthesisDepth = 0]
+ | | | +- Type[@Array = false, @ArrayDepth = 0, @ArrayType = false, @TypeImage = "String"]
+ | | | | +- ReferenceType[@Array = false, @ArrayDepth = 0]
+ | | | | +- ClassOrInterfaceType[@AnonymousClass = false, @Array = false, @ArrayDepth = 0, @Image = "String", @ReferenceToClassSameCompilationUnit = false]
+ | | | +- VariableDeclaratorId[@Array = false, @ArrayDepth = 0, @ArrayType = false, @ExceptionBlockParameter = false, @ExplicitReceiverParameter = false, @Field = false, @Final = false, @ForeachVariable = false, @FormalParameter = false, @Image = "s", @LambdaParameter = false, @LocalVariable = false, @Name = "s", @PatternBinding = true, @ResourceDeclaration = false, @TypeInferred = false, @VariableName = "s"]
+ | | +- Expression[@StandAlonePrimitive = false]
+ | | +- PrimaryExpression[]
+ | | +- PrimaryPrefix[@SuperModifier = false, @ThisModifier = false]
+ | | | +- Name[@Image = "s.length"]
+ | | +- PrimarySuffix[@ArgumentCount = 0, @Arguments = true, @ArrayDereference = false]
+ | | +- Arguments[@ArgumentCount = 0, @Size = 0]
+ | +- SwitchLabeledExpression[]
+ | | +- SwitchLabel[@Default = false]
+ | | | +- TypePattern[@ParenthesisDepth = 0]
+ | | | +- Type[@Array = false, @ArrayDepth = 0, @ArrayType = false, @TypeImage = "Integer"]
+ | | | | +- ReferenceType[@Array = false, @ArrayDepth = 0]
+ | | | | +- ClassOrInterfaceType[@AnonymousClass = false, @Array = false, @ArrayDepth = 0, @Image = "Integer", @ReferenceToClassSameCompilationUnit = false]
+ | | | +- VariableDeclaratorId[@Array = false, @ArrayDepth = 0, @ArrayType = false, @ExceptionBlockParameter = false, @ExplicitReceiverParameter = false, @Field = false, @Final = false, @ForeachVariable = false, @FormalParameter = false, @Image = "i", @LambdaParameter = false, @LocalVariable = false, @Name = "i", @PatternBinding = true, @ResourceDeclaration = false, @TypeInferred = false, @VariableName = "i"]
+ | | +- Expression[@StandAlonePrimitive = false]
+ | | +- PrimaryExpression[]
+ | | +- PrimaryPrefix[@SuperModifier = false, @ThisModifier = false]
+ | | +- Name[@Image = "i"]
+ | +- SwitchLabeledExpression[]
+ | +- SwitchLabel[@Default = true]
+ | +- Expression[@StandAlonePrimitive = true]
+ | +- PrimaryExpression[]
+ | +- PrimaryPrefix[@SuperModifier = false, @ThisModifier = false]
+ | +- Literal[@CharLiteral = false, @DoubleLiteral = false, @EscapedStringLiteral = "0", @FloatLiteral = false, @Image = "0", @IntLiteral = true, @LongLiteral = false, @SingleCharacterStringLiteral = false, @StringLiteral = false, @TextBlock = false, @TextBlockContent = "0", @ValueAsDouble = NaN, @ValueAsFloat = NaN, @ValueAsInt = 0, @ValueAsLong = 0]
+ +- ClassOrInterfaceBodyDeclaration[@AnonymousInnerClass = false, @EnumChild = false, @Kind = DeclarationKind.METHOD]
+ | +- MethodDeclaration[@Abstract = false, @Arity = 1, @Default = false, @Final = false, @InterfaceMember = false, @Kind = MethodLikeKind.METHOD, @MethodName = "coverageStatement", @Modifiers = 16, @Name = "coverageStatement", @Native = false, @PackagePrivate = true, @Private = false, @Protected = false, @Public = false, @Static = true, @Strictfp = false, @Synchronized = false, @SyntacticallyAbstract = false, @SyntacticallyPublic = false, @Transient = false, @Void = true, @Volatile = false]
+ | +- ResultType[@Void = true, @returnsArray = false]
+ | +- MethodDeclarator[@Image = "coverageStatement", @ParameterCount = 1]
+ | | +- FormalParameters[@ParameterCount = 1, @Size = 1]
+ | | +- FormalParameter[@Abstract = false, @Array = false, @ArrayDepth = 0, @Default = false, @ExplicitReceiverParameter = false, @Final = false, @Modifiers = 0, @Native = false, @PackagePrivate = true, @Private = false, @Protected = false, @Public = false, @Static = false, @Strictfp = false, @Synchronized = false, @Transient = false, @TypeInferred = false, @Varargs = false, @Volatile = false]
+ | | +- Type[@Array = false, @ArrayDepth = 0, @ArrayType = false, @TypeImage = "Object"]
+ | | | +- ReferenceType[@Array = false, @ArrayDepth = 0]
+ | | | +- ClassOrInterfaceType[@AnonymousClass = false, @Array = false, @ArrayDepth = 0, @Image = "Object", @ReferenceToClassSameCompilationUnit = false]
+ | | +- VariableDeclaratorId[@Array = false, @ArrayDepth = 0, @ArrayType = false, @ExceptionBlockParameter = false, @ExplicitReceiverParameter = false, @Field = false, @Final = false, @ForeachVariable = false, @FormalParameter = true, @Image = "o", @LambdaParameter = false, @LocalVariable = false, @Name = "o", @PatternBinding = false, @ResourceDeclaration = false, @TypeInferred = false, @VariableName = "o"]
+ | +- Block[@containsComment = false]
+ | +- BlockStatement[@Allocation = false]
+ | +- Statement[]
+ | +- SwitchStatement[@DefaultCase = true, @ExhaustiveEnumSwitch = false, @FallthroughSwitch = true]
+ | +- Expression[@StandAlonePrimitive = false]
+ | | +- PrimaryExpression[]
+ | | +- PrimaryPrefix[@SuperModifier = false, @ThisModifier = false]
+ | | +- Name[@Image = "o"]
+ | +- SwitchLabel[@Default = false]
+ | | +- TypePattern[@ParenthesisDepth = 0]
+ | | +- Type[@Array = false, @ArrayDepth = 0, @ArrayType = false, @TypeImage = "String"]
+ | | | +- ReferenceType[@Array = false, @ArrayDepth = 0]
+ | | | +- ClassOrInterfaceType[@AnonymousClass = false, @Array = false, @ArrayDepth = 0, @Image = "String", @ReferenceToClassSameCompilationUnit = false]
+ | | +- VariableDeclaratorId[@Array = false, @ArrayDepth = 0, @ArrayType = false, @ExceptionBlockParameter = false, @ExplicitReceiverParameter = false, @Field = false, @Final = false, @ForeachVariable = false, @FormalParameter = false, @Image = "s", @LambdaParameter = false, @LocalVariable = false, @Name = "s", @PatternBinding = true, @ResourceDeclaration = false, @TypeInferred = false, @VariableName = "s"]
+ | +- BlockStatement[@Allocation = false]
+ | | +- Statement[]
+ | | +- StatementExpression[]
+ | | +- PrimaryExpression[]
+ | | +- PrimaryPrefix[@SuperModifier = false, @ThisModifier = false]
+ | | | +- Name[@Image = "System.out.println"]
+ | | +- PrimarySuffix[@ArgumentCount = 1, @Arguments = true, @ArrayDereference = false]
+ | | +- Arguments[@ArgumentCount = 1, @Size = 1]
+ | | +- ArgumentList[@Size = 1]
+ | | +- Expression[@StandAlonePrimitive = false]
+ | | +- PrimaryExpression[]
+ | | +- PrimaryPrefix[@SuperModifier = false, @ThisModifier = false]
+ | | +- Name[@Image = "s"]
+ | +- BlockStatement[@Allocation = false]
+ | | +- Statement[]
+ | | +- BreakStatement[]
+ | +- SwitchLabel[@Default = false]
+ | | +- TypePattern[@ParenthesisDepth = 0]
+ | | +- Type[@Array = false, @ArrayDepth = 0, @ArrayType = false, @TypeImage = "Integer"]
+ | | | +- ReferenceType[@Array = false, @ArrayDepth = 0]
+ | | | +- ClassOrInterfaceType[@AnonymousClass = false, @Array = false, @ArrayDepth = 0, @Image = "Integer", @ReferenceToClassSameCompilationUnit = false]
+ | | +- VariableDeclaratorId[@Array = false, @ArrayDepth = 0, @ArrayType = false, @ExceptionBlockParameter = false, @ExplicitReceiverParameter = false, @Field = false, @Final = false, @ForeachVariable = false, @FormalParameter = false, @Image = "i", @LambdaParameter = false, @LocalVariable = false, @Name = "i", @PatternBinding = true, @ResourceDeclaration = false, @TypeInferred = false, @VariableName = "i"]
+ | +- BlockStatement[@Allocation = false]
+ | | +- Statement[]
+ | | +- StatementExpression[]
+ | | +- PrimaryExpression[]
+ | | +- PrimaryPrefix[@SuperModifier = false, @ThisModifier = false]
+ | | | +- Name[@Image = "System.out.println"]
+ | | +- PrimarySuffix[@ArgumentCount = 1, @Arguments = true, @ArrayDereference = false]
+ | | +- Arguments[@ArgumentCount = 1, @Size = 1]
+ | | +- ArgumentList[@Size = 1]
+ | | +- Expression[@StandAlonePrimitive = false]
+ | | +- PrimaryExpression[]
+ | | +- PrimaryPrefix[@SuperModifier = false, @ThisModifier = false]
+ | | +- Literal[@CharLiteral = false, @DoubleLiteral = false, @EscapedStringLiteral = "\"Integer\"", @FloatLiteral = false, @Image = "\"Integer\"", @IntLiteral = false, @LongLiteral = false, @SingleCharacterStringLiteral = false, @StringLiteral = true, @TextBlock = false, @TextBlockContent = "\"Integer\"", @ValueAsDouble = NaN, @ValueAsFloat = NaN, @ValueAsInt = 0, @ValueAsLong = 0]
+ | +- BlockStatement[@Allocation = false]
+ | | +- Statement[]
+ | | +- BreakStatement[]
+ | +- SwitchLabel[@Default = true]
+ | +- BlockStatement[@Allocation = false]
+ | +- Statement[]
+ | +- BreakStatement[]
+ +- ClassOrInterfaceBodyDeclaration[@AnonymousInnerClass = false, @EnumChild = false, @Kind = DeclarationKind.INTERFACE]
+ | +- ClassOrInterfaceDeclaration[@Abstract = false, @BinaryName = "ExhaustiveSwitch$S", @Default = false, @Final = false, @Image = "S", @Interface = true, @Local = false, @Modifiers = 16384, @Native = false, @Nested = true, @NonSealed = false, @PackagePrivate = true, @Private = false, @Protected = false, @Public = false, @Sealed = true, @SimpleName = "S", @Static = false, @Strictfp = false, @Synchronized = false, @Transient = false, @TypeKind = TypeKind.INTERFACE, @Volatile = false]
+ | +- PermitsList[]
+ | | +- ClassOrInterfaceType[@AnonymousClass = false, @Array = false, @ArrayDepth = 0, @Image = "A", @ReferenceToClassSameCompilationUnit = true]
+ | | +- ClassOrInterfaceType[@AnonymousClass = false, @Array = false, @ArrayDepth = 0, @Image = "B", @ReferenceToClassSameCompilationUnit = true]
+ | | +- ClassOrInterfaceType[@AnonymousClass = false, @Array = false, @ArrayDepth = 0, @Image = "C", @ReferenceToClassSameCompilationUnit = false]
+ | +- ClassOrInterfaceBody[@AnonymousInnerClass = false, @EnumChild = false]
+ +- ClassOrInterfaceBodyDeclaration[@AnonymousInnerClass = false, @EnumChild = false, @Kind = DeclarationKind.CLASS]
+ | +- ClassOrInterfaceDeclaration[@Abstract = false, @BinaryName = "ExhaustiveSwitch$A", @Default = false, @Final = true, @Image = "A", @Interface = false, @Local = false, @Modifiers = 48, @Native = false, @Nested = true, @NonSealed = false, @PackagePrivate = true, @Private = false, @Protected = false, @Public = false, @Sealed = false, @SimpleName = "A", @Static = true, @Strictfp = false, @Synchronized = false, @Transient = false, @TypeKind = TypeKind.CLASS, @Volatile = false]
+ | +- ImplementsList[]
+ | | +- ClassOrInterfaceType[@AnonymousClass = false, @Array = false, @ArrayDepth = 0, @Image = "S", @ReferenceToClassSameCompilationUnit = true]
+ | +- ClassOrInterfaceBody[@AnonymousInnerClass = false, @EnumChild = false]
+ +- ClassOrInterfaceBodyDeclaration[@AnonymousInnerClass = false, @EnumChild = false, @Kind = DeclarationKind.CLASS]
+ | +- ClassOrInterfaceDeclaration[@Abstract = false, @BinaryName = "ExhaustiveSwitch$B", @Default = false, @Final = true, @Image = "B", @Interface = false, @Local = false, @Modifiers = 48, @Native = false, @Nested = true, @NonSealed = false, @PackagePrivate = true, @Private = false, @Protected = false, @Public = false, @Sealed = false, @SimpleName = "B", @Static = true, @Strictfp = false, @Synchronized = false, @Transient = false, @TypeKind = TypeKind.CLASS, @Volatile = false]
+ | +- ImplementsList[]
+ | | +- ClassOrInterfaceType[@AnonymousClass = false, @Array = false, @ArrayDepth = 0, @Image = "S", @ReferenceToClassSameCompilationUnit = true]
+ | +- ClassOrInterfaceBody[@AnonymousInnerClass = false, @EnumChild = false]
+ +- ClassOrInterfaceBodyDeclaration[@AnonymousInnerClass = false, @EnumChild = false, @Kind = DeclarationKind.RECORD]
+ | +- RecordDeclaration[@Abstract = false, @BinaryName = "ExhaustiveSwitch$C", @Default = false, @Final = true, @Image = "C", @Local = false, @Modifiers = 0, @Native = false, @Nested = true, @PackagePrivate = true, @Private = false, @Protected = false, @Public = false, @SimpleName = "C", @Static = false, @Strictfp = false, @Synchronized = false, @SyntacticallyFinal = false, @Transient = false, @TypeKind = TypeKind.RECORD, @Volatile = false]
+ | +- RecordComponentList[@Size = 1]
+ | | +- RecordComponent[@Varargs = false]
+ | | +- Type[@Array = false, @ArrayDepth = 0, @ArrayType = false, @TypeImage = "int"]
+ | | | +- PrimitiveType[@Array = false, @ArrayDepth = 0, @Boolean = false, @Image = "int"]
+ | | +- VariableDeclaratorId[@Array = false, @ArrayDepth = 0, @ArrayType = false, @ExceptionBlockParameter = false, @ExplicitReceiverParameter = false, @Field = false, @Final = true, @ForeachVariable = false, @FormalParameter = false, @Image = "i", @LambdaParameter = false, @LocalVariable = false, @Name = "i", @PatternBinding = false, @ResourceDeclaration = false, @TypeInferred = false, @VariableName = "i"]
+ | +- ImplementsList[]
+ | | +- ClassOrInterfaceType[@AnonymousClass = false, @Array = false, @ArrayDepth = 0, @Image = "S", @ReferenceToClassSameCompilationUnit = true]
+ | +- RecordBody[]
+ +- ClassOrInterfaceBodyDeclaration[@AnonymousInnerClass = false, @EnumChild = false, @Kind = DeclarationKind.METHOD]
+ | +- MethodDeclaration[@Abstract = false, @Arity = 1, @Default = false, @Final = false, @InterfaceMember = false, @Kind = MethodLikeKind.METHOD, @MethodName = "testSealedExhaustive", @Modifiers = 16, @Name = "testSealedExhaustive", @Native = false, @PackagePrivate = true, @Private = false, @Protected = false, @Public = false, @Static = true, @Strictfp = false, @Synchronized = false, @SyntacticallyAbstract = false, @SyntacticallyPublic = false, @Transient = false, @Void = false, @Volatile = false]
+ | +- ResultType[@Void = false, @returnsArray = false]
+ | | +- Type[@Array = false, @ArrayDepth = 0, @ArrayType = false, @TypeImage = "int"]
+ | | +- PrimitiveType[@Array = false, @ArrayDepth = 0, @Boolean = false, @Image = "int"]
+ | +- MethodDeclarator[@Image = "testSealedExhaustive", @ParameterCount = 1]
+ | | +- FormalParameters[@ParameterCount = 1, @Size = 1]
+ | | +- FormalParameter[@Abstract = false, @Array = false, @ArrayDepth = 0, @Default = false, @ExplicitReceiverParameter = false, @Final = false, @Modifiers = 0, @Native = false, @PackagePrivate = true, @Private = false, @Protected = false, @Public = false, @Static = false, @Strictfp = false, @Synchronized = false, @Transient = false, @TypeInferred = false, @Varargs = false, @Volatile = false]
+ | | +- Type[@Array = false, @ArrayDepth = 0, @ArrayType = false, @TypeImage = "S"]
+ | | | +- ReferenceType[@Array = false, @ArrayDepth = 0]
+ | | | +- ClassOrInterfaceType[@AnonymousClass = false, @Array = false, @ArrayDepth = 0, @Image = "S", @ReferenceToClassSameCompilationUnit = true]
+ | | +- VariableDeclaratorId[@Array = false, @ArrayDepth = 0, @ArrayType = false, @ExceptionBlockParameter = false, @ExplicitReceiverParameter = false, @Field = false, @Final = false, @ForeachVariable = false, @FormalParameter = true, @Image = "s", @LambdaParameter = false, @LocalVariable = false, @Name = "s", @PatternBinding = false, @ResourceDeclaration = false, @TypeInferred = false, @VariableName = "s"]
+ | +- Block[@containsComment = false]
+ | +- BlockStatement[@Allocation = false]
+ | +- Statement[]
+ | +- ReturnStatement[]
+ | +- Expression[@StandAlonePrimitive = false]
+ | +- SwitchExpression[]
+ | +- Expression[@StandAlonePrimitive = false]
+ | | +- PrimaryExpression[]
+ | | +- PrimaryPrefix[@SuperModifier = false, @ThisModifier = false]
+ | | +- Name[@Image = "s"]
+ | +- SwitchLabeledExpression[]
+ | | +- SwitchLabel[@Default = false]
+ | | | +- TypePattern[@ParenthesisDepth = 0]
+ | | | +- Type[@Array = false, @ArrayDepth = 0, @ArrayType = false, @TypeImage = "A"]
+ | | | | +- ReferenceType[@Array = false, @ArrayDepth = 0]
+ | | | | +- ClassOrInterfaceType[@AnonymousClass = false, @Array = false, @ArrayDepth = 0, @Image = "A", @ReferenceToClassSameCompilationUnit = true]
+ | | | +- VariableDeclaratorId[@Array = false, @ArrayDepth = 0, @ArrayType = false, @ExceptionBlockParameter = false, @ExplicitReceiverParameter = false, @Field = false, @Final = false, @ForeachVariable = false, @FormalParameter = false, @Image = "a", @LambdaParameter = false, @LocalVariable = false, @Name = "a", @PatternBinding = true, @ResourceDeclaration = false, @TypeInferred = false, @VariableName = "a"]
+ | | +- Expression[@StandAlonePrimitive = true]
+ | | +- PrimaryExpression[]
+ | | +- PrimaryPrefix[@SuperModifier = false, @ThisModifier = false]
+ | | +- Literal[@CharLiteral = false, @DoubleLiteral = false, @EscapedStringLiteral = "1", @FloatLiteral = false, @Image = "1", @IntLiteral = true, @LongLiteral = false, @SingleCharacterStringLiteral = false, @StringLiteral = false, @TextBlock = false, @TextBlockContent = "1", @ValueAsDouble = NaN, @ValueAsFloat = NaN, @ValueAsInt = 1, @ValueAsLong = 1]
+ | +- SwitchLabeledExpression[]
+ | | +- SwitchLabel[@Default = false]
+ | | | +- TypePattern[@ParenthesisDepth = 0]
+ | | | +- Type[@Array = false, @ArrayDepth = 0, @ArrayType = false, @TypeImage = "B"]
+ | | | | +- ReferenceType[@Array = false, @ArrayDepth = 0]
+ | | | | +- ClassOrInterfaceType[@AnonymousClass = false, @Array = false, @ArrayDepth = 0, @Image = "B", @ReferenceToClassSameCompilationUnit = true]
+ | | | +- VariableDeclaratorId[@Array = false, @ArrayDepth = 0, @ArrayType = false, @ExceptionBlockParameter = false, @ExplicitReceiverParameter = false, @Field = false, @Final = false, @ForeachVariable = false, @FormalParameter = false, @Image = "b", @LambdaParameter = false, @LocalVariable = false, @Name = "b", @PatternBinding = true, @ResourceDeclaration = false, @TypeInferred = false, @VariableName = "b"]
+ | | +- Expression[@StandAlonePrimitive = true]
+ | | +- PrimaryExpression[]
+ | | +- PrimaryPrefix[@SuperModifier = false, @ThisModifier = false]
+ | | +- Literal[@CharLiteral = false, @DoubleLiteral = false, @EscapedStringLiteral = "2", @FloatLiteral = false, @Image = "2", @IntLiteral = true, @LongLiteral = false, @SingleCharacterStringLiteral = false, @StringLiteral = false, @TextBlock = false, @TextBlockContent = "2", @ValueAsDouble = NaN, @ValueAsFloat = NaN, @ValueAsInt = 2, @ValueAsLong = 2]
+ | +- SwitchLabeledExpression[]
+ | +- SwitchLabel[@Default = false]
+ | | +- TypePattern[@ParenthesisDepth = 0]
+ | | +- Type[@Array = false, @ArrayDepth = 0, @ArrayType = false, @TypeImage = "C"]
+ | | | +- ReferenceType[@Array = false, @ArrayDepth = 0]
+ | | | +- ClassOrInterfaceType[@AnonymousClass = false, @Array = false, @ArrayDepth = 0, @Image = "C", @ReferenceToClassSameCompilationUnit = false]
+ | | +- VariableDeclaratorId[@Array = false, @ArrayDepth = 0, @ArrayType = false, @ExceptionBlockParameter = false, @ExplicitReceiverParameter = false, @Field = false, @Final = false, @ForeachVariable = false, @FormalParameter = false, @Image = "c", @LambdaParameter = false, @LocalVariable = false, @Name = "c", @PatternBinding = true, @ResourceDeclaration = false, @TypeInferred = false, @VariableName = "c"]
+ | +- Expression[@StandAlonePrimitive = true]
+ | +- PrimaryExpression[]
+ | +- PrimaryPrefix[@SuperModifier = false, @ThisModifier = false]
+ | +- Literal[@CharLiteral = false, @DoubleLiteral = false, @EscapedStringLiteral = "3", @FloatLiteral = false, @Image = "3", @IntLiteral = true, @LongLiteral = false, @SingleCharacterStringLiteral = false, @StringLiteral = false, @TextBlock = false, @TextBlockContent = "3", @ValueAsDouble = NaN, @ValueAsFloat = NaN, @ValueAsInt = 3, @ValueAsLong = 3]
+ +- ClassOrInterfaceBodyDeclaration[@AnonymousInnerClass = false, @EnumChild = false, @Kind = DeclarationKind.METHOD]
+ | +- MethodDeclaration[@Abstract = false, @Arity = 1, @Default = false, @Final = false, @InterfaceMember = false, @Kind = MethodLikeKind.METHOD, @MethodName = "switchStatementExhaustive", @Modifiers = 16, @Name = "switchStatementExhaustive", @Native = false, @PackagePrivate = true, @Private = false, @Protected = false, @Public = false, @Static = true, @Strictfp = false, @Synchronized = false, @SyntacticallyAbstract = false, @SyntacticallyPublic = false, @Transient = false, @Void = true, @Volatile = false]
+ | +- ResultType[@Void = true, @returnsArray = false]
+ | +- MethodDeclarator[@Image = "switchStatementExhaustive", @ParameterCount = 1]
+ | | +- FormalParameters[@ParameterCount = 1, @Size = 1]
+ | | +- FormalParameter[@Abstract = false, @Array = false, @ArrayDepth = 0, @Default = false, @ExplicitReceiverParameter = false, @Final = false, @Modifiers = 0, @Native = false, @PackagePrivate = true, @Private = false, @Protected = false, @Public = false, @Static = false, @Strictfp = false, @Synchronized = false, @Transient = false, @TypeInferred = false, @Varargs = false, @Volatile = false]
+ | | +- Type[@Array = false, @ArrayDepth = 0, @ArrayType = false, @TypeImage = "S"]
+ | | | +- ReferenceType[@Array = false, @ArrayDepth = 0]
+ | | | +- ClassOrInterfaceType[@AnonymousClass = false, @Array = false, @ArrayDepth = 0, @Image = "S", @ReferenceToClassSameCompilationUnit = true]
+ | | +- VariableDeclaratorId[@Array = false, @ArrayDepth = 0, @ArrayType = false, @ExceptionBlockParameter = false, @ExplicitReceiverParameter = false, @Field = false, @Final = false, @ForeachVariable = false, @FormalParameter = true, @Image = "s", @LambdaParameter = false, @LocalVariable = false, @Name = "s", @PatternBinding = false, @ResourceDeclaration = false, @TypeInferred = false, @VariableName = "s"]
+ | +- Block[@containsComment = false]
+ | +- BlockStatement[@Allocation = false]
+ | | +- Statement[]
+ | | +- SwitchStatement[@DefaultCase = true, @ExhaustiveEnumSwitch = false, @FallthroughSwitch = true]
+ | | +- Expression[@StandAlonePrimitive = false]
+ | | | +- PrimaryExpression[]
+ | | | +- PrimaryPrefix[@SuperModifier = false, @ThisModifier = false]
+ | | | +- Name[@Image = "s"]
+ | | +- SwitchLabel[@Default = false]
+ | | | +- TypePattern[@ParenthesisDepth = 0]
+ | | | +- Type[@Array = false, @ArrayDepth = 0, @ArrayType = false, @TypeImage = "A"]
+ | | | | +- ReferenceType[@Array = false, @ArrayDepth = 0]
+ | | | | +- ClassOrInterfaceType[@AnonymousClass = false, @Array = false, @ArrayDepth = 0, @Image = "A", @ReferenceToClassSameCompilationUnit = true]
+ | | | +- VariableDeclaratorId[@Array = false, @ArrayDepth = 0, @ArrayType = false, @ExceptionBlockParameter = false, @ExplicitReceiverParameter = false, @Field = false, @Final = false, @ForeachVariable = false, @FormalParameter = false, @Image = "a", @LambdaParameter = false, @LocalVariable = false, @Name = "a", @PatternBinding = true, @ResourceDeclaration = false, @TypeInferred = false, @VariableName = "a"]
+ | | +- BlockStatement[@Allocation = false]
+ | | | +- Statement[]
+ | | | +- StatementExpression[]
+ | | | +- PrimaryExpression[]
+ | | | +- PrimaryPrefix[@SuperModifier = false, @ThisModifier = false]
+ | | | | +- Name[@Image = "System.out.println"]
+ | | | +- PrimarySuffix[@ArgumentCount = 1, @Arguments = true, @ArrayDereference = false]
+ | | | +- Arguments[@ArgumentCount = 1, @Size = 1]
+ | | | +- ArgumentList[@Size = 1]
+ | | | +- Expression[@StandAlonePrimitive = false]
+ | | | +- PrimaryExpression[]
+ | | | +- PrimaryPrefix[@SuperModifier = false, @ThisModifier = false]
+ | | | +- Literal[@CharLiteral = false, @DoubleLiteral = false, @EscapedStringLiteral = "\"A\"", @FloatLiteral = false, @Image = "\"A\"", @IntLiteral = false, @LongLiteral = false, @SingleCharacterStringLiteral = true, @StringLiteral = true, @TextBlock = false, @TextBlockContent = "\"A\"", @ValueAsDouble = NaN, @ValueAsFloat = NaN, @ValueAsInt = 0, @ValueAsLong = 0]
+ | | +- BlockStatement[@Allocation = false]
+ | | | +- Statement[]
+ | | | +- BreakStatement[]
+ | | +- SwitchLabel[@Default = false]
+ | | | +- TypePattern[@ParenthesisDepth = 0]
+ | | | +- Type[@Array = false, @ArrayDepth = 0, @ArrayType = false, @TypeImage = "C"]
+ | | | | +- ReferenceType[@Array = false, @ArrayDepth = 0]
+ | | | | +- ClassOrInterfaceType[@AnonymousClass = false, @Array = false, @ArrayDepth = 0, @Image = "C", @ReferenceToClassSameCompilationUnit = false]
+ | | | +- VariableDeclaratorId[@Array = false, @ArrayDepth = 0, @ArrayType = false, @ExceptionBlockParameter = false, @ExplicitReceiverParameter = false, @Field = false, @Final = false, @ForeachVariable = false, @FormalParameter = false, @Image = "c", @LambdaParameter = false, @LocalVariable = false, @Name = "c", @PatternBinding = true, @ResourceDeclaration = false, @TypeInferred = false, @VariableName = "c"]
+ | | +- BlockStatement[@Allocation = false]
+ | | | +- Statement[]
+ | | | +- StatementExpression[]
+ | | | +- PrimaryExpression[]
+ | | | +- PrimaryPrefix[@SuperModifier = false, @ThisModifier = false]
+ | | | | +- Name[@Image = "System.out.println"]
+ | | | +- PrimarySuffix[@ArgumentCount = 1, @Arguments = true, @ArrayDereference = false]
+ | | | +- Arguments[@ArgumentCount = 1, @Size = 1]
+ | | | +- ArgumentList[@Size = 1]
+ | | | +- Expression[@StandAlonePrimitive = false]
+ | | | +- PrimaryExpression[]
+ | | | +- PrimaryPrefix[@SuperModifier = false, @ThisModifier = false]
+ | | | +- Literal[@CharLiteral = false, @DoubleLiteral = false, @EscapedStringLiteral = "\"C\"", @FloatLiteral = false, @Image = "\"C\"", @IntLiteral = false, @LongLiteral = false, @SingleCharacterStringLiteral = true, @StringLiteral = true, @TextBlock = false, @TextBlockContent = "\"C\"", @ValueAsDouble = NaN, @ValueAsFloat = NaN, @ValueAsInt = 0, @ValueAsLong = 0]
+ | | +- BlockStatement[@Allocation = false]
+ | | | +- Statement[]
+ | | | +- BreakStatement[]
+ | | +- SwitchLabel[@Default = true]
+ | | +- BlockStatement[@Allocation = false]
+ | | | +- Statement[]
+ | | | +- StatementExpression[]
+ | | | +- PrimaryExpression[]
+ | | | +- PrimaryPrefix[@SuperModifier = false, @ThisModifier = false]
+ | | | | +- Name[@Image = "System.out.println"]
+ | | | +- PrimarySuffix[@ArgumentCount = 1, @Arguments = true, @ArrayDereference = false]
+ | | | +- Arguments[@ArgumentCount = 1, @Size = 1]
+ | | | +- ArgumentList[@Size = 1]
+ | | | +- Expression[@StandAlonePrimitive = false]
+ | | | +- PrimaryExpression[]
+ | | | +- PrimaryPrefix[@SuperModifier = false, @ThisModifier = false]
+ | | | +- Literal[@CharLiteral = false, @DoubleLiteral = false, @EscapedStringLiteral = "\"default case, should be B\"", @FloatLiteral = false, @Image = "\"default case, should be B\"", @IntLiteral = false, @LongLiteral = false, @SingleCharacterStringLiteral = false, @StringLiteral = true, @TextBlock = false, @TextBlockContent = "\"default case, should be B\"", @ValueAsDouble = NaN, @ValueAsFloat = NaN, @ValueAsInt = 0, @ValueAsLong = 0]
+ | | +- BlockStatement[@Allocation = false]
+ | | +- Statement[]
+ | | +- BreakStatement[]
+ | +- BlockStatement[@Allocation = false]
+ | +- Statement[]
+ | +- EmptyStatement[]
+ +- ClassOrInterfaceBodyDeclaration[@AnonymousInnerClass = false, @EnumChild = false, @Kind = DeclarationKind.INTERFACE]
+ | +- ClassOrInterfaceDeclaration[@Abstract = false, @BinaryName = "ExhaustiveSwitch$I", @Default = false, @Final = false, @Image = "I", @Interface = true, @Local = false, @Modifiers = 16384, @Native = false, @Nested = true, @NonSealed = false, @PackagePrivate = true, @Private = false, @Protected = false, @Public = false, @Sealed = true, @SimpleName = "I", @Static = false, @Strictfp = false, @Synchronized = false, @Transient = false, @TypeKind = TypeKind.INTERFACE, @Volatile = false]
+ | +- TypeParameters[]
+ | | +- TypeParameter[@Image = "T", @Name = "T", @ParameterName = "T", @TypeBound = false]
+ | +- PermitsList[]
+ | | +- ClassOrInterfaceType[@AnonymousClass = false, @Array = false, @ArrayDepth = 0, @Image = "E", @ReferenceToClassSameCompilationUnit = true]
+ | | +- ClassOrInterfaceType[@AnonymousClass = false, @Array = false, @ArrayDepth = 0, @Image = "F", @ReferenceToClassSameCompilationUnit = true]
+ | +- ClassOrInterfaceBody[@AnonymousInnerClass = false, @EnumChild = false]
+ +- ClassOrInterfaceBodyDeclaration[@AnonymousInnerClass = false, @EnumChild = false, @Kind = DeclarationKind.CLASS]
+ | +- ClassOrInterfaceDeclaration[@Abstract = false, @BinaryName = "ExhaustiveSwitch$E", @Default = false, @Final = true, @Image = "E", @Interface = false, @Local = false, @Modifiers = 48, @Native = false, @Nested = true, @NonSealed = false, @PackagePrivate = true, @Private = false, @Protected = false, @Public = false, @Sealed = false, @SimpleName = "E", @Static = true, @Strictfp = false, @Synchronized = false, @Transient = false, @TypeKind = TypeKind.CLASS, @Volatile = false]
+ | +- TypeParameters[]
+ | | +- TypeParameter[@Image = "X", @Name = "X", @ParameterName = "X", @TypeBound = false]
+ | +- ImplementsList[]
+ | | +- ClassOrInterfaceType[@AnonymousClass = false, @Array = false, @ArrayDepth = 0, @Image = "I", @ReferenceToClassSameCompilationUnit = true]
+ | | +- TypeArguments[@Diamond = false]
+ | | +- TypeArgument[@Wildcard = false]
+ | | +- ReferenceType[@Array = false, @ArrayDepth = 0]
+ | | +- ClassOrInterfaceType[@AnonymousClass = false, @Array = false, @ArrayDepth = 0, @Image = "String", @ReferenceToClassSameCompilationUnit = false]
+ | +- ClassOrInterfaceBody[@AnonymousInnerClass = false, @EnumChild = false]
+ +- ClassOrInterfaceBodyDeclaration[@AnonymousInnerClass = false, @EnumChild = false, @Kind = DeclarationKind.CLASS]
+ | +- ClassOrInterfaceDeclaration[@Abstract = false, @BinaryName = "ExhaustiveSwitch$F", @Default = false, @Final = true, @Image = "F", @Interface = false, @Local = false, @Modifiers = 48, @Native = false, @Nested = true, @NonSealed = false, @PackagePrivate = true, @Private = false, @Protected = false, @Public = false, @Sealed = false, @SimpleName = "F", @Static = true, @Strictfp = false, @Synchronized = false, @Transient = false, @TypeKind = TypeKind.CLASS, @Volatile = false]
+ | +- TypeParameters[]
+ | | +- TypeParameter[@Image = "Y", @Name = "Y", @ParameterName = "Y", @TypeBound = false]
+ | +- ImplementsList[]
+ | | +- ClassOrInterfaceType[@AnonymousClass = false, @Array = false, @ArrayDepth = 0, @Image = "I", @ReferenceToClassSameCompilationUnit = true]
+ | | +- TypeArguments[@Diamond = false]
+ | | +- TypeArgument[@Wildcard = false]
+ | | +- ReferenceType[@Array = false, @ArrayDepth = 0]
+ | | +- ClassOrInterfaceType[@AnonymousClass = false, @Array = false, @ArrayDepth = 0, @Image = "Y", @ReferenceToClassSameCompilationUnit = false]
+ | +- ClassOrInterfaceBody[@AnonymousInnerClass = false, @EnumChild = false]
+ +- ClassOrInterfaceBodyDeclaration[@AnonymousInnerClass = false, @EnumChild = false, @Kind = DeclarationKind.METHOD]
+ | +- MethodDeclaration[@Abstract = false, @Arity = 1, @Default = false, @Final = false, @InterfaceMember = false, @Kind = MethodLikeKind.METHOD, @MethodName = "testGenericSealedExhaustive", @Modifiers = 16, @Name = "testGenericSealedExhaustive", @Native = false, @PackagePrivate = true, @Private = false, @Protected = false, @Public = false, @Static = true, @Strictfp = false, @Synchronized = false, @SyntacticallyAbstract = false, @SyntacticallyPublic = false, @Transient = false, @Void = false, @Volatile = false]
+ | +- ResultType[@Void = false, @returnsArray = false]
+ | | +- Type[@Array = false, @ArrayDepth = 0, @ArrayType = false, @TypeImage = "int"]
+ | | +- PrimitiveType[@Array = false, @ArrayDepth = 0, @Boolean = false, @Image = "int"]
+ | +- MethodDeclarator[@Image = "testGenericSealedExhaustive", @ParameterCount = 1]
+ | | +- FormalParameters[@ParameterCount = 1, @Size = 1]
+ | | +- FormalParameter[@Abstract = false, @Array = false, @ArrayDepth = 0, @Default = false, @ExplicitReceiverParameter = false, @Final = false, @Modifiers = 0, @Native = false, @PackagePrivate = true, @Private = false, @Protected = false, @Public = false, @Static = false, @Strictfp = false, @Synchronized = false, @Transient = false, @TypeInferred = false, @Varargs = false, @Volatile = false]
+ | | +- Type[@Array = false, @ArrayDepth = 0, @ArrayType = false, @TypeImage = "I"]
+ | | | +- ReferenceType[@Array = false, @ArrayDepth = 0]
+ | | | +- ClassOrInterfaceType[@AnonymousClass = false, @Array = false, @ArrayDepth = 0, @Image = "I", @ReferenceToClassSameCompilationUnit = true]
+ | | | +- TypeArguments[@Diamond = false]
+ | | | +- TypeArgument[@Wildcard = false]
+ | | | +- ReferenceType[@Array = false, @ArrayDepth = 0]
+ | | | +- ClassOrInterfaceType[@AnonymousClass = false, @Array = false, @ArrayDepth = 0, @Image = "Integer", @ReferenceToClassSameCompilationUnit = false]
+ | | +- VariableDeclaratorId[@Array = false, @ArrayDepth = 0, @ArrayType = false, @ExceptionBlockParameter = false, @ExplicitReceiverParameter = false, @Field = false, @Final = false, @ForeachVariable = false, @FormalParameter = true, @Image = "i", @LambdaParameter = false, @LocalVariable = false, @Name = "i", @PatternBinding = false, @ResourceDeclaration = false, @TypeInferred = false, @VariableName = "i"]
+ | +- Block[@containsComment = false]
+ | +- BlockStatement[@Allocation = false]
+ | +- Statement[]
+ | +- ReturnStatement[]
+ | +- Expression[@StandAlonePrimitive = false]
+ | +- SwitchExpression[]
+ | +- Expression[@StandAlonePrimitive = false]
+ | | +- PrimaryExpression[]
+ | | +- PrimaryPrefix[@SuperModifier = false, @ThisModifier = false]
+ | | +- Name[@Image = "i"]
+ | +- SwitchLabeledExpression[]
+ | +- SwitchLabel[@Default = false]
+ | | +- TypePattern[@ParenthesisDepth = 0]
+ | | +- Type[@Array = false, @ArrayDepth = 0, @ArrayType = false, @TypeImage = "F"]
+ | | | +- ReferenceType[@Array = false, @ArrayDepth = 0]
+ | | | +- ClassOrInterfaceType[@AnonymousClass = false, @Array = false, @ArrayDepth = 0, @Image = "F", @ReferenceToClassSameCompilationUnit = true]
+ | | | +- TypeArguments[@Diamond = false]
+ | | | +- TypeArgument[@Wildcard = false]
+ | | | +- ReferenceType[@Array = false, @ArrayDepth = 0]
+ | | | +- ClassOrInterfaceType[@AnonymousClass = false, @Array = false, @ArrayDepth = 0, @Image = "Integer", @ReferenceToClassSameCompilationUnit = false]
+ | | +- VariableDeclaratorId[@Array = false, @ArrayDepth = 0, @ArrayType = false, @ExceptionBlockParameter = false, @ExplicitReceiverParameter = false, @Field = false, @Final = false, @ForeachVariable = false, @FormalParameter = false, @Image = "bi", @LambdaParameter = false, @LocalVariable = false, @Name = "bi", @PatternBinding = true, @ResourceDeclaration = false, @TypeInferred = false, @VariableName = "bi"]
+ | +- Expression[@StandAlonePrimitive = true]
+ | +- PrimaryExpression[]
+ | +- PrimaryPrefix[@SuperModifier = false, @ThisModifier = false]
+ | +- Literal[@CharLiteral = false, @DoubleLiteral = false, @EscapedStringLiteral = "42", @FloatLiteral = false, @Image = "42", @IntLiteral = true, @LongLiteral = false, @SingleCharacterStringLiteral = false, @StringLiteral = false, @TextBlock = false, @TextBlockContent = "42", @ValueAsDouble = NaN, @ValueAsFloat = NaN, @ValueAsInt = 42, @ValueAsLong = 42]
+ +- ClassOrInterfaceBodyDeclaration[@AnonymousInnerClass = false, @EnumChild = false, @Kind = DeclarationKind.METHOD]
+ +- MethodDeclaration[@Abstract = false, @Arity = 1, @Default = false, @Final = false, @InterfaceMember = false, @Kind = MethodLikeKind.METHOD, @MethodName = "main", @Modifiers = 17, @Name = "main", @Native = false, @PackagePrivate = false, @Private = false, @Protected = false, @Public = true, @Static = true, @Strictfp = false, @Synchronized = false, @SyntacticallyAbstract = false, @SyntacticallyPublic = true, @Transient = false, @Void = true, @Volatile = false]
+ +- ResultType[@Void = true, @returnsArray = false]
+ +- MethodDeclarator[@Image = "main", @ParameterCount = 1]
+ | +- FormalParameters[@ParameterCount = 1, @Size = 1]
+ | +- FormalParameter[@Abstract = false, @Array = true, @ArrayDepth = 1, @Default = false, @ExplicitReceiverParameter = false, @Final = false, @Modifiers = 0, @Native = false, @PackagePrivate = true, @Private = false, @Protected = false, @Public = false, @Static = false, @Strictfp = false, @Synchronized = false, @Transient = false, @TypeInferred = false, @Varargs = false, @Volatile = false]
+ | +- Type[@Array = true, @ArrayDepth = 1, @ArrayType = true, @TypeImage = "String"]
+ | | +- ReferenceType[@Array = true, @ArrayDepth = 1]
+ | | +- ClassOrInterfaceType[@AnonymousClass = false, @Array = true, @ArrayDepth = 1, @Image = "String", @ReferenceToClassSameCompilationUnit = false]
+ | +- VariableDeclaratorId[@Array = false, @ArrayDepth = 0, @ArrayType = true, @ExceptionBlockParameter = false, @ExplicitReceiverParameter = false, @Field = false, @Final = false, @ForeachVariable = false, @FormalParameter = true, @Image = "args", @LambdaParameter = false, @LocalVariable = false, @Name = "args", @PatternBinding = false, @ResourceDeclaration = false, @TypeInferred = false, @VariableName = "args"]
+ +- Block[@containsComment = false]
+ +- BlockStatement[@Allocation = false]
+ | +- Statement[]
+ | +- StatementExpression[]
+ | +- PrimaryExpression[]
+ | +- PrimaryPrefix[@SuperModifier = false, @ThisModifier = false]
+ | | +- Name[@Image = "System.out.println"]
+ | +- PrimarySuffix[@ArgumentCount = 1, @Arguments = true, @ArrayDereference = false]
+ | +- Arguments[@ArgumentCount = 1, @Size = 1]
+ | +- ArgumentList[@Size = 1]
+ | +- Expression[@StandAlonePrimitive = false]
+ | +- PrimaryExpression[]
+ | +- PrimaryPrefix[@SuperModifier = false, @ThisModifier = false]
+ | | +- Name[@Image = "coverage"]
+ | +- PrimarySuffix[@ArgumentCount = 1, @Arguments = true, @ArrayDereference = false]
+ | +- Arguments[@ArgumentCount = 1, @Size = 1]
+ | +- ArgumentList[@Size = 1]
+ | +- Expression[@StandAlonePrimitive = false]
+ | +- PrimaryExpression[]
+ | +- PrimaryPrefix[@SuperModifier = false, @ThisModifier = false]
+ | +- Literal[@CharLiteral = false, @DoubleLiteral = false, @EscapedStringLiteral = "\"a string\"", @FloatLiteral = false, @Image = "\"a string\"", @IntLiteral = false, @LongLiteral = false, @SingleCharacterStringLiteral = false, @StringLiteral = true, @TextBlock = false, @TextBlockContent = "\"a string\"", @ValueAsDouble = NaN, @ValueAsFloat = NaN, @ValueAsInt = 0, @ValueAsLong = 0]
+ +- BlockStatement[@Allocation = false]
+ | +- Statement[]
+ | +- StatementExpression[]
+ | +- PrimaryExpression[]
+ | +- PrimaryPrefix[@SuperModifier = false, @ThisModifier = false]
+ | | +- Name[@Image = "System.out.println"]
+ | +- PrimarySuffix[@ArgumentCount = 1, @Arguments = true, @ArrayDereference = false]
+ | +- Arguments[@ArgumentCount = 1, @Size = 1]
+ | +- ArgumentList[@Size = 1]
+ | +- Expression[@StandAlonePrimitive = false]
+ | +- PrimaryExpression[]
+ | +- PrimaryPrefix[@SuperModifier = false, @ThisModifier = false]
+ | | +- Name[@Image = "coverage"]
+ | +- PrimarySuffix[@ArgumentCount = 1, @Arguments = true, @ArrayDereference = false]
+ | +- Arguments[@ArgumentCount = 1, @Size = 1]
+ | +- ArgumentList[@Size = 1]
+ | +- Expression[@StandAlonePrimitive = true]
+ | +- PrimaryExpression[]
+ | +- PrimaryPrefix[@SuperModifier = false, @ThisModifier = false]
+ | +- Literal[@CharLiteral = false, @DoubleLiteral = false, @EscapedStringLiteral = "42", @FloatLiteral = false, @Image = "42", @IntLiteral = true, @LongLiteral = false, @SingleCharacterStringLiteral = false, @StringLiteral = false, @TextBlock = false, @TextBlockContent = "42", @ValueAsDouble = NaN, @ValueAsFloat = NaN, @ValueAsInt = 42, @ValueAsLong = 42]
+ +- BlockStatement[@Allocation = true]
+ | +- Statement[]
+ | +- StatementExpression[]
+ | +- PrimaryExpression[]
+ | +- PrimaryPrefix[@SuperModifier = false, @ThisModifier = false]
+ | | +- Name[@Image = "System.out.println"]
+ | +- PrimarySuffix[@ArgumentCount = 1, @Arguments = true, @ArrayDereference = false]
+ | +- Arguments[@ArgumentCount = 1, @Size = 1]
+ | +- ArgumentList[@Size = 1]
+ | +- Expression[@StandAlonePrimitive = false]
+ | +- PrimaryExpression[]
+ | +- PrimaryPrefix[@SuperModifier = false, @ThisModifier = false]
+ | | +- Name[@Image = "coverage"]
+ | +- PrimarySuffix[@ArgumentCount = 1, @Arguments = true, @ArrayDereference = false]
+ | +- Arguments[@ArgumentCount = 1, @Size = 1]
+ | +- ArgumentList[@Size = 1]
+ | +- Expression[@StandAlonePrimitive = false]
+ | +- PrimaryExpression[]
+ | +- PrimaryPrefix[@SuperModifier = false, @ThisModifier = false]
+ | +- AllocationExpression[@AnonymousClass = false]
+ | +- ClassOrInterfaceType[@AnonymousClass = false, @Array = false, @ArrayDepth = 0, @Image = "Object", @ReferenceToClassSameCompilationUnit = false]
+ | +- Arguments[@ArgumentCount = 0, @Size = 0]
+ +- BlockStatement[@Allocation = false]
+ | +- Statement[]
+ | +- StatementExpression[]
+ | +- PrimaryExpression[]
+ | +- PrimaryPrefix[@SuperModifier = false, @ThisModifier = false]
+ | | +- Name[@Image = "coverageStatement"]
+ | +- PrimarySuffix[@ArgumentCount = 1, @Arguments = true, @ArrayDereference = false]
+ | +- Arguments[@ArgumentCount = 1, @Size = 1]
+ | +- ArgumentList[@Size = 1]
+ | +- Expression[@StandAlonePrimitive = false]
+ | +- PrimaryExpression[]
+ | +- PrimaryPrefix[@SuperModifier = false, @ThisModifier = false]
+ | +- Literal[@CharLiteral = false, @DoubleLiteral = false, @EscapedStringLiteral = "\"a string\"", @FloatLiteral = false, @Image = "\"a string\"", @IntLiteral = false, @LongLiteral = false, @SingleCharacterStringLiteral = false, @StringLiteral = true, @TextBlock = false, @TextBlockContent = "\"a string\"", @ValueAsDouble = NaN, @ValueAsFloat = NaN, @ValueAsInt = 0, @ValueAsLong = 0]
+ +- BlockStatement[@Allocation = false]
+ | +- Statement[]
+ | +- StatementExpression[]
+ | +- PrimaryExpression[]
+ | +- PrimaryPrefix[@SuperModifier = false, @ThisModifier = false]
+ | | +- Name[@Image = "coverageStatement"]
+ | +- PrimarySuffix[@ArgumentCount = 1, @Arguments = true, @ArrayDereference = false]
+ | +- Arguments[@ArgumentCount = 1, @Size = 1]
+ | +- ArgumentList[@Size = 1]
+ | +- Expression[@StandAlonePrimitive = true]
+ | +- PrimaryExpression[]
+ | +- PrimaryPrefix[@SuperModifier = false, @ThisModifier = false]
+ | +- Literal[@CharLiteral = false, @DoubleLiteral = false, @EscapedStringLiteral = "21", @FloatLiteral = false, @Image = "21", @IntLiteral = true, @LongLiteral = false, @SingleCharacterStringLiteral = false, @StringLiteral = false, @TextBlock = false, @TextBlockContent = "21", @ValueAsDouble = NaN, @ValueAsFloat = NaN, @ValueAsInt = 21, @ValueAsLong = 21]
+ +- BlockStatement[@Allocation = true]
+ | +- Statement[]
+ | +- StatementExpression[]
+ | +- PrimaryExpression[]
+ | +- PrimaryPrefix[@SuperModifier = false, @ThisModifier = false]
+ | | +- Name[@Image = "coverageStatement"]
+ | +- PrimarySuffix[@ArgumentCount = 1, @Arguments = true, @ArrayDereference = false]
+ | +- Arguments[@ArgumentCount = 1, @Size = 1]
+ | +- ArgumentList[@Size = 1]
+ | +- Expression[@StandAlonePrimitive = false]
+ | +- PrimaryExpression[]
+ | +- PrimaryPrefix[@SuperModifier = false, @ThisModifier = false]
+ | +- AllocationExpression[@AnonymousClass = false]
+ | +- ClassOrInterfaceType[@AnonymousClass = false, @Array = false, @ArrayDepth = 0, @Image = "Object", @ReferenceToClassSameCompilationUnit = false]
+ | +- Arguments[@ArgumentCount = 0, @Size = 0]
+ +- BlockStatement[@Allocation = true]
+ | +- Statement[]
+ | +- StatementExpression[]
+ | +- PrimaryExpression[]
+ | +- PrimaryPrefix[@SuperModifier = false, @ThisModifier = false]
+ | | +- Name[@Image = "System.out.println"]
+ | +- PrimarySuffix[@ArgumentCount = 1, @Arguments = true, @ArrayDereference = false]
+ | +- Arguments[@ArgumentCount = 1, @Size = 1]
+ | +- ArgumentList[@Size = 1]
+ | +- Expression[@StandAlonePrimitive = false]
+ | +- AdditiveExpression[@Image = "+", @Operator = "+"]
+ | +- PrimaryExpression[]
+ | | +- PrimaryPrefix[@SuperModifier = false, @ThisModifier = false]
+ | | +- Literal[@CharLiteral = false, @DoubleLiteral = false, @EscapedStringLiteral = "\"A:\"", @FloatLiteral = false, @Image = "\"A:\"", @IntLiteral = false, @LongLiteral = false, @SingleCharacterStringLiteral = false, @StringLiteral = true, @TextBlock = false, @TextBlockContent = "\"A:\"", @ValueAsDouble = NaN, @ValueAsFloat = NaN, @ValueAsInt = 0, @ValueAsLong = 0]
+ | +- PrimaryExpression[]
+ | +- PrimaryPrefix[@SuperModifier = false, @ThisModifier = false]
+ | | +- Name[@Image = "testSealedExhaustive"]
+ | +- PrimarySuffix[@ArgumentCount = 1, @Arguments = true, @ArrayDereference = false]
+ | +- Arguments[@ArgumentCount = 1, @Size = 1]
+ | +- ArgumentList[@Size = 1]
+ | +- Expression[@StandAlonePrimitive = false]
+ | +- PrimaryExpression[]
+ | +- PrimaryPrefix[@SuperModifier = false, @ThisModifier = false]
+ | +- AllocationExpression[@AnonymousClass = false]
+ | +- ClassOrInterfaceType[@AnonymousClass = false, @Array = false, @ArrayDepth = 0, @Image = "A", @ReferenceToClassSameCompilationUnit = true]
+ | +- Arguments[@ArgumentCount = 0, @Size = 0]
+ +- BlockStatement[@Allocation = true]
+ | +- Statement[]
+ | +- StatementExpression[]
+ | +- PrimaryExpression[]
+ | +- PrimaryPrefix[@SuperModifier = false, @ThisModifier = false]
+ | | +- Name[@Image = "System.out.println"]
+ | +- PrimarySuffix[@ArgumentCount = 1, @Arguments = true, @ArrayDereference = false]
+ | +- Arguments[@ArgumentCount = 1, @Size = 1]
+ | +- ArgumentList[@Size = 1]
+ | +- Expression[@StandAlonePrimitive = false]
+ | +- AdditiveExpression[@Image = "+", @Operator = "+"]
+ | +- PrimaryExpression[]
+ | | +- PrimaryPrefix[@SuperModifier = false, @ThisModifier = false]
+ | | +- Literal[@CharLiteral = false, @DoubleLiteral = false, @EscapedStringLiteral = "\"B:\"", @FloatLiteral = false, @Image = "\"B:\"", @IntLiteral = false, @LongLiteral = false, @SingleCharacterStringLiteral = false, @StringLiteral = true, @TextBlock = false, @TextBlockContent = "\"B:\"", @ValueAsDouble = NaN, @ValueAsFloat = NaN, @ValueAsInt = 0, @ValueAsLong = 0]
+ | +- PrimaryExpression[]
+ | +- PrimaryPrefix[@SuperModifier = false, @ThisModifier = false]
+ | | +- Name[@Image = "testSealedExhaustive"]
+ | +- PrimarySuffix[@ArgumentCount = 1, @Arguments = true, @ArrayDereference = false]
+ | +- Arguments[@ArgumentCount = 1, @Size = 1]
+ | +- ArgumentList[@Size = 1]
+ | +- Expression[@StandAlonePrimitive = false]
+ | +- PrimaryExpression[]
+ | +- PrimaryPrefix[@SuperModifier = false, @ThisModifier = false]
+ | +- AllocationExpression[@AnonymousClass = false]
+ | +- ClassOrInterfaceType[@AnonymousClass = false, @Array = false, @ArrayDepth = 0, @Image = "B", @ReferenceToClassSameCompilationUnit = true]
+ | +- Arguments[@ArgumentCount = 0, @Size = 0]
+ +- BlockStatement[@Allocation = true]
+ | +- Statement[]
+ | +- StatementExpression[]
+ | +- PrimaryExpression[]
+ | +- PrimaryPrefix[@SuperModifier = false, @ThisModifier = false]
+ | | +- Name[@Image = "System.out.println"]
+ | +- PrimarySuffix[@ArgumentCount = 1, @Arguments = true, @ArrayDereference = false]
+ | +- Arguments[@ArgumentCount = 1, @Size = 1]
+ | +- ArgumentList[@Size = 1]
+ | +- Expression[@StandAlonePrimitive = false]
+ | +- AdditiveExpression[@Image = "+", @Operator = "+"]
+ | +- PrimaryExpression[]
+ | | +- PrimaryPrefix[@SuperModifier = false, @ThisModifier = false]
+ | | +- Literal[@CharLiteral = false, @DoubleLiteral = false, @EscapedStringLiteral = "\"C:\"", @FloatLiteral = false, @Image = "\"C:\"", @IntLiteral = false, @LongLiteral = false, @SingleCharacterStringLiteral = false, @StringLiteral = true, @TextBlock = false, @TextBlockContent = "\"C:\"", @ValueAsDouble = NaN, @ValueAsFloat = NaN, @ValueAsInt = 0, @ValueAsLong = 0]
+ | +- PrimaryExpression[]
+ | +- PrimaryPrefix[@SuperModifier = false, @ThisModifier = false]
+ | | +- Name[@Image = "testSealedExhaustive"]
+ | +- PrimarySuffix[@ArgumentCount = 1, @Arguments = true, @ArrayDereference = false]
+ | +- Arguments[@ArgumentCount = 1, @Size = 1]
+ | +- ArgumentList[@Size = 1]
+ | +- Expression[@StandAlonePrimitive = false]
+ | +- PrimaryExpression[]
+ | +- PrimaryPrefix[@SuperModifier = false, @ThisModifier = false]
+ | +- AllocationExpression[@AnonymousClass = false]
+ | +- ClassOrInterfaceType[@AnonymousClass = false, @Array = false, @ArrayDepth = 0, @Image = "C", @ReferenceToClassSameCompilationUnit = false]
+ | +- Arguments[@ArgumentCount = 1, @Size = 1]
+ | +- ArgumentList[@Size = 1]
+ | +- Expression[@StandAlonePrimitive = true]
+ | +- PrimaryExpression[]
+ | +- PrimaryPrefix[@SuperModifier = false, @ThisModifier = false]
+ | +- Literal[@CharLiteral = false, @DoubleLiteral = false, @EscapedStringLiteral = "1", @FloatLiteral = false, @Image = "1", @IntLiteral = true, @LongLiteral = false, @SingleCharacterStringLiteral = false, @StringLiteral = false, @TextBlock = false, @TextBlockContent = "1", @ValueAsDouble = NaN, @ValueAsFloat = NaN, @ValueAsInt = 1, @ValueAsLong = 1]
+ +- BlockStatement[@Allocation = true]
+ | +- Statement[]
+ | +- StatementExpression[]
+ | +- PrimaryExpression[]
+ | +- PrimaryPrefix[@SuperModifier = false, @ThisModifier = false]
+ | | +- Name[@Image = "switchStatementExhaustive"]
+ | +- PrimarySuffix[@ArgumentCount = 1, @Arguments = true, @ArrayDereference = false]
+ | +- Arguments[@ArgumentCount = 1, @Size = 1]
+ | +- ArgumentList[@Size = 1]
+ | +- Expression[@StandAlonePrimitive = false]
+ | +- PrimaryExpression[]
+ | +- PrimaryPrefix[@SuperModifier = false, @ThisModifier = false]
+ | +- AllocationExpression[@AnonymousClass = false]
+ | +- ClassOrInterfaceType[@AnonymousClass = false, @Array = false, @ArrayDepth = 0, @Image = "A", @ReferenceToClassSameCompilationUnit = true]
+ | +- Arguments[@ArgumentCount = 0, @Size = 0]
+ +- BlockStatement[@Allocation = true]
+ | +- Statement[]
+ | +- StatementExpression[]
+ | +- PrimaryExpression[]
+ | +- PrimaryPrefix[@SuperModifier = false, @ThisModifier = false]
+ | | +- Name[@Image = "switchStatementExhaustive"]
+ | +- PrimarySuffix[@ArgumentCount = 1, @Arguments = true, @ArrayDereference = false]
+ | +- Arguments[@ArgumentCount = 1, @Size = 1]
+ | +- ArgumentList[@Size = 1]
+ | +- Expression[@StandAlonePrimitive = false]
+ | +- PrimaryExpression[]
+ | +- PrimaryPrefix[@SuperModifier = false, @ThisModifier = false]
+ | +- AllocationExpression[@AnonymousClass = false]
+ | +- ClassOrInterfaceType[@AnonymousClass = false, @Array = false, @ArrayDepth = 0, @Image = "B", @ReferenceToClassSameCompilationUnit = true]
+ | +- Arguments[@ArgumentCount = 0, @Size = 0]
+ +- BlockStatement[@Allocation = true]
+ | +- Statement[]
+ | +- StatementExpression[]
+ | +- PrimaryExpression[]
+ | +- PrimaryPrefix[@SuperModifier = false, @ThisModifier = false]
+ | | +- Name[@Image = "switchStatementExhaustive"]
+ | +- PrimarySuffix[@ArgumentCount = 1, @Arguments = true, @ArrayDereference = false]
+ | +- Arguments[@ArgumentCount = 1, @Size = 1]
+ | +- ArgumentList[@Size = 1]
+ | +- Expression[@StandAlonePrimitive = false]
+ | +- PrimaryExpression[]
+ | +- PrimaryPrefix[@SuperModifier = false, @ThisModifier = false]
+ | +- AllocationExpression[@AnonymousClass = false]
+ | +- ClassOrInterfaceType[@AnonymousClass = false, @Array = false, @ArrayDepth = 0, @Image = "C", @ReferenceToClassSameCompilationUnit = false]
+ | +- Arguments[@ArgumentCount = 1, @Size = 1]
+ | +- ArgumentList[@Size = 1]
+ | +- Expression[@StandAlonePrimitive = true]
+ | +- PrimaryExpression[]
+ | +- PrimaryPrefix[@SuperModifier = false, @ThisModifier = false]
+ | +- Literal[@CharLiteral = false, @DoubleLiteral = false, @EscapedStringLiteral = "2", @FloatLiteral = false, @Image = "2", @IntLiteral = true, @LongLiteral = false, @SingleCharacterStringLiteral = false, @StringLiteral = false, @TextBlock = false, @TextBlockContent = "2", @ValueAsDouble = NaN, @ValueAsFloat = NaN, @ValueAsInt = 2, @ValueAsLong = 2]
+ +- BlockStatement[@Allocation = true]
+ +- Statement[]
+ +- StatementExpression[]
+ +- PrimaryExpression[]
+ +- PrimaryPrefix[@SuperModifier = false, @ThisModifier = false]
+ | +- Name[@Image = "System.out.println"]
+ +- PrimarySuffix[@ArgumentCount = 1, @Arguments = true, @ArrayDereference = false]
+ +- Arguments[@ArgumentCount = 1, @Size = 1]
+ +- ArgumentList[@Size = 1]
+ +- Expression[@StandAlonePrimitive = false]
+ +- AdditiveExpression[@Image = "+", @Operator = "+"]
+ +- PrimaryExpression[]
+ | +- PrimaryPrefix[@SuperModifier = false, @ThisModifier = false]
+ | +- Literal[@CharLiteral = false, @DoubleLiteral = false, @EscapedStringLiteral = "\"F:\"", @FloatLiteral = false, @Image = "\"F:\"", @IntLiteral = false, @LongLiteral = false, @SingleCharacterStringLiteral = false, @StringLiteral = true, @TextBlock = false, @TextBlockContent = "\"F:\"", @ValueAsDouble = NaN, @ValueAsFloat = NaN, @ValueAsInt = 0, @ValueAsLong = 0]
+ +- PrimaryExpression[]
+ +- PrimaryPrefix[@SuperModifier = false, @ThisModifier = false]
+ | +- Name[@Image = "testGenericSealedExhaustive"]
+ +- PrimarySuffix[@ArgumentCount = 1, @Arguments = true, @ArrayDereference = false]
+ +- Arguments[@ArgumentCount = 1, @Size = 1]
+ +- ArgumentList[@Size = 1]
+ +- Expression[@StandAlonePrimitive = false]
+ +- PrimaryExpression[]
+ +- PrimaryPrefix[@SuperModifier = false, @ThisModifier = false]
+ +- AllocationExpression[@AnonymousClass = false]
+ +- ClassOrInterfaceType[@AnonymousClass = false, @Array = false, @ArrayDepth = 0, @Image = "F", @ReferenceToClassSameCompilationUnit = true]
+ | +- TypeArguments[@Diamond = false]
+ | +- TypeArgument[@Wildcard = false]
+ | +- ReferenceType[@Array = false, @ArrayDepth = 0]
+ | +- ClassOrInterfaceType[@AnonymousClass = false, @Array = false, @ArrayDepth = 0, @Image = "Integer", @ReferenceToClassSameCompilationUnit = false]
+ +- Arguments[@ArgumentCount = 0, @Size = 0]
diff --git a/pmd-java/src/test/resources/net/sourceforge/pmd/lang/java/ast/jdkversiontests/java20p/GuardedAndParenthesizedPatterns.java b/pmd-java/src/test/resources/net/sourceforge/pmd/lang/java/ast/jdkversiontests/java20p/GuardedAndParenthesizedPatterns.java
new file mode 100644
index 0000000000..2dd7da3f70
--- /dev/null
+++ b/pmd-java/src/test/resources/net/sourceforge/pmd/lang/java/ast/jdkversiontests/java20p/GuardedAndParenthesizedPatterns.java
@@ -0,0 +1,80 @@
+/*
+ * BSD-style license; for more info see http://pmd.sourceforge.net/license.html
+ */
+
+/**
+ * @see JEP 427: Pattern Matching for switch (Third Preview)
+ */
+public class GuardedAndParenthesizedPatterns {
+
+
+ static void test(Object o) {
+ switch (o) {
+ case String s when s.length() == 1 -> System.out.println("single char string");
+ case String s -> System.out.println("string");
+ case Integer i when i.intValue() == 1 -> System.out.println("integer 1");
+ case (Long l) when l.longValue() == 1L -> System.out.println("long 1 with parens");
+ case (((Double d))) -> System.out.println("double with parens");
+ default -> System.out.println("default case");
+ }
+ }
+
+ // verify that "when" can still be used as an identifier
+ void testIdentifierWhen(String when) {
+ System.out.println(when);
+ }
+
+ // verify that "when" can still be used as an identifier
+ void testIdentifierWhen() {
+ int when = 1;
+ System.out.println(when);
+ }
+
+ // verify that "when" can still be used as a type name
+ private static class when {}
+
+ static void testWithNull(Object o) {
+ switch (o) {
+ case String s when (s.length() == 1) -> System.out.println("single char string");
+ case String s -> System.out.println("string");
+ case (Integer i) when i.intValue() == 1 -> System.out.println("integer 1");
+ case ((Long l)) when ((l.longValue() == 1L)) -> System.out.println("long 1 with parens");
+ case (((Double d))) -> System.out.println("double with parens");
+ case null -> System.out.println("null!");
+ default -> System.out.println("default case");
+ }
+ }
+
+
+ static void instanceOfPattern(Object o) {
+ if (o instanceof String s && s.length() > 2) {
+ System.out.println("A string containing at least two characters");
+ }
+ if (o != null && (o instanceof String s && s.length() > 3)) {
+ System.out.println("A string containing at least three characters");
+ }
+
+ // note: with this 3rd preview, the following is not allowed anymore:
+ // if (o instanceof (String s && s.length() > 4)) {
+ // > An alternative to guarded pattern labels is to support guarded patterns directly as a special pattern form,
+ // > e.g. p && e. Having experimented with this in previous previews, the resulting ambiguity with boolean
+ // > expressions have lead us to prefer when clauses in pattern switches.
+ if ((o instanceof String s) && (s.length() > 4)) {
+ System.out.println("A string containing at least four characters");
+ }
+ }
+
+ public static void main(String[] args) {
+ test("a");
+ test("fooo");
+ test(1);
+ test(1L);
+ instanceOfPattern("abcde");
+ try {
+ test(null); // throws NPE
+ } catch (NullPointerException e) {
+ e.printStackTrace();
+ }
+ testWithNull(null);
+ }
+}
diff --git a/pmd-java/src/test/resources/net/sourceforge/pmd/lang/java/ast/jdkversiontests/java20p/GuardedAndParenthesizedPatterns.txt b/pmd-java/src/test/resources/net/sourceforge/pmd/lang/java/ast/jdkversiontests/java20p/GuardedAndParenthesizedPatterns.txt
new file mode 100644
index 0000000000..32b243ec05
--- /dev/null
+++ b/pmd-java/src/test/resources/net/sourceforge/pmd/lang/java/ast/jdkversiontests/java20p/GuardedAndParenthesizedPatterns.txt
@@ -0,0 +1,662 @@
++- CompilationUnit[@PackageName = "", @declarationsAreInDefaultPackage = true]
+ +- TypeDeclaration[]
+ +- ClassOrInterfaceDeclaration[@Abstract = false, @BinaryName = "GuardedAndParenthesizedPatterns", @Default = false, @Final = false, @Image = "GuardedAndParenthesizedPatterns", @Interface = false, @Local = false, @Modifiers = 1, @Native = false, @Nested = false, @NonSealed = false, @PackagePrivate = false, @Private = false, @Protected = false, @Public = true, @Sealed = false, @SimpleName = "GuardedAndParenthesizedPatterns", @Static = false, @Strictfp = false, @Synchronized = false, @Transient = false, @TypeKind = TypeKind.CLASS, @Volatile = false]
+ +- ClassOrInterfaceBody[@AnonymousInnerClass = false, @EnumChild = false]
+ +- ClassOrInterfaceBodyDeclaration[@AnonymousInnerClass = false, @EnumChild = false, @Kind = DeclarationKind.METHOD]
+ | +- MethodDeclaration[@Abstract = false, @Arity = 1, @Default = false, @Final = false, @InterfaceMember = false, @Kind = MethodLikeKind.METHOD, @MethodName = "test", @Modifiers = 16, @Name = "test", @Native = false, @PackagePrivate = true, @Private = false, @Protected = false, @Public = false, @Static = true, @Strictfp = false, @Synchronized = false, @SyntacticallyAbstract = false, @SyntacticallyPublic = false, @Transient = false, @Void = true, @Volatile = false]
+ | +- ResultType[@Void = true, @returnsArray = false]
+ | +- MethodDeclarator[@Image = "test", @ParameterCount = 1]
+ | | +- FormalParameters[@ParameterCount = 1, @Size = 1]
+ | | +- FormalParameter[@Abstract = false, @Array = false, @ArrayDepth = 0, @Default = false, @ExplicitReceiverParameter = false, @Final = false, @Modifiers = 0, @Native = false, @PackagePrivate = true, @Private = false, @Protected = false, @Public = false, @Static = false, @Strictfp = false, @Synchronized = false, @Transient = false, @TypeInferred = false, @Varargs = false, @Volatile = false]
+ | | +- Type[@Array = false, @ArrayDepth = 0, @ArrayType = false, @TypeImage = "Object"]
+ | | | +- ReferenceType[@Array = false, @ArrayDepth = 0]
+ | | | +- ClassOrInterfaceType[@AnonymousClass = false, @Array = false, @ArrayDepth = 0, @Image = "Object", @ReferenceToClassSameCompilationUnit = false]
+ | | +- VariableDeclaratorId[@Array = false, @ArrayDepth = 0, @ArrayType = false, @ExceptionBlockParameter = false, @ExplicitReceiverParameter = false, @Field = false, @Final = false, @ForeachVariable = false, @FormalParameter = true, @Image = "o", @LambdaParameter = false, @LocalVariable = false, @Name = "o", @PatternBinding = false, @ResourceDeclaration = false, @TypeInferred = false, @VariableName = "o"]
+ | +- Block[@containsComment = false]
+ | +- BlockStatement[@Allocation = false]
+ | +- Statement[]
+ | +- SwitchStatement[@DefaultCase = true, @ExhaustiveEnumSwitch = false, @FallthroughSwitch = false]
+ | +- Expression[@StandAlonePrimitive = false]
+ | | +- PrimaryExpression[]
+ | | +- PrimaryPrefix[@SuperModifier = false, @ThisModifier = false]
+ | | +- Name[@Image = "o"]
+ | +- SwitchLabeledExpression[]
+ | | +- SwitchLabel[@Default = false]
+ | | | +- TypePattern[@ParenthesisDepth = 0]
+ | | | | +- Type[@Array = false, @ArrayDepth = 0, @ArrayType = false, @TypeImage = "String"]
+ | | | | | +- ReferenceType[@Array = false, @ArrayDepth = 0]
+ | | | | | +- ClassOrInterfaceType[@AnonymousClass = false, @Array = false, @ArrayDepth = 0, @Image = "String", @ReferenceToClassSameCompilationUnit = false]
+ | | | | +- VariableDeclaratorId[@Array = false, @ArrayDepth = 0, @ArrayType = false, @ExceptionBlockParameter = false, @ExplicitReceiverParameter = false, @Field = false, @Final = false, @ForeachVariable = false, @FormalParameter = false, @Image = "s", @LambdaParameter = false, @LocalVariable = false, @Name = "s", @PatternBinding = true, @ResourceDeclaration = false, @TypeInferred = false, @VariableName = "s"]
+ | | | +- SwitchGuard[]
+ | | | +- Expression[@StandAlonePrimitive = false]
+ | | | +- EqualityExpression[@Image = "==", @Operator = "=="]
+ | | | +- PrimaryExpression[]
+ | | | | +- PrimaryPrefix[@SuperModifier = false, @ThisModifier = false]
+ | | | | | +- Name[@Image = "s.length"]
+ | | | | +- PrimarySuffix[@ArgumentCount = 0, @Arguments = true, @ArrayDereference = false]
+ | | | | +- Arguments[@ArgumentCount = 0, @Size = 0]
+ | | | +- PrimaryExpression[]
+ | | | +- PrimaryPrefix[@SuperModifier = false, @ThisModifier = false]
+ | | | +- Literal[@CharLiteral = false, @DoubleLiteral = false, @EscapedStringLiteral = "1", @FloatLiteral = false, @Image = "1", @IntLiteral = true, @LongLiteral = false, @SingleCharacterStringLiteral = false, @StringLiteral = false, @TextBlock = false, @TextBlockContent = "1", @ValueAsDouble = NaN, @ValueAsFloat = NaN, @ValueAsInt = 1, @ValueAsLong = 1]
+ | | +- Expression[@StandAlonePrimitive = false]
+ | | +- PrimaryExpression[]
+ | | +- PrimaryPrefix[@SuperModifier = false, @ThisModifier = false]
+ | | | +- Name[@Image = "System.out.println"]
+ | | +- PrimarySuffix[@ArgumentCount = 1, @Arguments = true, @ArrayDereference = false]
+ | | +- Arguments[@ArgumentCount = 1, @Size = 1]
+ | | +- ArgumentList[@Size = 1]
+ | | +- Expression[@StandAlonePrimitive = false]
+ | | +- PrimaryExpression[]
+ | | +- PrimaryPrefix[@SuperModifier = false, @ThisModifier = false]
+ | | +- Literal[@CharLiteral = false, @DoubleLiteral = false, @EscapedStringLiteral = "\"single char string\"", @FloatLiteral = false, @Image = "\"single char string\"", @IntLiteral = false, @LongLiteral = false, @SingleCharacterStringLiteral = false, @StringLiteral = true, @TextBlock = false, @TextBlockContent = "\"single char string\"", @ValueAsDouble = NaN, @ValueAsFloat = NaN, @ValueAsInt = 0, @ValueAsLong = 0]
+ | +- SwitchLabeledExpression[]
+ | | +- SwitchLabel[@Default = false]
+ | | | +- TypePattern[@ParenthesisDepth = 0]
+ | | | +- Type[@Array = false, @ArrayDepth = 0, @ArrayType = false, @TypeImage = "String"]
+ | | | | +- ReferenceType[@Array = false, @ArrayDepth = 0]
+ | | | | +- ClassOrInterfaceType[@AnonymousClass = false, @Array = false, @ArrayDepth = 0, @Image = "String", @ReferenceToClassSameCompilationUnit = false]
+ | | | +- VariableDeclaratorId[@Array = false, @ArrayDepth = 0, @ArrayType = false, @ExceptionBlockParameter = false, @ExplicitReceiverParameter = false, @Field = false, @Final = false, @ForeachVariable = false, @FormalParameter = false, @Image = "s", @LambdaParameter = false, @LocalVariable = false, @Name = "s", @PatternBinding = true, @ResourceDeclaration = false, @TypeInferred = false, @VariableName = "s"]
+ | | +- Expression[@StandAlonePrimitive = false]
+ | | +- PrimaryExpression[]
+ | | +- PrimaryPrefix[@SuperModifier = false, @ThisModifier = false]
+ | | | +- Name[@Image = "System.out.println"]
+ | | +- PrimarySuffix[@ArgumentCount = 1, @Arguments = true, @ArrayDereference = false]
+ | | +- Arguments[@ArgumentCount = 1, @Size = 1]
+ | | +- ArgumentList[@Size = 1]
+ | | +- Expression[@StandAlonePrimitive = false]
+ | | +- PrimaryExpression[]
+ | | +- PrimaryPrefix[@SuperModifier = false, @ThisModifier = false]
+ | | +- Literal[@CharLiteral = false, @DoubleLiteral = false, @EscapedStringLiteral = "\"string\"", @FloatLiteral = false, @Image = "\"string\"", @IntLiteral = false, @LongLiteral = false, @SingleCharacterStringLiteral = false, @StringLiteral = true, @TextBlock = false, @TextBlockContent = "\"string\"", @ValueAsDouble = NaN, @ValueAsFloat = NaN, @ValueAsInt = 0, @ValueAsLong = 0]
+ | +- SwitchLabeledExpression[]
+ | | +- SwitchLabel[@Default = false]
+ | | | +- TypePattern[@ParenthesisDepth = 0]
+ | | | | +- Type[@Array = false, @ArrayDepth = 0, @ArrayType = false, @TypeImage = "Integer"]
+ | | | | | +- ReferenceType[@Array = false, @ArrayDepth = 0]
+ | | | | | +- ClassOrInterfaceType[@AnonymousClass = false, @Array = false, @ArrayDepth = 0, @Image = "Integer", @ReferenceToClassSameCompilationUnit = false]
+ | | | | +- VariableDeclaratorId[@Array = false, @ArrayDepth = 0, @ArrayType = false, @ExceptionBlockParameter = false, @ExplicitReceiverParameter = false, @Field = false, @Final = false, @ForeachVariable = false, @FormalParameter = false, @Image = "i", @LambdaParameter = false, @LocalVariable = false, @Name = "i", @PatternBinding = true, @ResourceDeclaration = false, @TypeInferred = false, @VariableName = "i"]
+ | | | +- SwitchGuard[]
+ | | | +- Expression[@StandAlonePrimitive = false]
+ | | | +- EqualityExpression[@Image = "==", @Operator = "=="]
+ | | | +- PrimaryExpression[]
+ | | | | +- PrimaryPrefix[@SuperModifier = false, @ThisModifier = false]
+ | | | | | +- Name[@Image = "i.intValue"]
+ | | | | +- PrimarySuffix[@ArgumentCount = 0, @Arguments = true, @ArrayDereference = false]
+ | | | | +- Arguments[@ArgumentCount = 0, @Size = 0]
+ | | | +- PrimaryExpression[]
+ | | | +- PrimaryPrefix[@SuperModifier = false, @ThisModifier = false]
+ | | | +- Literal[@CharLiteral = false, @DoubleLiteral = false, @EscapedStringLiteral = "1", @FloatLiteral = false, @Image = "1", @IntLiteral = true, @LongLiteral = false, @SingleCharacterStringLiteral = false, @StringLiteral = false, @TextBlock = false, @TextBlockContent = "1", @ValueAsDouble = NaN, @ValueAsFloat = NaN, @ValueAsInt = 1, @ValueAsLong = 1]
+ | | +- Expression[@StandAlonePrimitive = false]
+ | | +- PrimaryExpression[]
+ | | +- PrimaryPrefix[@SuperModifier = false, @ThisModifier = false]
+ | | | +- Name[@Image = "System.out.println"]
+ | | +- PrimarySuffix[@ArgumentCount = 1, @Arguments = true, @ArrayDereference = false]
+ | | +- Arguments[@ArgumentCount = 1, @Size = 1]
+ | | +- ArgumentList[@Size = 1]
+ | | +- Expression[@StandAlonePrimitive = false]
+ | | +- PrimaryExpression[]
+ | | +- PrimaryPrefix[@SuperModifier = false, @ThisModifier = false]
+ | | +- Literal[@CharLiteral = false, @DoubleLiteral = false, @EscapedStringLiteral = "\"integer 1\"", @FloatLiteral = false, @Image = "\"integer 1\"", @IntLiteral = false, @LongLiteral = false, @SingleCharacterStringLiteral = false, @StringLiteral = true, @TextBlock = false, @TextBlockContent = "\"integer 1\"", @ValueAsDouble = NaN, @ValueAsFloat = NaN, @ValueAsInt = 0, @ValueAsLong = 0]
+ | +- SwitchLabeledExpression[]
+ | | +- SwitchLabel[@Default = false]
+ | | | +- TypePattern[@ParenthesisDepth = 1]
+ | | | | +- Type[@Array = false, @ArrayDepth = 0, @ArrayType = false, @TypeImage = "Long"]
+ | | | | | +- ReferenceType[@Array = false, @ArrayDepth = 0]
+ | | | | | +- ClassOrInterfaceType[@AnonymousClass = false, @Array = false, @ArrayDepth = 0, @Image = "Long", @ReferenceToClassSameCompilationUnit = false]
+ | | | | +- VariableDeclaratorId[@Array = false, @ArrayDepth = 0, @ArrayType = false, @ExceptionBlockParameter = false, @ExplicitReceiverParameter = false, @Field = false, @Final = false, @ForeachVariable = false, @FormalParameter = false, @Image = "l", @LambdaParameter = false, @LocalVariable = false, @Name = "l", @PatternBinding = true, @ResourceDeclaration = false, @TypeInferred = false, @VariableName = "l"]
+ | | | +- SwitchGuard[]
+ | | | +- Expression[@StandAlonePrimitive = false]
+ | | | +- EqualityExpression[@Image = "==", @Operator = "=="]
+ | | | +- PrimaryExpression[]
+ | | | | +- PrimaryPrefix[@SuperModifier = false, @ThisModifier = false]
+ | | | | | +- Name[@Image = "l.longValue"]
+ | | | | +- PrimarySuffix[@ArgumentCount = 0, @Arguments = true, @ArrayDereference = false]
+ | | | | +- Arguments[@ArgumentCount = 0, @Size = 0]
+ | | | +- PrimaryExpression[]
+ | | | +- PrimaryPrefix[@SuperModifier = false, @ThisModifier = false]
+ | | | +- Literal[@CharLiteral = false, @DoubleLiteral = false, @EscapedStringLiteral = "1L", @FloatLiteral = false, @Image = "1L", @IntLiteral = false, @LongLiteral = true, @SingleCharacterStringLiteral = false, @StringLiteral = false, @TextBlock = false, @TextBlockContent = "1L", @ValueAsDouble = NaN, @ValueAsFloat = NaN, @ValueAsInt = 1, @ValueAsLong = 1]
+ | | +- Expression[@StandAlonePrimitive = false]
+ | | +- PrimaryExpression[]
+ | | +- PrimaryPrefix[@SuperModifier = false, @ThisModifier = false]
+ | | | +- Name[@Image = "System.out.println"]
+ | | +- PrimarySuffix[@ArgumentCount = 1, @Arguments = true, @ArrayDereference = false]
+ | | +- Arguments[@ArgumentCount = 1, @Size = 1]
+ | | +- ArgumentList[@Size = 1]
+ | | +- Expression[@StandAlonePrimitive = false]
+ | | +- PrimaryExpression[]
+ | | +- PrimaryPrefix[@SuperModifier = false, @ThisModifier = false]
+ | | +- Literal[@CharLiteral = false, @DoubleLiteral = false, @EscapedStringLiteral = "\"long 1 with parens\"", @FloatLiteral = false, @Image = "\"long 1 with parens\"", @IntLiteral = false, @LongLiteral = false, @SingleCharacterStringLiteral = false, @StringLiteral = true, @TextBlock = false, @TextBlockContent = "\"long 1 with parens\"", @ValueAsDouble = NaN, @ValueAsFloat = NaN, @ValueAsInt = 0, @ValueAsLong = 0]
+ | +- SwitchLabeledExpression[]
+ | | +- SwitchLabel[@Default = false]
+ | | | +- TypePattern[@ParenthesisDepth = 3]
+ | | | +- Type[@Array = false, @ArrayDepth = 0, @ArrayType = false, @TypeImage = "Double"]
+ | | | | +- ReferenceType[@Array = false, @ArrayDepth = 0]
+ | | | | +- ClassOrInterfaceType[@AnonymousClass = false, @Array = false, @ArrayDepth = 0, @Image = "Double", @ReferenceToClassSameCompilationUnit = false]
+ | | | +- VariableDeclaratorId[@Array = false, @ArrayDepth = 0, @ArrayType = false, @ExceptionBlockParameter = false, @ExplicitReceiverParameter = false, @Field = false, @Final = false, @ForeachVariable = false, @FormalParameter = false, @Image = "d", @LambdaParameter = false, @LocalVariable = false, @Name = "d", @PatternBinding = true, @ResourceDeclaration = false, @TypeInferred = false, @VariableName = "d"]
+ | | +- Expression[@StandAlonePrimitive = false]
+ | | +- PrimaryExpression[]
+ | | +- PrimaryPrefix[@SuperModifier = false, @ThisModifier = false]
+ | | | +- Name[@Image = "System.out.println"]
+ | | +- PrimarySuffix[@ArgumentCount = 1, @Arguments = true, @ArrayDereference = false]
+ | | +- Arguments[@ArgumentCount = 1, @Size = 1]
+ | | +- ArgumentList[@Size = 1]
+ | | +- Expression[@StandAlonePrimitive = false]
+ | | +- PrimaryExpression[]
+ | | +- PrimaryPrefix[@SuperModifier = false, @ThisModifier = false]
+ | | +- Literal[@CharLiteral = false, @DoubleLiteral = false, @EscapedStringLiteral = "\"double with parens\"", @FloatLiteral = false, @Image = "\"double with parens\"", @IntLiteral = false, @LongLiteral = false, @SingleCharacterStringLiteral = false, @StringLiteral = true, @TextBlock = false, @TextBlockContent = "\"double with parens\"", @ValueAsDouble = NaN, @ValueAsFloat = NaN, @ValueAsInt = 0, @ValueAsLong = 0]
+ | +- SwitchLabeledExpression[]
+ | +- SwitchLabel[@Default = true]
+ | +- Expression[@StandAlonePrimitive = false]
+ | +- PrimaryExpression[]
+ | +- PrimaryPrefix[@SuperModifier = false, @ThisModifier = false]
+ | | +- Name[@Image = "System.out.println"]
+ | +- PrimarySuffix[@ArgumentCount = 1, @Arguments = true, @ArrayDereference = false]
+ | +- Arguments[@ArgumentCount = 1, @Size = 1]
+ | +- ArgumentList[@Size = 1]
+ | +- Expression[@StandAlonePrimitive = false]
+ | +- PrimaryExpression[]
+ | +- PrimaryPrefix[@SuperModifier = false, @ThisModifier = false]
+ | +- Literal[@CharLiteral = false, @DoubleLiteral = false, @EscapedStringLiteral = "\"default case\"", @FloatLiteral = false, @Image = "\"default case\"", @IntLiteral = false, @LongLiteral = false, @SingleCharacterStringLiteral = false, @StringLiteral = true, @TextBlock = false, @TextBlockContent = "\"default case\"", @ValueAsDouble = NaN, @ValueAsFloat = NaN, @ValueAsInt = 0, @ValueAsLong = 0]
+ +- ClassOrInterfaceBodyDeclaration[@AnonymousInnerClass = false, @EnumChild = false, @Kind = DeclarationKind.METHOD]
+ | +- MethodDeclaration[@Abstract = false, @Arity = 1, @Default = false, @Final = false, @InterfaceMember = false, @Kind = MethodLikeKind.METHOD, @MethodName = "testIdentifierWhen", @Modifiers = 0, @Name = "testIdentifierWhen", @Native = false, @PackagePrivate = true, @Private = false, @Protected = false, @Public = false, @Static = false, @Strictfp = false, @Synchronized = false, @SyntacticallyAbstract = false, @SyntacticallyPublic = false, @Transient = false, @Void = true, @Volatile = false]
+ | +- ResultType[@Void = true, @returnsArray = false]
+ | +- MethodDeclarator[@Image = "testIdentifierWhen", @ParameterCount = 1]
+ | | +- FormalParameters[@ParameterCount = 1, @Size = 1]
+ | | +- FormalParameter[@Abstract = false, @Array = false, @ArrayDepth = 0, @Default = false, @ExplicitReceiverParameter = false, @Final = false, @Modifiers = 0, @Native = false, @PackagePrivate = true, @Private = false, @Protected = false, @Public = false, @Static = false, @Strictfp = false, @Synchronized = false, @Transient = false, @TypeInferred = false, @Varargs = false, @Volatile = false]
+ | | +- Type[@Array = false, @ArrayDepth = 0, @ArrayType = false, @TypeImage = "String"]
+ | | | +- ReferenceType[@Array = false, @ArrayDepth = 0]
+ | | | +- ClassOrInterfaceType[@AnonymousClass = false, @Array = false, @ArrayDepth = 0, @Image = "String", @ReferenceToClassSameCompilationUnit = false]
+ | | +- VariableDeclaratorId[@Array = false, @ArrayDepth = 0, @ArrayType = false, @ExceptionBlockParameter = false, @ExplicitReceiverParameter = false, @Field = false, @Final = false, @ForeachVariable = false, @FormalParameter = true, @Image = "when", @LambdaParameter = false, @LocalVariable = false, @Name = "when", @PatternBinding = false, @ResourceDeclaration = false, @TypeInferred = false, @VariableName = "when"]
+ | +- Block[@containsComment = false]
+ | +- BlockStatement[@Allocation = false]
+ | +- Statement[]
+ | +- StatementExpression[]
+ | +- PrimaryExpression[]
+ | +- PrimaryPrefix[@SuperModifier = false, @ThisModifier = false]
+ | | +- Name[@Image = "System.out.println"]
+ | +- PrimarySuffix[@ArgumentCount = 1, @Arguments = true, @ArrayDereference = false]
+ | +- Arguments[@ArgumentCount = 1, @Size = 1]
+ | +- ArgumentList[@Size = 1]
+ | +- Expression[@StandAlonePrimitive = false]
+ | +- PrimaryExpression[]
+ | +- PrimaryPrefix[@SuperModifier = false, @ThisModifier = false]
+ | +- Name[@Image = "when"]
+ +- ClassOrInterfaceBodyDeclaration[@AnonymousInnerClass = false, @EnumChild = false, @Kind = DeclarationKind.METHOD]
+ | +- MethodDeclaration[@Abstract = false, @Arity = 0, @Default = false, @Final = false, @InterfaceMember = false, @Kind = MethodLikeKind.METHOD, @MethodName = "testIdentifierWhen", @Modifiers = 0, @Name = "testIdentifierWhen", @Native = false, @PackagePrivate = true, @Private = false, @Protected = false, @Public = false, @Static = false, @Strictfp = false, @Synchronized = false, @SyntacticallyAbstract = false, @SyntacticallyPublic = false, @Transient = false, @Void = true, @Volatile = false]
+ | +- ResultType[@Void = true, @returnsArray = false]
+ | +- MethodDeclarator[@Image = "testIdentifierWhen", @ParameterCount = 0]
+ | | +- FormalParameters[@ParameterCount = 0, @Size = 0]
+ | +- Block[@containsComment = false]
+ | +- BlockStatement[@Allocation = false]
+ | | +- LocalVariableDeclaration[@Abstract = false, @Array = false, @ArrayDepth = 0, @Default = false, @Final = false, @Modifiers = 0, @Native = false, @PackagePrivate = true, @Private = false, @Protected = false, @Public = false, @Static = false, @Strictfp = false, @Synchronized = false, @Transient = false, @TypeInferred = false, @VariableName = "when", @Volatile = false]
+ | | +- Type[@Array = false, @ArrayDepth = 0, @ArrayType = false, @TypeImage = "int"]
+ | | | +- PrimitiveType[@Array = false, @ArrayDepth = 0, @Boolean = false, @Image = "int"]
+ | | +- VariableDeclarator[@Initializer = true, @Name = "when"]
+ | | +- VariableDeclaratorId[@Array = false, @ArrayDepth = 0, @ArrayType = false, @ExceptionBlockParameter = false, @ExplicitReceiverParameter = false, @Field = false, @Final = false, @ForeachVariable = false, @FormalParameter = false, @Image = "when", @LambdaParameter = false, @LocalVariable = true, @Name = "when", @PatternBinding = false, @ResourceDeclaration = false, @TypeInferred = false, @VariableName = "when"]
+ | | +- VariableInitializer[]
+ | | +- Expression[@StandAlonePrimitive = true]
+ | | +- PrimaryExpression[]
+ | | +- PrimaryPrefix[@SuperModifier = false, @ThisModifier = false]
+ | | +- Literal[@CharLiteral = false, @DoubleLiteral = false, @EscapedStringLiteral = "1", @FloatLiteral = false, @Image = "1", @IntLiteral = true, @LongLiteral = false, @SingleCharacterStringLiteral = false, @StringLiteral = false, @TextBlock = false, @TextBlockContent = "1", @ValueAsDouble = NaN, @ValueAsFloat = NaN, @ValueAsInt = 1, @ValueAsLong = 1]
+ | +- BlockStatement[@Allocation = false]
+ | +- Statement[]
+ | +- StatementExpression[]
+ | +- PrimaryExpression[]
+ | +- PrimaryPrefix[@SuperModifier = false, @ThisModifier = false]
+ | | +- Name[@Image = "System.out.println"]
+ | +- PrimarySuffix[@ArgumentCount = 1, @Arguments = true, @ArrayDereference = false]
+ | +- Arguments[@ArgumentCount = 1, @Size = 1]
+ | +- ArgumentList[@Size = 1]
+ | +- Expression[@StandAlonePrimitive = false]
+ | +- PrimaryExpression[]
+ | +- PrimaryPrefix[@SuperModifier = false, @ThisModifier = false]
+ | +- Name[@Image = "when"]
+ +- ClassOrInterfaceBodyDeclaration[@AnonymousInnerClass = false, @EnumChild = false, @Kind = DeclarationKind.CLASS]
+ | +- ClassOrInterfaceDeclaration[@Abstract = false, @BinaryName = "GuardedAndParenthesizedPatterns$when", @Default = false, @Final = false, @Image = "when", @Interface = false, @Local = false, @Modifiers = 20, @Native = false, @Nested = true, @NonSealed = false, @PackagePrivate = false, @Private = true, @Protected = false, @Public = false, @Sealed = false, @SimpleName = "when", @Static = true, @Strictfp = false, @Synchronized = false, @Transient = false, @TypeKind = TypeKind.CLASS, @Volatile = false]
+ | +- ClassOrInterfaceBody[@AnonymousInnerClass = false, @EnumChild = false]
+ +- ClassOrInterfaceBodyDeclaration[@AnonymousInnerClass = false, @EnumChild = false, @Kind = DeclarationKind.METHOD]
+ | +- MethodDeclaration[@Abstract = false, @Arity = 1, @Default = false, @Final = false, @InterfaceMember = false, @Kind = MethodLikeKind.METHOD, @MethodName = "testWithNull", @Modifiers = 16, @Name = "testWithNull", @Native = false, @PackagePrivate = true, @Private = false, @Protected = false, @Public = false, @Static = true, @Strictfp = false, @Synchronized = false, @SyntacticallyAbstract = false, @SyntacticallyPublic = false, @Transient = false, @Void = true, @Volatile = false]
+ | +- ResultType[@Void = true, @returnsArray = false]
+ | +- MethodDeclarator[@Image = "testWithNull", @ParameterCount = 1]
+ | | +- FormalParameters[@ParameterCount = 1, @Size = 1]
+ | | +- FormalParameter[@Abstract = false, @Array = false, @ArrayDepth = 0, @Default = false, @ExplicitReceiverParameter = false, @Final = false, @Modifiers = 0, @Native = false, @PackagePrivate = true, @Private = false, @Protected = false, @Public = false, @Static = false, @Strictfp = false, @Synchronized = false, @Transient = false, @TypeInferred = false, @Varargs = false, @Volatile = false]
+ | | +- Type[@Array = false, @ArrayDepth = 0, @ArrayType = false, @TypeImage = "Object"]
+ | | | +- ReferenceType[@Array = false, @ArrayDepth = 0]
+ | | | +- ClassOrInterfaceType[@AnonymousClass = false, @Array = false, @ArrayDepth = 0, @Image = "Object", @ReferenceToClassSameCompilationUnit = false]
+ | | +- VariableDeclaratorId[@Array = false, @ArrayDepth = 0, @ArrayType = false, @ExceptionBlockParameter = false, @ExplicitReceiverParameter = false, @Field = false, @Final = false, @ForeachVariable = false, @FormalParameter = true, @Image = "o", @LambdaParameter = false, @LocalVariable = false, @Name = "o", @PatternBinding = false, @ResourceDeclaration = false, @TypeInferred = false, @VariableName = "o"]
+ | +- Block[@containsComment = false]
+ | +- BlockStatement[@Allocation = false]
+ | +- Statement[]
+ | +- SwitchStatement[@DefaultCase = true, @ExhaustiveEnumSwitch = false, @FallthroughSwitch = false]
+ | +- Expression[@StandAlonePrimitive = false]
+ | | +- PrimaryExpression[]
+ | | +- PrimaryPrefix[@SuperModifier = false, @ThisModifier = false]
+ | | +- Name[@Image = "o"]
+ | +- SwitchLabeledExpression[]
+ | | +- SwitchLabel[@Default = false]
+ | | | +- TypePattern[@ParenthesisDepth = 0]
+ | | | | +- Type[@Array = false, @ArrayDepth = 0, @ArrayType = false, @TypeImage = "String"]
+ | | | | | +- ReferenceType[@Array = false, @ArrayDepth = 0]
+ | | | | | +- ClassOrInterfaceType[@AnonymousClass = false, @Array = false, @ArrayDepth = 0, @Image = "String", @ReferenceToClassSameCompilationUnit = false]
+ | | | | +- VariableDeclaratorId[@Array = false, @ArrayDepth = 0, @ArrayType = false, @ExceptionBlockParameter = false, @ExplicitReceiverParameter = false, @Field = false, @Final = false, @ForeachVariable = false, @FormalParameter = false, @Image = "s", @LambdaParameter = false, @LocalVariable = false, @Name = "s", @PatternBinding = true, @ResourceDeclaration = false, @TypeInferred = false, @VariableName = "s"]
+ | | | +- SwitchGuard[]
+ | | | +- Expression[@StandAlonePrimitive = false]
+ | | | +- PrimaryExpression[]
+ | | | +- PrimaryPrefix[@SuperModifier = false, @ThisModifier = false]
+ | | | +- Expression[@StandAlonePrimitive = false]
+ | | | +- EqualityExpression[@Image = "==", @Operator = "=="]
+ | | | +- PrimaryExpression[]
+ | | | | +- PrimaryPrefix[@SuperModifier = false, @ThisModifier = false]
+ | | | | | +- Name[@Image = "s.length"]
+ | | | | +- PrimarySuffix[@ArgumentCount = 0, @Arguments = true, @ArrayDereference = false]
+ | | | | +- Arguments[@ArgumentCount = 0, @Size = 0]
+ | | | +- PrimaryExpression[]
+ | | | +- PrimaryPrefix[@SuperModifier = false, @ThisModifier = false]
+ | | | +- Literal[@CharLiteral = false, @DoubleLiteral = false, @EscapedStringLiteral = "1", @FloatLiteral = false, @Image = "1", @IntLiteral = true, @LongLiteral = false, @SingleCharacterStringLiteral = false, @StringLiteral = false, @TextBlock = false, @TextBlockContent = "1", @ValueAsDouble = NaN, @ValueAsFloat = NaN, @ValueAsInt = 1, @ValueAsLong = 1]
+ | | +- Expression[@StandAlonePrimitive = false]
+ | | +- PrimaryExpression[]
+ | | +- PrimaryPrefix[@SuperModifier = false, @ThisModifier = false]
+ | | | +- Name[@Image = "System.out.println"]
+ | | +- PrimarySuffix[@ArgumentCount = 1, @Arguments = true, @ArrayDereference = false]
+ | | +- Arguments[@ArgumentCount = 1, @Size = 1]
+ | | +- ArgumentList[@Size = 1]
+ | | +- Expression[@StandAlonePrimitive = false]
+ | | +- PrimaryExpression[]
+ | | +- PrimaryPrefix[@SuperModifier = false, @ThisModifier = false]
+ | | +- Literal[@CharLiteral = false, @DoubleLiteral = false, @EscapedStringLiteral = "\"single char string\"", @FloatLiteral = false, @Image = "\"single char string\"", @IntLiteral = false, @LongLiteral = false, @SingleCharacterStringLiteral = false, @StringLiteral = true, @TextBlock = false, @TextBlockContent = "\"single char string\"", @ValueAsDouble = NaN, @ValueAsFloat = NaN, @ValueAsInt = 0, @ValueAsLong = 0]
+ | +- SwitchLabeledExpression[]
+ | | +- SwitchLabel[@Default = false]
+ | | | +- TypePattern[@ParenthesisDepth = 0]
+ | | | +- Type[@Array = false, @ArrayDepth = 0, @ArrayType = false, @TypeImage = "String"]
+ | | | | +- ReferenceType[@Array = false, @ArrayDepth = 0]
+ | | | | +- ClassOrInterfaceType[@AnonymousClass = false, @Array = false, @ArrayDepth = 0, @Image = "String", @ReferenceToClassSameCompilationUnit = false]
+ | | | +- VariableDeclaratorId[@Array = false, @ArrayDepth = 0, @ArrayType = false, @ExceptionBlockParameter = false, @ExplicitReceiverParameter = false, @Field = false, @Final = false, @ForeachVariable = false, @FormalParameter = false, @Image = "s", @LambdaParameter = false, @LocalVariable = false, @Name = "s", @PatternBinding = true, @ResourceDeclaration = false, @TypeInferred = false, @VariableName = "s"]
+ | | +- Expression[@StandAlonePrimitive = false]
+ | | +- PrimaryExpression[]
+ | | +- PrimaryPrefix[@SuperModifier = false, @ThisModifier = false]
+ | | | +- Name[@Image = "System.out.println"]
+ | | +- PrimarySuffix[@ArgumentCount = 1, @Arguments = true, @ArrayDereference = false]
+ | | +- Arguments[@ArgumentCount = 1, @Size = 1]
+ | | +- ArgumentList[@Size = 1]
+ | | +- Expression[@StandAlonePrimitive = false]
+ | | +- PrimaryExpression[]
+ | | +- PrimaryPrefix[@SuperModifier = false, @ThisModifier = false]
+ | | +- Literal[@CharLiteral = false, @DoubleLiteral = false, @EscapedStringLiteral = "\"string\"", @FloatLiteral = false, @Image = "\"string\"", @IntLiteral = false, @LongLiteral = false, @SingleCharacterStringLiteral = false, @StringLiteral = true, @TextBlock = false, @TextBlockContent = "\"string\"", @ValueAsDouble = NaN, @ValueAsFloat = NaN, @ValueAsInt = 0, @ValueAsLong = 0]
+ | +- SwitchLabeledExpression[]
+ | | +- SwitchLabel[@Default = false]
+ | | | +- TypePattern[@ParenthesisDepth = 1]
+ | | | | +- Type[@Array = false, @ArrayDepth = 0, @ArrayType = false, @TypeImage = "Integer"]
+ | | | | | +- ReferenceType[@Array = false, @ArrayDepth = 0]
+ | | | | | +- ClassOrInterfaceType[@AnonymousClass = false, @Array = false, @ArrayDepth = 0, @Image = "Integer", @ReferenceToClassSameCompilationUnit = false]
+ | | | | +- VariableDeclaratorId[@Array = false, @ArrayDepth = 0, @ArrayType = false, @ExceptionBlockParameter = false, @ExplicitReceiverParameter = false, @Field = false, @Final = false, @ForeachVariable = false, @FormalParameter = false, @Image = "i", @LambdaParameter = false, @LocalVariable = false, @Name = "i", @PatternBinding = true, @ResourceDeclaration = false, @TypeInferred = false, @VariableName = "i"]
+ | | | +- SwitchGuard[]
+ | | | +- Expression[@StandAlonePrimitive = false]
+ | | | +- EqualityExpression[@Image = "==", @Operator = "=="]
+ | | | +- PrimaryExpression[]
+ | | | | +- PrimaryPrefix[@SuperModifier = false, @ThisModifier = false]
+ | | | | | +- Name[@Image = "i.intValue"]
+ | | | | +- PrimarySuffix[@ArgumentCount = 0, @Arguments = true, @ArrayDereference = false]
+ | | | | +- Arguments[@ArgumentCount = 0, @Size = 0]
+ | | | +- PrimaryExpression[]
+ | | | +- PrimaryPrefix[@SuperModifier = false, @ThisModifier = false]
+ | | | +- Literal[@CharLiteral = false, @DoubleLiteral = false, @EscapedStringLiteral = "1", @FloatLiteral = false, @Image = "1", @IntLiteral = true, @LongLiteral = false, @SingleCharacterStringLiteral = false, @StringLiteral = false, @TextBlock = false, @TextBlockContent = "1", @ValueAsDouble = NaN, @ValueAsFloat = NaN, @ValueAsInt = 1, @ValueAsLong = 1]
+ | | +- Expression[@StandAlonePrimitive = false]
+ | | +- PrimaryExpression[]
+ | | +- PrimaryPrefix[@SuperModifier = false, @ThisModifier = false]
+ | | | +- Name[@Image = "System.out.println"]
+ | | +- PrimarySuffix[@ArgumentCount = 1, @Arguments = true, @ArrayDereference = false]
+ | | +- Arguments[@ArgumentCount = 1, @Size = 1]
+ | | +- ArgumentList[@Size = 1]
+ | | +- Expression[@StandAlonePrimitive = false]
+ | | +- PrimaryExpression[]
+ | | +- PrimaryPrefix[@SuperModifier = false, @ThisModifier = false]
+ | | +- Literal[@CharLiteral = false, @DoubleLiteral = false, @EscapedStringLiteral = "\"integer 1\"", @FloatLiteral = false, @Image = "\"integer 1\"", @IntLiteral = false, @LongLiteral = false, @SingleCharacterStringLiteral = false, @StringLiteral = true, @TextBlock = false, @TextBlockContent = "\"integer 1\"", @ValueAsDouble = NaN, @ValueAsFloat = NaN, @ValueAsInt = 0, @ValueAsLong = 0]
+ | +- SwitchLabeledExpression[]
+ | | +- SwitchLabel[@Default = false]
+ | | | +- TypePattern[@ParenthesisDepth = 2]
+ | | | | +- Type[@Array = false, @ArrayDepth = 0, @ArrayType = false, @TypeImage = "Long"]
+ | | | | | +- ReferenceType[@Array = false, @ArrayDepth = 0]
+ | | | | | +- ClassOrInterfaceType[@AnonymousClass = false, @Array = false, @ArrayDepth = 0, @Image = "Long", @ReferenceToClassSameCompilationUnit = false]
+ | | | | +- VariableDeclaratorId[@Array = false, @ArrayDepth = 0, @ArrayType = false, @ExceptionBlockParameter = false, @ExplicitReceiverParameter = false, @Field = false, @Final = false, @ForeachVariable = false, @FormalParameter = false, @Image = "l", @LambdaParameter = false, @LocalVariable = false, @Name = "l", @PatternBinding = true, @ResourceDeclaration = false, @TypeInferred = false, @VariableName = "l"]
+ | | | +- SwitchGuard[]
+ | | | +- Expression[@StandAlonePrimitive = false]
+ | | | +- PrimaryExpression[]
+ | | | +- PrimaryPrefix[@SuperModifier = false, @ThisModifier = false]
+ | | | +- Expression[@StandAlonePrimitive = false]
+ | | | +- PrimaryExpression[]
+ | | | +- PrimaryPrefix[@SuperModifier = false, @ThisModifier = false]
+ | | | +- Expression[@StandAlonePrimitive = false]
+ | | | +- EqualityExpression[@Image = "==", @Operator = "=="]
+ | | | +- PrimaryExpression[]
+ | | | | +- PrimaryPrefix[@SuperModifier = false, @ThisModifier = false]
+ | | | | | +- Name[@Image = "l.longValue"]
+ | | | | +- PrimarySuffix[@ArgumentCount = 0, @Arguments = true, @ArrayDereference = false]
+ | | | | +- Arguments[@ArgumentCount = 0, @Size = 0]
+ | | | +- PrimaryExpression[]
+ | | | +- PrimaryPrefix[@SuperModifier = false, @ThisModifier = false]
+ | | | +- Literal[@CharLiteral = false, @DoubleLiteral = false, @EscapedStringLiteral = "1L", @FloatLiteral = false, @Image = "1L", @IntLiteral = false, @LongLiteral = true, @SingleCharacterStringLiteral = false, @StringLiteral = false, @TextBlock = false, @TextBlockContent = "1L", @ValueAsDouble = NaN, @ValueAsFloat = NaN, @ValueAsInt = 1, @ValueAsLong = 1]
+ | | +- Expression[@StandAlonePrimitive = false]
+ | | +- PrimaryExpression[]
+ | | +- PrimaryPrefix[@SuperModifier = false, @ThisModifier = false]
+ | | | +- Name[@Image = "System.out.println"]
+ | | +- PrimarySuffix[@ArgumentCount = 1, @Arguments = true, @ArrayDereference = false]
+ | | +- Arguments[@ArgumentCount = 1, @Size = 1]
+ | | +- ArgumentList[@Size = 1]
+ | | +- Expression[@StandAlonePrimitive = false]
+ | | +- PrimaryExpression[]
+ | | +- PrimaryPrefix[@SuperModifier = false, @ThisModifier = false]
+ | | +- Literal[@CharLiteral = false, @DoubleLiteral = false, @EscapedStringLiteral = "\"long 1 with parens\"", @FloatLiteral = false, @Image = "\"long 1 with parens\"", @IntLiteral = false, @LongLiteral = false, @SingleCharacterStringLiteral = false, @StringLiteral = true, @TextBlock = false, @TextBlockContent = "\"long 1 with parens\"", @ValueAsDouble = NaN, @ValueAsFloat = NaN, @ValueAsInt = 0, @ValueAsLong = 0]
+ | +- SwitchLabeledExpression[]
+ | | +- SwitchLabel[@Default = false]
+ | | | +- TypePattern[@ParenthesisDepth = 3]
+ | | | +- Type[@Array = false, @ArrayDepth = 0, @ArrayType = false, @TypeImage = "Double"]
+ | | | | +- ReferenceType[@Array = false, @ArrayDepth = 0]
+ | | | | +- ClassOrInterfaceType[@AnonymousClass = false, @Array = false, @ArrayDepth = 0, @Image = "Double", @ReferenceToClassSameCompilationUnit = false]
+ | | | +- VariableDeclaratorId[@Array = false, @ArrayDepth = 0, @ArrayType = false, @ExceptionBlockParameter = false, @ExplicitReceiverParameter = false, @Field = false, @Final = false, @ForeachVariable = false, @FormalParameter = false, @Image = "d", @LambdaParameter = false, @LocalVariable = false, @Name = "d", @PatternBinding = true, @ResourceDeclaration = false, @TypeInferred = false, @VariableName = "d"]
+ | | +- Expression[@StandAlonePrimitive = false]
+ | | +- PrimaryExpression[]
+ | | +- PrimaryPrefix[@SuperModifier = false, @ThisModifier = false]
+ | | | +- Name[@Image = "System.out.println"]
+ | | +- PrimarySuffix[@ArgumentCount = 1, @Arguments = true, @ArrayDereference = false]
+ | | +- Arguments[@ArgumentCount = 1, @Size = 1]
+ | | +- ArgumentList[@Size = 1]
+ | | +- Expression[@StandAlonePrimitive = false]
+ | | +- PrimaryExpression[]
+ | | +- PrimaryPrefix[@SuperModifier = false, @ThisModifier = false]
+ | | +- Literal[@CharLiteral = false, @DoubleLiteral = false, @EscapedStringLiteral = "\"double with parens\"", @FloatLiteral = false, @Image = "\"double with parens\"", @IntLiteral = false, @LongLiteral = false, @SingleCharacterStringLiteral = false, @StringLiteral = true, @TextBlock = false, @TextBlockContent = "\"double with parens\"", @ValueAsDouble = NaN, @ValueAsFloat = NaN, @ValueAsInt = 0, @ValueAsLong = 0]
+ | +- SwitchLabeledExpression[]
+ | | +- SwitchLabel[@Default = false]
+ | | | +- Expression[@StandAlonePrimitive = false]
+ | | | +- PrimaryExpression[]
+ | | | +- PrimaryPrefix[@SuperModifier = false, @ThisModifier = false]
+ | | | +- Literal[@CharLiteral = false, @DoubleLiteral = false, @EscapedStringLiteral = null, @FloatLiteral = false, @IntLiteral = false, @LongLiteral = false, @SingleCharacterStringLiteral = false, @StringLiteral = false, @TextBlock = false, @TextBlockContent = null, @ValueAsDouble = NaN, @ValueAsFloat = NaN, @ValueAsInt = 0, @ValueAsLong = 0]
+ | | | +- NullLiteral[]
+ | | +- Expression[@StandAlonePrimitive = false]
+ | | +- PrimaryExpression[]
+ | | +- PrimaryPrefix[@SuperModifier = false, @ThisModifier = false]
+ | | | +- Name[@Image = "System.out.println"]
+ | | +- PrimarySuffix[@ArgumentCount = 1, @Arguments = true, @ArrayDereference = false]
+ | | +- Arguments[@ArgumentCount = 1, @Size = 1]
+ | | +- ArgumentList[@Size = 1]
+ | | +- Expression[@StandAlonePrimitive = false]
+ | | +- PrimaryExpression[]
+ | | +- PrimaryPrefix[@SuperModifier = false, @ThisModifier = false]
+ | | +- Literal[@CharLiteral = false, @DoubleLiteral = false, @EscapedStringLiteral = "\"null!\"", @FloatLiteral = false, @Image = "\"null!\"", @IntLiteral = false, @LongLiteral = false, @SingleCharacterStringLiteral = false, @StringLiteral = true, @TextBlock = false, @TextBlockContent = "\"null!\"", @ValueAsDouble = NaN, @ValueAsFloat = NaN, @ValueAsInt = 0, @ValueAsLong = 0]
+ | +- SwitchLabeledExpression[]
+ | +- SwitchLabel[@Default = true]
+ | +- Expression[@StandAlonePrimitive = false]
+ | +- PrimaryExpression[]
+ | +- PrimaryPrefix[@SuperModifier = false, @ThisModifier = false]
+ | | +- Name[@Image = "System.out.println"]
+ | +- PrimarySuffix[@ArgumentCount = 1, @Arguments = true, @ArrayDereference = false]
+ | +- Arguments[@ArgumentCount = 1, @Size = 1]
+ | +- ArgumentList[@Size = 1]
+ | +- Expression[@StandAlonePrimitive = false]
+ | +- PrimaryExpression[]
+ | +- PrimaryPrefix[@SuperModifier = false, @ThisModifier = false]
+ | +- Literal[@CharLiteral = false, @DoubleLiteral = false, @EscapedStringLiteral = "\"default case\"", @FloatLiteral = false, @Image = "\"default case\"", @IntLiteral = false, @LongLiteral = false, @SingleCharacterStringLiteral = false, @StringLiteral = true, @TextBlock = false, @TextBlockContent = "\"default case\"", @ValueAsDouble = NaN, @ValueAsFloat = NaN, @ValueAsInt = 0, @ValueAsLong = 0]
+ +- ClassOrInterfaceBodyDeclaration[@AnonymousInnerClass = false, @EnumChild = false, @Kind = DeclarationKind.METHOD]
+ | +- MethodDeclaration[@Abstract = false, @Arity = 1, @Default = false, @Final = false, @InterfaceMember = false, @Kind = MethodLikeKind.METHOD, @MethodName = "instanceOfPattern", @Modifiers = 16, @Name = "instanceOfPattern", @Native = false, @PackagePrivate = true, @Private = false, @Protected = false, @Public = false, @Static = true, @Strictfp = false, @Synchronized = false, @SyntacticallyAbstract = false, @SyntacticallyPublic = false, @Transient = false, @Void = true, @Volatile = false]
+ | +- ResultType[@Void = true, @returnsArray = false]
+ | +- MethodDeclarator[@Image = "instanceOfPattern", @ParameterCount = 1]
+ | | +- FormalParameters[@ParameterCount = 1, @Size = 1]
+ | | +- FormalParameter[@Abstract = false, @Array = false, @ArrayDepth = 0, @Default = false, @ExplicitReceiverParameter = false, @Final = false, @Modifiers = 0, @Native = false, @PackagePrivate = true, @Private = false, @Protected = false, @Public = false, @Static = false, @Strictfp = false, @Synchronized = false, @Transient = false, @TypeInferred = false, @Varargs = false, @Volatile = false]
+ | | +- Type[@Array = false, @ArrayDepth = 0, @ArrayType = false, @TypeImage = "Object"]
+ | | | +- ReferenceType[@Array = false, @ArrayDepth = 0]
+ | | | +- ClassOrInterfaceType[@AnonymousClass = false, @Array = false, @ArrayDepth = 0, @Image = "Object", @ReferenceToClassSameCompilationUnit = false]
+ | | +- VariableDeclaratorId[@Array = false, @ArrayDepth = 0, @ArrayType = false, @ExceptionBlockParameter = false, @ExplicitReceiverParameter = false, @Field = false, @Final = false, @ForeachVariable = false, @FormalParameter = true, @Image = "o", @LambdaParameter = false, @LocalVariable = false, @Name = "o", @PatternBinding = false, @ResourceDeclaration = false, @TypeInferred = false, @VariableName = "o"]
+ | +- Block[@containsComment = false]
+ | +- BlockStatement[@Allocation = false]
+ | | +- Statement[]
+ | | +- IfStatement[@Else = false]
+ | | +- Expression[@StandAlonePrimitive = false]
+ | | | +- ConditionalAndExpression[]
+ | | | +- InstanceOfExpression[]
+ | | | | +- PrimaryExpression[]
+ | | | | | +- PrimaryPrefix[@SuperModifier = false, @ThisModifier = false]
+ | | | | | +- Name[@Image = "o"]
+ | | | | +- TypePattern[@ParenthesisDepth = 0]
+ | | | | +- Type[@Array = false, @ArrayDepth = 0, @ArrayType = false, @TypeImage = "String"]
+ | | | | | +- ReferenceType[@Array = false, @ArrayDepth = 0]
+ | | | | | +- ClassOrInterfaceType[@AnonymousClass = false, @Array = false, @ArrayDepth = 0, @Image = "String", @ReferenceToClassSameCompilationUnit = false]
+ | | | | +- VariableDeclaratorId[@Array = false, @ArrayDepth = 0, @ArrayType = false, @ExceptionBlockParameter = false, @ExplicitReceiverParameter = false, @Field = false, @Final = false, @ForeachVariable = false, @FormalParameter = false, @Image = "s", @LambdaParameter = false, @LocalVariable = false, @Name = "s", @PatternBinding = true, @ResourceDeclaration = false, @TypeInferred = false, @VariableName = "s"]
+ | | | +- RelationalExpression[@Image = ">"]
+ | | | +- PrimaryExpression[]
+ | | | | +- PrimaryPrefix[@SuperModifier = false, @ThisModifier = false]
+ | | | | | +- Name[@Image = "s.length"]
+ | | | | +- PrimarySuffix[@ArgumentCount = 0, @Arguments = true, @ArrayDereference = false]
+ | | | | +- Arguments[@ArgumentCount = 0, @Size = 0]
+ | | | +- PrimaryExpression[]
+ | | | +- PrimaryPrefix[@SuperModifier = false, @ThisModifier = false]
+ | | | +- Literal[@CharLiteral = false, @DoubleLiteral = false, @EscapedStringLiteral = "2", @FloatLiteral = false, @Image = "2", @IntLiteral = true, @LongLiteral = false, @SingleCharacterStringLiteral = false, @StringLiteral = false, @TextBlock = false, @TextBlockContent = "2", @ValueAsDouble = NaN, @ValueAsFloat = NaN, @ValueAsInt = 2, @ValueAsLong = 2]
+ | | +- Statement[]
+ | | +- Block[@containsComment = false]
+ | | +- BlockStatement[@Allocation = false]
+ | | +- Statement[]
+ | | +- StatementExpression[]
+ | | +- PrimaryExpression[]
+ | | +- PrimaryPrefix[@SuperModifier = false, @ThisModifier = false]
+ | | | +- Name[@Image = "System.out.println"]
+ | | +- PrimarySuffix[@ArgumentCount = 1, @Arguments = true, @ArrayDereference = false]
+ | | +- Arguments[@ArgumentCount = 1, @Size = 1]
+ | | +- ArgumentList[@Size = 1]
+ | | +- Expression[@StandAlonePrimitive = false]
+ | | +- PrimaryExpression[]
+ | | +- PrimaryPrefix[@SuperModifier = false, @ThisModifier = false]
+ | | +- Literal[@CharLiteral = false, @DoubleLiteral = false, @EscapedStringLiteral = "\"A string containing at least two characters\"", @FloatLiteral = false, @Image = "\"A string containing at least two characters\"", @IntLiteral = false, @LongLiteral = false, @SingleCharacterStringLiteral = false, @StringLiteral = true, @TextBlock = false, @TextBlockContent = "\"A string containing at least two characters\"", @ValueAsDouble = NaN, @ValueAsFloat = NaN, @ValueAsInt = 0, @ValueAsLong = 0]
+ | +- BlockStatement[@Allocation = false]
+ | | +- Statement[]
+ | | +- IfStatement[@Else = false]
+ | | +- Expression[@StandAlonePrimitive = false]
+ | | | +- ConditionalAndExpression[]
+ | | | +- EqualityExpression[@Image = "!=", @Operator = "!="]
+ | | | | +- PrimaryExpression[]
+ | | | | | +- PrimaryPrefix[@SuperModifier = false, @ThisModifier = false]
+ | | | | | +- Name[@Image = "o"]
+ | | | | +- PrimaryExpression[]
+ | | | | +- PrimaryPrefix[@SuperModifier = false, @ThisModifier = false]
+ | | | | +- Literal[@CharLiteral = false, @DoubleLiteral = false, @EscapedStringLiteral = null, @FloatLiteral = false, @IntLiteral = false, @LongLiteral = false, @SingleCharacterStringLiteral = false, @StringLiteral = false, @TextBlock = false, @TextBlockContent = null, @ValueAsDouble = NaN, @ValueAsFloat = NaN, @ValueAsInt = 0, @ValueAsLong = 0]
+ | | | | +- NullLiteral[]
+ | | | +- PrimaryExpression[]
+ | | | +- PrimaryPrefix[@SuperModifier = false, @ThisModifier = false]
+ | | | +- Expression[@StandAlonePrimitive = false]
+ | | | +- ConditionalAndExpression[]
+ | | | +- InstanceOfExpression[]
+ | | | | +- PrimaryExpression[]
+ | | | | | +- PrimaryPrefix[@SuperModifier = false, @ThisModifier = false]
+ | | | | | +- Name[@Image = "o"]
+ | | | | +- TypePattern[@ParenthesisDepth = 0]
+ | | | | +- Type[@Array = false, @ArrayDepth = 0, @ArrayType = false, @TypeImage = "String"]
+ | | | | | +- ReferenceType[@Array = false, @ArrayDepth = 0]
+ | | | | | +- ClassOrInterfaceType[@AnonymousClass = false, @Array = false, @ArrayDepth = 0, @Image = "String", @ReferenceToClassSameCompilationUnit = false]
+ | | | | +- VariableDeclaratorId[@Array = false, @ArrayDepth = 0, @ArrayType = false, @ExceptionBlockParameter = false, @ExplicitReceiverParameter = false, @Field = false, @Final = false, @ForeachVariable = false, @FormalParameter = false, @Image = "s", @LambdaParameter = false, @LocalVariable = false, @Name = "s", @PatternBinding = true, @ResourceDeclaration = false, @TypeInferred = false, @VariableName = "s"]
+ | | | +- RelationalExpression[@Image = ">"]
+ | | | +- PrimaryExpression[]
+ | | | | +- PrimaryPrefix[@SuperModifier = false, @ThisModifier = false]
+ | | | | | +- Name[@Image = "s.length"]
+ | | | | +- PrimarySuffix[@ArgumentCount = 0, @Arguments = true, @ArrayDereference = false]
+ | | | | +- Arguments[@ArgumentCount = 0, @Size = 0]
+ | | | +- PrimaryExpression[]
+ | | | +- PrimaryPrefix[@SuperModifier = false, @ThisModifier = false]
+ | | | +- Literal[@CharLiteral = false, @DoubleLiteral = false, @EscapedStringLiteral = "3", @FloatLiteral = false, @Image = "3", @IntLiteral = true, @LongLiteral = false, @SingleCharacterStringLiteral = false, @StringLiteral = false, @TextBlock = false, @TextBlockContent = "3", @ValueAsDouble = NaN, @ValueAsFloat = NaN, @ValueAsInt = 3, @ValueAsLong = 3]
+ | | +- Statement[]
+ | | +- Block[@containsComment = false]
+ | | +- BlockStatement[@Allocation = false]
+ | | +- Statement[]
+ | | +- StatementExpression[]
+ | | +- PrimaryExpression[]
+ | | +- PrimaryPrefix[@SuperModifier = false, @ThisModifier = false]
+ | | | +- Name[@Image = "System.out.println"]
+ | | +- PrimarySuffix[@ArgumentCount = 1, @Arguments = true, @ArrayDereference = false]
+ | | +- Arguments[@ArgumentCount = 1, @Size = 1]
+ | | +- ArgumentList[@Size = 1]
+ | | +- Expression[@StandAlonePrimitive = false]
+ | | +- PrimaryExpression[]
+ | | +- PrimaryPrefix[@SuperModifier = false, @ThisModifier = false]
+ | | +- Literal[@CharLiteral = false, @DoubleLiteral = false, @EscapedStringLiteral = "\"A string containing at least three characters\"", @FloatLiteral = false, @Image = "\"A string containing at least three characters\"", @IntLiteral = false, @LongLiteral = false, @SingleCharacterStringLiteral = false, @StringLiteral = true, @TextBlock = false, @TextBlockContent = "\"A string containing at least three characters\"", @ValueAsDouble = NaN, @ValueAsFloat = NaN, @ValueAsInt = 0, @ValueAsLong = 0]
+ | +- BlockStatement[@Allocation = false]
+ | +- Statement[]
+ | +- IfStatement[@Else = false]
+ | +- Expression[@StandAlonePrimitive = false]
+ | | +- ConditionalAndExpression[]
+ | | +- PrimaryExpression[]
+ | | | +- PrimaryPrefix[@SuperModifier = false, @ThisModifier = false]
+ | | | +- Expression[@StandAlonePrimitive = false]
+ | | | +- InstanceOfExpression[]
+ | | | +- PrimaryExpression[]
+ | | | | +- PrimaryPrefix[@SuperModifier = false, @ThisModifier = false]
+ | | | | +- Name[@Image = "o"]
+ | | | +- TypePattern[@ParenthesisDepth = 0]
+ | | | +- Type[@Array = false, @ArrayDepth = 0, @ArrayType = false, @TypeImage = "String"]
+ | | | | +- ReferenceType[@Array = false, @ArrayDepth = 0]
+ | | | | +- ClassOrInterfaceType[@AnonymousClass = false, @Array = false, @ArrayDepth = 0, @Image = "String", @ReferenceToClassSameCompilationUnit = false]
+ | | | +- VariableDeclaratorId[@Array = false, @ArrayDepth = 0, @ArrayType = false, @ExceptionBlockParameter = false, @ExplicitReceiverParameter = false, @Field = false, @Final = false, @ForeachVariable = false, @FormalParameter = false, @Image = "s", @LambdaParameter = false, @LocalVariable = false, @Name = "s", @PatternBinding = true, @ResourceDeclaration = false, @TypeInferred = false, @VariableName = "s"]
+ | | +- PrimaryExpression[]
+ | | +- PrimaryPrefix[@SuperModifier = false, @ThisModifier = false]
+ | | +- Expression[@StandAlonePrimitive = false]
+ | | +- RelationalExpression[@Image = ">"]
+ | | +- PrimaryExpression[]
+ | | | +- PrimaryPrefix[@SuperModifier = false, @ThisModifier = false]
+ | | | | +- Name[@Image = "s.length"]
+ | | | +- PrimarySuffix[@ArgumentCount = 0, @Arguments = true, @ArrayDereference = false]
+ | | | +- Arguments[@ArgumentCount = 0, @Size = 0]
+ | | +- PrimaryExpression[]
+ | | +- PrimaryPrefix[@SuperModifier = false, @ThisModifier = false]
+ | | +- Literal[@CharLiteral = false, @DoubleLiteral = false, @EscapedStringLiteral = "4", @FloatLiteral = false, @Image = "4", @IntLiteral = true, @LongLiteral = false, @SingleCharacterStringLiteral = false, @StringLiteral = false, @TextBlock = false, @TextBlockContent = "4", @ValueAsDouble = NaN, @ValueAsFloat = NaN, @ValueAsInt = 4, @ValueAsLong = 4]
+ | +- Statement[]
+ | +- Block[@containsComment = false]
+ | +- BlockStatement[@Allocation = false]
+ | +- Statement[]
+ | +- StatementExpression[]
+ | +- PrimaryExpression[]
+ | +- PrimaryPrefix[@SuperModifier = false, @ThisModifier = false]
+ | | +- Name[@Image = "System.out.println"]
+ | +- PrimarySuffix[@ArgumentCount = 1, @Arguments = true, @ArrayDereference = false]
+ | +- Arguments[@ArgumentCount = 1, @Size = 1]
+ | +- ArgumentList[@Size = 1]
+ | +- Expression[@StandAlonePrimitive = false]
+ | +- PrimaryExpression[]
+ | +- PrimaryPrefix[@SuperModifier = false, @ThisModifier = false]
+ | +- Literal[@CharLiteral = false, @DoubleLiteral = false, @EscapedStringLiteral = "\"A string containing at least four characters\"", @FloatLiteral = false, @Image = "\"A string containing at least four characters\"", @IntLiteral = false, @LongLiteral = false, @SingleCharacterStringLiteral = false, @StringLiteral = true, @TextBlock = false, @TextBlockContent = "\"A string containing at least four characters\"", @ValueAsDouble = NaN, @ValueAsFloat = NaN, @ValueAsInt = 0, @ValueAsLong = 0]
+ +- ClassOrInterfaceBodyDeclaration[@AnonymousInnerClass = false, @EnumChild = false, @Kind = DeclarationKind.METHOD]
+ +- MethodDeclaration[@Abstract = false, @Arity = 1, @Default = false, @Final = false, @InterfaceMember = false, @Kind = MethodLikeKind.METHOD, @MethodName = "main", @Modifiers = 17, @Name = "main", @Native = false, @PackagePrivate = false, @Private = false, @Protected = false, @Public = true, @Static = true, @Strictfp = false, @Synchronized = false, @SyntacticallyAbstract = false, @SyntacticallyPublic = true, @Transient = false, @Void = true, @Volatile = false]
+ +- ResultType[@Void = true, @returnsArray = false]
+ +- MethodDeclarator[@Image = "main", @ParameterCount = 1]
+ | +- FormalParameters[@ParameterCount = 1, @Size = 1]
+ | +- FormalParameter[@Abstract = false, @Array = true, @ArrayDepth = 1, @Default = false, @ExplicitReceiverParameter = false, @Final = false, @Modifiers = 0, @Native = false, @PackagePrivate = true, @Private = false, @Protected = false, @Public = false, @Static = false, @Strictfp = false, @Synchronized = false, @Transient = false, @TypeInferred = false, @Varargs = false, @Volatile = false]
+ | +- Type[@Array = true, @ArrayDepth = 1, @ArrayType = true, @TypeImage = "String"]
+ | | +- ReferenceType[@Array = true, @ArrayDepth = 1]
+ | | +- ClassOrInterfaceType[@AnonymousClass = false, @Array = true, @ArrayDepth = 1, @Image = "String", @ReferenceToClassSameCompilationUnit = false]
+ | +- VariableDeclaratorId[@Array = false, @ArrayDepth = 0, @ArrayType = true, @ExceptionBlockParameter = false, @ExplicitReceiverParameter = false, @Field = false, @Final = false, @ForeachVariable = false, @FormalParameter = true, @Image = "args", @LambdaParameter = false, @LocalVariable = false, @Name = "args", @PatternBinding = false, @ResourceDeclaration = false, @TypeInferred = false, @VariableName = "args"]
+ +- Block[@containsComment = false]
+ +- BlockStatement[@Allocation = false]
+ | +- Statement[]
+ | +- StatementExpression[]
+ | +- PrimaryExpression[]
+ | +- PrimaryPrefix[@SuperModifier = false, @ThisModifier = false]
+ | | +- Name[@Image = "test"]
+ | +- PrimarySuffix[@ArgumentCount = 1, @Arguments = true, @ArrayDereference = false]
+ | +- Arguments[@ArgumentCount = 1, @Size = 1]
+ | +- ArgumentList[@Size = 1]
+ | +- Expression[@StandAlonePrimitive = false]
+ | +- PrimaryExpression[]
+ | +- PrimaryPrefix[@SuperModifier = false, @ThisModifier = false]
+ | +- Literal[@CharLiteral = false, @DoubleLiteral = false, @EscapedStringLiteral = "\"a\"", @FloatLiteral = false, @Image = "\"a\"", @IntLiteral = false, @LongLiteral = false, @SingleCharacterStringLiteral = true, @StringLiteral = true, @TextBlock = false, @TextBlockContent = "\"a\"", @ValueAsDouble = NaN, @ValueAsFloat = NaN, @ValueAsInt = 0, @ValueAsLong = 0]
+ +- BlockStatement[@Allocation = false]
+ | +- Statement[]
+ | +- StatementExpression[]
+ | +- PrimaryExpression[]
+ | +- PrimaryPrefix[@SuperModifier = false, @ThisModifier = false]
+ | | +- Name[@Image = "test"]
+ | +- PrimarySuffix[@ArgumentCount = 1, @Arguments = true, @ArrayDereference = false]
+ | +- Arguments[@ArgumentCount = 1, @Size = 1]
+ | +- ArgumentList[@Size = 1]
+ | +- Expression[@StandAlonePrimitive = false]
+ | +- PrimaryExpression[]
+ | +- PrimaryPrefix[@SuperModifier = false, @ThisModifier = false]
+ | +- Literal[@CharLiteral = false, @DoubleLiteral = false, @EscapedStringLiteral = "\"fooo\"", @FloatLiteral = false, @Image = "\"fooo\"", @IntLiteral = false, @LongLiteral = false, @SingleCharacterStringLiteral = false, @StringLiteral = true, @TextBlock = false, @TextBlockContent = "\"fooo\"", @ValueAsDouble = NaN, @ValueAsFloat = NaN, @ValueAsInt = 0, @ValueAsLong = 0]
+ +- BlockStatement[@Allocation = false]
+ | +- Statement[]
+ | +- StatementExpression[]
+ | +- PrimaryExpression[]
+ | +- PrimaryPrefix[@SuperModifier = false, @ThisModifier = false]
+ | | +- Name[@Image = "test"]
+ | +- PrimarySuffix[@ArgumentCount = 1, @Arguments = true, @ArrayDereference = false]
+ | +- Arguments[@ArgumentCount = 1, @Size = 1]
+ | +- ArgumentList[@Size = 1]
+ | +- Expression[@StandAlonePrimitive = true]
+ | +- PrimaryExpression[]
+ | +- PrimaryPrefix[@SuperModifier = false, @ThisModifier = false]
+ | +- Literal[@CharLiteral = false, @DoubleLiteral = false, @EscapedStringLiteral = "1", @FloatLiteral = false, @Image = "1", @IntLiteral = true, @LongLiteral = false, @SingleCharacterStringLiteral = false, @StringLiteral = false, @TextBlock = false, @TextBlockContent = "1", @ValueAsDouble = NaN, @ValueAsFloat = NaN, @ValueAsInt = 1, @ValueAsLong = 1]
+ +- BlockStatement[@Allocation = false]
+ | +- Statement[]
+ | +- StatementExpression[]
+ | +- PrimaryExpression[]
+ | +- PrimaryPrefix[@SuperModifier = false, @ThisModifier = false]
+ | | +- Name[@Image = "test"]
+ | +- PrimarySuffix[@ArgumentCount = 1, @Arguments = true, @ArrayDereference = false]
+ | +- Arguments[@ArgumentCount = 1, @Size = 1]
+ | +- ArgumentList[@Size = 1]
+ | +- Expression[@StandAlonePrimitive = true]
+ | +- PrimaryExpression[]
+ | +- PrimaryPrefix[@SuperModifier = false, @ThisModifier = false]
+ | +- Literal[@CharLiteral = false, @DoubleLiteral = false, @EscapedStringLiteral = "1L", @FloatLiteral = false, @Image = "1L", @IntLiteral = false, @LongLiteral = true, @SingleCharacterStringLiteral = false, @StringLiteral = false, @TextBlock = false, @TextBlockContent = "1L", @ValueAsDouble = NaN, @ValueAsFloat = NaN, @ValueAsInt = 1, @ValueAsLong = 1]
+ +- BlockStatement[@Allocation = false]
+ | +- Statement[]
+ | +- StatementExpression[]
+ | +- PrimaryExpression[]
+ | +- PrimaryPrefix[@SuperModifier = false, @ThisModifier = false]
+ | | +- Name[@Image = "instanceOfPattern"]
+ | +- PrimarySuffix[@ArgumentCount = 1, @Arguments = true, @ArrayDereference = false]
+ | +- Arguments[@ArgumentCount = 1, @Size = 1]
+ | +- ArgumentList[@Size = 1]
+ | +- Expression[@StandAlonePrimitive = false]
+ | +- PrimaryExpression[]
+ | +- PrimaryPrefix[@SuperModifier = false, @ThisModifier = false]
+ | +- Literal[@CharLiteral = false, @DoubleLiteral = false, @EscapedStringLiteral = "\"abcde\"", @FloatLiteral = false, @Image = "\"abcde\"", @IntLiteral = false, @LongLiteral = false, @SingleCharacterStringLiteral = false, @StringLiteral = true, @TextBlock = false, @TextBlockContent = "\"abcde\"", @ValueAsDouble = NaN, @ValueAsFloat = NaN, @ValueAsInt = 0, @ValueAsLong = 0]
+ +- BlockStatement[@Allocation = false]
+ | +- Statement[]
+ | +- TryStatement[@Finally = false, @TryWithResources = false]
+ | +- Block[@containsComment = true]
+ | | +- BlockStatement[@Allocation = false]
+ | | +- Statement[]
+ | | +- StatementExpression[]
+ | | +- PrimaryExpression[]
+ | | +- PrimaryPrefix[@SuperModifier = false, @ThisModifier = false]
+ | | | +- Name[@Image = "test"]
+ | | +- PrimarySuffix[@ArgumentCount = 1, @Arguments = true, @ArrayDereference = false]
+ | | +- Arguments[@ArgumentCount = 1, @Size = 1]
+ | | +- ArgumentList[@Size = 1]
+ | | +- Expression[@StandAlonePrimitive = false]
+ | | +- PrimaryExpression[]
+ | | +- PrimaryPrefix[@SuperModifier = false, @ThisModifier = false]
+ | | +- Literal[@CharLiteral = false, @DoubleLiteral = false, @EscapedStringLiteral = null, @FloatLiteral = false, @IntLiteral = false, @LongLiteral = false, @SingleCharacterStringLiteral = false, @StringLiteral = false, @TextBlock = false, @TextBlockContent = null, @ValueAsDouble = NaN, @ValueAsFloat = NaN, @ValueAsInt = 0, @ValueAsLong = 0]
+ | | +- NullLiteral[]
+ | +- CatchStatement[@ExceptionName = "e", @MulticatchStatement = false]
+ | +- FormalParameter[@Abstract = false, @Array = false, @ArrayDepth = 0, @Default = false, @ExplicitReceiverParameter = false, @Final = false, @Modifiers = 0, @Native = false, @PackagePrivate = true, @Private = false, @Protected = false, @Public = false, @Static = false, @Strictfp = false, @Synchronized = false, @Transient = false, @TypeInferred = false, @Varargs = false, @Volatile = false]
+ | | +- Type[@Array = false, @ArrayDepth = 0, @ArrayType = false, @TypeImage = "NullPointerException"]
+ | | | +- ReferenceType[@Array = false, @ArrayDepth = 0]
+ | | | +- ClassOrInterfaceType[@AnonymousClass = false, @Array = false, @ArrayDepth = 0, @Image = "NullPointerException", @ReferenceToClassSameCompilationUnit = false]
+ | | +- VariableDeclaratorId[@Array = false, @ArrayDepth = 0, @ArrayType = false, @ExceptionBlockParameter = true, @ExplicitReceiverParameter = false, @Field = false, @Final = false, @ForeachVariable = false, @FormalParameter = false, @Image = "e", @LambdaParameter = false, @LocalVariable = false, @Name = "e", @PatternBinding = false, @ResourceDeclaration = false, @TypeInferred = false, @VariableName = "e"]
+ | +- Block[@containsComment = false]
+ | +- BlockStatement[@Allocation = false]
+ | +- Statement[]
+ | +- StatementExpression[]
+ | +- PrimaryExpression[]
+ | +- PrimaryPrefix[@SuperModifier = false, @ThisModifier = false]
+ | | +- Name[@Image = "e.printStackTrace"]
+ | +- PrimarySuffix[@ArgumentCount = 0, @Arguments = true, @ArrayDereference = false]
+ | +- Arguments[@ArgumentCount = 0, @Size = 0]
+ +- BlockStatement[@Allocation = false]
+ +- Statement[]
+ +- StatementExpression[]
+ +- PrimaryExpression[]
+ +- PrimaryPrefix[@SuperModifier = false, @ThisModifier = false]
+ | +- Name[@Image = "testWithNull"]
+ +- PrimarySuffix[@ArgumentCount = 1, @Arguments = true, @ArrayDereference = false]
+ +- Arguments[@ArgumentCount = 1, @Size = 1]
+ +- ArgumentList[@Size = 1]
+ +- Expression[@StandAlonePrimitive = false]
+ +- PrimaryExpression[]
+ +- PrimaryPrefix[@SuperModifier = false, @ThisModifier = false]
+ +- Literal[@CharLiteral = false, @DoubleLiteral = false, @EscapedStringLiteral = null, @FloatLiteral = false, @IntLiteral = false, @LongLiteral = false, @SingleCharacterStringLiteral = false, @StringLiteral = false, @TextBlock = false, @TextBlockContent = null, @ValueAsDouble = NaN, @ValueAsFloat = NaN, @ValueAsInt = 0, @ValueAsLong = 0]
+ +- NullLiteral[]
diff --git a/pmd-java/src/test/resources/net/sourceforge/pmd/lang/java/ast/jdkversiontests/java20p/PatternsInSwitchLabels.java b/pmd-java/src/test/resources/net/sourceforge/pmd/lang/java/ast/jdkversiontests/java20p/PatternsInSwitchLabels.java
new file mode 100644
index 0000000000..a3ed038cb2
--- /dev/null
+++ b/pmd-java/src/test/resources/net/sourceforge/pmd/lang/java/ast/jdkversiontests/java20p/PatternsInSwitchLabels.java
@@ -0,0 +1,22 @@
+/*
+ * BSD-style license; for more info see http://pmd.sourceforge.net/license.html
+ */
+
+/**
+ * @see JEP 427: Pattern Matching for switch (Third Preview)
+ */
+public class PatternsInSwitchLabels {
+
+
+ public static void main(String[] args) {
+ Object o = 123L;
+ String formatted = switch (o) {
+ case Integer i -> String.format("int %d", i);
+ case Long l -> String.format("long %d", l);
+ case Double d -> String.format("double %f", d);
+ case String s -> String.format("String %s", s);
+ default -> o.toString();
+ };
+ System.out.println(formatted);
+ }
+}
diff --git a/pmd-java/src/test/resources/net/sourceforge/pmd/lang/java/ast/jdkversiontests/java20p/PatternsInSwitchLabels.txt b/pmd-java/src/test/resources/net/sourceforge/pmd/lang/java/ast/jdkversiontests/java20p/PatternsInSwitchLabels.txt
new file mode 100644
index 0000000000..71557a780e
--- /dev/null
+++ b/pmd-java/src/test/resources/net/sourceforge/pmd/lang/java/ast/jdkversiontests/java20p/PatternsInSwitchLabels.txt
@@ -0,0 +1,150 @@
++- CompilationUnit[@PackageName = "", @declarationsAreInDefaultPackage = true]
+ +- TypeDeclaration[]
+ +- ClassOrInterfaceDeclaration[@Abstract = false, @BinaryName = "PatternsInSwitchLabels", @Default = false, @Final = false, @Image = "PatternsInSwitchLabels", @Interface = false, @Local = false, @Modifiers = 1, @Native = false, @Nested = false, @NonSealed = false, @PackagePrivate = false, @Private = false, @Protected = false, @Public = true, @Sealed = false, @SimpleName = "PatternsInSwitchLabels", @Static = false, @Strictfp = false, @Synchronized = false, @Transient = false, @TypeKind = TypeKind.CLASS, @Volatile = false]
+ +- ClassOrInterfaceBody[@AnonymousInnerClass = false, @EnumChild = false]
+ +- ClassOrInterfaceBodyDeclaration[@AnonymousInnerClass = false, @EnumChild = false, @Kind = DeclarationKind.METHOD]
+ +- MethodDeclaration[@Abstract = false, @Arity = 1, @Default = false, @Final = false, @InterfaceMember = false, @Kind = MethodLikeKind.METHOD, @MethodName = "main", @Modifiers = 17, @Name = "main", @Native = false, @PackagePrivate = false, @Private = false, @Protected = false, @Public = true, @Static = true, @Strictfp = false, @Synchronized = false, @SyntacticallyAbstract = false, @SyntacticallyPublic = true, @Transient = false, @Void = true, @Volatile = false]
+ +- ResultType[@Void = true, @returnsArray = false]
+ +- MethodDeclarator[@Image = "main", @ParameterCount = 1]
+ | +- FormalParameters[@ParameterCount = 1, @Size = 1]
+ | +- FormalParameter[@Abstract = false, @Array = true, @ArrayDepth = 1, @Default = false, @ExplicitReceiverParameter = false, @Final = false, @Modifiers = 0, @Native = false, @PackagePrivate = true, @Private = false, @Protected = false, @Public = false, @Static = false, @Strictfp = false, @Synchronized = false, @Transient = false, @TypeInferred = false, @Varargs = false, @Volatile = false]
+ | +- Type[@Array = true, @ArrayDepth = 1, @ArrayType = true, @TypeImage = "String"]
+ | | +- ReferenceType[@Array = true, @ArrayDepth = 1]
+ | | +- ClassOrInterfaceType[@AnonymousClass = false, @Array = true, @ArrayDepth = 1, @Image = "String", @ReferenceToClassSameCompilationUnit = false]
+ | +- VariableDeclaratorId[@Array = false, @ArrayDepth = 0, @ArrayType = true, @ExceptionBlockParameter = false, @ExplicitReceiverParameter = false, @Field = false, @Final = false, @ForeachVariable = false, @FormalParameter = true, @Image = "args", @LambdaParameter = false, @LocalVariable = false, @Name = "args", @PatternBinding = false, @ResourceDeclaration = false, @TypeInferred = false, @VariableName = "args"]
+ +- Block[@containsComment = false]
+ +- BlockStatement[@Allocation = false]
+ | +- LocalVariableDeclaration[@Abstract = false, @Array = false, @ArrayDepth = 0, @Default = false, @Final = false, @Modifiers = 0, @Native = false, @PackagePrivate = true, @Private = false, @Protected = false, @Public = false, @Static = false, @Strictfp = false, @Synchronized = false, @Transient = false, @TypeInferred = false, @VariableName = "o", @Volatile = false]
+ | +- Type[@Array = false, @ArrayDepth = 0, @ArrayType = false, @TypeImage = "Object"]
+ | | +- ReferenceType[@Array = false, @ArrayDepth = 0]
+ | | +- ClassOrInterfaceType[@AnonymousClass = false, @Array = false, @ArrayDepth = 0, @Image = "Object", @ReferenceToClassSameCompilationUnit = false]
+ | +- VariableDeclarator[@Initializer = true, @Name = "o"]
+ | +- VariableDeclaratorId[@Array = false, @ArrayDepth = 0, @ArrayType = false, @ExceptionBlockParameter = false, @ExplicitReceiverParameter = false, @Field = false, @Final = false, @ForeachVariable = false, @FormalParameter = false, @Image = "o", @LambdaParameter = false, @LocalVariable = true, @Name = "o", @PatternBinding = false, @ResourceDeclaration = false, @TypeInferred = false, @VariableName = "o"]
+ | +- VariableInitializer[]
+ | +- Expression[@StandAlonePrimitive = true]
+ | +- PrimaryExpression[]
+ | +- PrimaryPrefix[@SuperModifier = false, @ThisModifier = false]
+ | +- Literal[@CharLiteral = false, @DoubleLiteral = false, @EscapedStringLiteral = "123L", @FloatLiteral = false, @Image = "123L", @IntLiteral = false, @LongLiteral = true, @SingleCharacterStringLiteral = false, @StringLiteral = false, @TextBlock = false, @TextBlockContent = "123L", @ValueAsDouble = NaN, @ValueAsFloat = NaN, @ValueAsInt = 123, @ValueAsLong = 123]
+ +- BlockStatement[@Allocation = false]
+ | +- LocalVariableDeclaration[@Abstract = false, @Array = false, @ArrayDepth = 0, @Default = false, @Final = false, @Modifiers = 0, @Native = false, @PackagePrivate = true, @Private = false, @Protected = false, @Public = false, @Static = false, @Strictfp = false, @Synchronized = false, @Transient = false, @TypeInferred = false, @VariableName = "formatted", @Volatile = false]
+ | +- Type[@Array = false, @ArrayDepth = 0, @ArrayType = false, @TypeImage = "String"]
+ | | +- ReferenceType[@Array = false, @ArrayDepth = 0]
+ | | +- ClassOrInterfaceType[@AnonymousClass = false, @Array = false, @ArrayDepth = 0, @Image = "String", @ReferenceToClassSameCompilationUnit = false]
+ | +- VariableDeclarator[@Initializer = true, @Name = "formatted"]
+ | +- VariableDeclaratorId[@Array = false, @ArrayDepth = 0, @ArrayType = false, @ExceptionBlockParameter = false, @ExplicitReceiverParameter = false, @Field = false, @Final = false, @ForeachVariable = false, @FormalParameter = false, @Image = "formatted", @LambdaParameter = false, @LocalVariable = true, @Name = "formatted", @PatternBinding = false, @ResourceDeclaration = false, @TypeInferred = false, @VariableName = "formatted"]
+ | +- VariableInitializer[]
+ | +- Expression[@StandAlonePrimitive = false]
+ | +- SwitchExpression[]
+ | +- Expression[@StandAlonePrimitive = false]
+ | | +- PrimaryExpression[]
+ | | +- PrimaryPrefix[@SuperModifier = false, @ThisModifier = false]
+ | | +- Name[@Image = "o"]
+ | +- SwitchLabeledExpression[]
+ | | +- SwitchLabel[@Default = false]
+ | | | +- TypePattern[@ParenthesisDepth = 0]
+ | | | +- Type[@Array = false, @ArrayDepth = 0, @ArrayType = false, @TypeImage = "Integer"]
+ | | | | +- ReferenceType[@Array = false, @ArrayDepth = 0]
+ | | | | +- ClassOrInterfaceType[@AnonymousClass = false, @Array = false, @ArrayDepth = 0, @Image = "Integer", @ReferenceToClassSameCompilationUnit = false]
+ | | | +- VariableDeclaratorId[@Array = false, @ArrayDepth = 0, @ArrayType = false, @ExceptionBlockParameter = false, @ExplicitReceiverParameter = false, @Field = false, @Final = false, @ForeachVariable = false, @FormalParameter = false, @Image = "i", @LambdaParameter = false, @LocalVariable = false, @Name = "i", @PatternBinding = true, @ResourceDeclaration = false, @TypeInferred = false, @VariableName = "i"]
+ | | +- Expression[@StandAlonePrimitive = false]
+ | | +- PrimaryExpression[]
+ | | +- PrimaryPrefix[@SuperModifier = false, @ThisModifier = false]
+ | | | +- Name[@Image = "String.format"]
+ | | +- PrimarySuffix[@ArgumentCount = 2, @Arguments = true, @ArrayDereference = false]
+ | | +- Arguments[@ArgumentCount = 2, @Size = 2]
+ | | +- ArgumentList[@Size = 2]
+ | | +- Expression[@StandAlonePrimitive = false]
+ | | | +- PrimaryExpression[]
+ | | | +- PrimaryPrefix[@SuperModifier = false, @ThisModifier = false]
+ | | | +- Literal[@CharLiteral = false, @DoubleLiteral = false, @EscapedStringLiteral = "\"int %d\"", @FloatLiteral = false, @Image = "\"int %d\"", @IntLiteral = false, @LongLiteral = false, @SingleCharacterStringLiteral = false, @StringLiteral = true, @TextBlock = false, @TextBlockContent = "\"int %d\"", @ValueAsDouble = NaN, @ValueAsFloat = NaN, @ValueAsInt = 0, @ValueAsLong = 0]
+ | | +- Expression[@StandAlonePrimitive = false]
+ | | +- PrimaryExpression[]
+ | | +- PrimaryPrefix[@SuperModifier = false, @ThisModifier = false]
+ | | +- Name[@Image = "i"]
+ | +- SwitchLabeledExpression[]
+ | | +- SwitchLabel[@Default = false]
+ | | | +- TypePattern[@ParenthesisDepth = 0]
+ | | | +- Type[@Array = false, @ArrayDepth = 0, @ArrayType = false, @TypeImage = "Long"]
+ | | | | +- ReferenceType[@Array = false, @ArrayDepth = 0]
+ | | | | +- ClassOrInterfaceType[@AnonymousClass = false, @Array = false, @ArrayDepth = 0, @Image = "Long", @ReferenceToClassSameCompilationUnit = false]
+ | | | +- VariableDeclaratorId[@Array = false, @ArrayDepth = 0, @ArrayType = false, @ExceptionBlockParameter = false, @ExplicitReceiverParameter = false, @Field = false, @Final = false, @ForeachVariable = false, @FormalParameter = false, @Image = "l", @LambdaParameter = false, @LocalVariable = false, @Name = "l", @PatternBinding = true, @ResourceDeclaration = false, @TypeInferred = false, @VariableName = "l"]
+ | | +- Expression[@StandAlonePrimitive = false]
+ | | +- PrimaryExpression[]
+ | | +- PrimaryPrefix[@SuperModifier = false, @ThisModifier = false]
+ | | | +- Name[@Image = "String.format"]
+ | | +- PrimarySuffix[@ArgumentCount = 2, @Arguments = true, @ArrayDereference = false]
+ | | +- Arguments[@ArgumentCount = 2, @Size = 2]
+ | | +- ArgumentList[@Size = 2]
+ | | +- Expression[@StandAlonePrimitive = false]
+ | | | +- PrimaryExpression[]
+ | | | +- PrimaryPrefix[@SuperModifier = false, @ThisModifier = false]
+ | | | +- Literal[@CharLiteral = false, @DoubleLiteral = false, @EscapedStringLiteral = "\"long %d\"", @FloatLiteral = false, @Image = "\"long %d\"", @IntLiteral = false, @LongLiteral = false, @SingleCharacterStringLiteral = false, @StringLiteral = true, @TextBlock = false, @TextBlockContent = "\"long %d\"", @ValueAsDouble = NaN, @ValueAsFloat = NaN, @ValueAsInt = 0, @ValueAsLong = 0]
+ | | +- Expression[@StandAlonePrimitive = false]
+ | | +- PrimaryExpression[]
+ | | +- PrimaryPrefix[@SuperModifier = false, @ThisModifier = false]
+ | | +- Name[@Image = "l"]
+ | +- SwitchLabeledExpression[]
+ | | +- SwitchLabel[@Default = false]
+ | | | +- TypePattern[@ParenthesisDepth = 0]
+ | | | +- Type[@Array = false, @ArrayDepth = 0, @ArrayType = false, @TypeImage = "Double"]
+ | | | | +- ReferenceType[@Array = false, @ArrayDepth = 0]
+ | | | | +- ClassOrInterfaceType[@AnonymousClass = false, @Array = false, @ArrayDepth = 0, @Image = "Double", @ReferenceToClassSameCompilationUnit = false]
+ | | | +- VariableDeclaratorId[@Array = false, @ArrayDepth = 0, @ArrayType = false, @ExceptionBlockParameter = false, @ExplicitReceiverParameter = false, @Field = false, @Final = false, @ForeachVariable = false, @FormalParameter = false, @Image = "d", @LambdaParameter = false, @LocalVariable = false, @Name = "d", @PatternBinding = true, @ResourceDeclaration = false, @TypeInferred = false, @VariableName = "d"]
+ | | +- Expression[@StandAlonePrimitive = false]
+ | | +- PrimaryExpression[]
+ | | +- PrimaryPrefix[@SuperModifier = false, @ThisModifier = false]
+ | | | +- Name[@Image = "String.format"]
+ | | +- PrimarySuffix[@ArgumentCount = 2, @Arguments = true, @ArrayDereference = false]
+ | | +- Arguments[@ArgumentCount = 2, @Size = 2]
+ | | +- ArgumentList[@Size = 2]
+ | | +- Expression[@StandAlonePrimitive = false]
+ | | | +- PrimaryExpression[]
+ | | | +- PrimaryPrefix[@SuperModifier = false, @ThisModifier = false]
+ | | | +- Literal[@CharLiteral = false, @DoubleLiteral = false, @EscapedStringLiteral = "\"double %f\"", @FloatLiteral = false, @Image = "\"double %f\"", @IntLiteral = false, @LongLiteral = false, @SingleCharacterStringLiteral = false, @StringLiteral = true, @TextBlock = false, @TextBlockContent = "\"double %f\"", @ValueAsDouble = NaN, @ValueAsFloat = NaN, @ValueAsInt = 0, @ValueAsLong = 0]
+ | | +- Expression[@StandAlonePrimitive = false]
+ | | +- PrimaryExpression[]
+ | | +- PrimaryPrefix[@SuperModifier = false, @ThisModifier = false]
+ | | +- Name[@Image = "d"]
+ | +- SwitchLabeledExpression[]
+ | | +- SwitchLabel[@Default = false]
+ | | | +- TypePattern[@ParenthesisDepth = 0]
+ | | | +- Type[@Array = false, @ArrayDepth = 0, @ArrayType = false, @TypeImage = "String"]
+ | | | | +- ReferenceType[@Array = false, @ArrayDepth = 0]
+ | | | | +- ClassOrInterfaceType[@AnonymousClass = false, @Array = false, @ArrayDepth = 0, @Image = "String", @ReferenceToClassSameCompilationUnit = false]
+ | | | +- VariableDeclaratorId[@Array = false, @ArrayDepth = 0, @ArrayType = false, @ExceptionBlockParameter = false, @ExplicitReceiverParameter = false, @Field = false, @Final = false, @ForeachVariable = false, @FormalParameter = false, @Image = "s", @LambdaParameter = false, @LocalVariable = false, @Name = "s", @PatternBinding = true, @ResourceDeclaration = false, @TypeInferred = false, @VariableName = "s"]
+ | | +- Expression[@StandAlonePrimitive = false]
+ | | +- PrimaryExpression[]
+ | | +- PrimaryPrefix[@SuperModifier = false, @ThisModifier = false]
+ | | | +- Name[@Image = "String.format"]
+ | | +- PrimarySuffix[@ArgumentCount = 2, @Arguments = true, @ArrayDereference = false]
+ | | +- Arguments[@ArgumentCount = 2, @Size = 2]
+ | | +- ArgumentList[@Size = 2]
+ | | +- Expression[@StandAlonePrimitive = false]
+ | | | +- PrimaryExpression[]
+ | | | +- PrimaryPrefix[@SuperModifier = false, @ThisModifier = false]
+ | | | +- Literal[@CharLiteral = false, @DoubleLiteral = false, @EscapedStringLiteral = "\"String %s\"", @FloatLiteral = false, @Image = "\"String %s\"", @IntLiteral = false, @LongLiteral = false, @SingleCharacterStringLiteral = false, @StringLiteral = true, @TextBlock = false, @TextBlockContent = "\"String %s\"", @ValueAsDouble = NaN, @ValueAsFloat = NaN, @ValueAsInt = 0, @ValueAsLong = 0]
+ | | +- Expression[@StandAlonePrimitive = false]
+ | | +- PrimaryExpression[]
+ | | +- PrimaryPrefix[@SuperModifier = false, @ThisModifier = false]
+ | | +- Name[@Image = "s"]
+ | +- SwitchLabeledExpression[]
+ | +- SwitchLabel[@Default = true]
+ | +- Expression[@StandAlonePrimitive = false]
+ | +- PrimaryExpression[]
+ | +- PrimaryPrefix[@SuperModifier = false, @ThisModifier = false]
+ | | +- Name[@Image = "o.toString"]
+ | +- PrimarySuffix[@ArgumentCount = 0, @Arguments = true, @ArrayDereference = false]
+ | +- Arguments[@ArgumentCount = 0, @Size = 0]
+ +- BlockStatement[@Allocation = false]
+ +- Statement[]
+ +- StatementExpression[]
+ +- PrimaryExpression[]
+ +- PrimaryPrefix[@SuperModifier = false, @ThisModifier = false]
+ | +- Name[@Image = "System.out.println"]
+ +- PrimarySuffix[@ArgumentCount = 1, @Arguments = true, @ArrayDereference = false]
+ +- Arguments[@ArgumentCount = 1, @Size = 1]
+ +- ArgumentList[@Size = 1]
+ +- Expression[@StandAlonePrimitive = false]
+ +- PrimaryExpression[]
+ +- PrimaryPrefix[@SuperModifier = false, @ThisModifier = false]
+ +- Name[@Image = "formatted"]
diff --git a/pmd-java/src/test/resources/net/sourceforge/pmd/lang/java/ast/jdkversiontests/java20p/RecordPatterns.java b/pmd-java/src/test/resources/net/sourceforge/pmd/lang/java/ast/jdkversiontests/java20p/RecordPatterns.java
new file mode 100644
index 0000000000..4a28b35b50
--- /dev/null
+++ b/pmd-java/src/test/resources/net/sourceforge/pmd/lang/java/ast/jdkversiontests/java20p/RecordPatterns.java
@@ -0,0 +1,64 @@
+/*
+ * BSD-style license; for more info see http://pmd.sourceforge.net/license.html
+ */
+
+/**
+ * @see JEP 405: Record Patterns (Preview)
+ */
+public class RecordPatterns {
+
+ record Point(int x, int y) {}
+ enum Color { RED, GREEN, BLUE }
+ record ColoredPoint(Point p, Color c) {}
+ record Rectangle(ColoredPoint upperLeft, ColoredPoint lowerRight) {}
+
+ void printSum1(Object o) {
+ if (o instanceof Point p) {
+ int x = p.x();
+ int y = p.y();
+ System.out.println(x+y);
+ }
+ }
+
+ // record pattern
+ void printSum2(Object o) {
+ if (o instanceof Point(int x, int y)) {
+ System.out.println(x+y);
+ }
+ }
+
+ void printUpperLeftColoredPoint(Rectangle r) {
+ if (r instanceof Rectangle(ColoredPoint ul, ColoredPoint lr)) {
+ System.out.println(ul.c());
+ }
+ }
+
+ // nested record pattern
+ void printColorOfUpperLeftPoint(Rectangle r) {
+ if (r instanceof Rectangle(ColoredPoint(Point p, Color c),
+ ColoredPoint lr)) {
+ System.out.println(c);
+ }
+ }
+
+ // fully nested record pattern, also using "var"
+ void printXCoordOfUpperLeftPointWithPatterns(Rectangle r) {
+ if (r instanceof Rectangle(ColoredPoint(Point(var x, var y), var c),
+ var lr)) {
+ System.out.println("Upper-left corner: " + x);
+ }
+ }
+
+ // record patterns with generic types
+ record Box(T t) {}
+ void test1(Box