diff --git a/pmd-java/src/test/kotlin/net/sourceforge/pmd/lang/java/ast/AbstractJavaTreeDumpTest.kt b/pmd-java/src/test/kotlin/net/sourceforge/pmd/lang/java/ast/AbstractJavaTreeDumpTest.kt new file mode 100644 index 0000000000..ab7823f02d --- /dev/null +++ b/pmd-java/src/test/kotlin/net/sourceforge/pmd/lang/java/ast/AbstractJavaTreeDumpTest.kt @@ -0,0 +1,22 @@ +/* + * BSD-style license; for more info see http://pmd.sourceforge.net/license.html + */ + +package net.sourceforge.pmd.lang.java.ast + +import com.github.oowekyala.treeutils.printers.SimpleTreePrinter +import net.sourceforge.pmd.lang.ast.Node +import net.sourceforge.pmd.lang.ast.test.BaseTreeDumpTest +import net.sourceforge.pmd.lang.ast.test.RelevantAttributePrinter +import net.sourceforge.pmd.lang.java.JavaParsingHelper + +abstract class AbstractJavaTreeDumpTest : BaseTreeDumpTest( + printer = RelevantAttributePrinter(SimpleTreePrinter.AsciiStrings), + pathToFixtures = "testdata", + extension = ".java" +) { + override fun parseFile(fileText: String): Node = + JavaParsingHelper.WITH_PROCESSING.parse(fileText) + +} + diff --git a/pmd-java/src/test/kotlin/net/sourceforge/pmd/lang/java/ast/AstTreeDumpTests.kt b/pmd-java/src/test/kotlin/net/sourceforge/pmd/lang/java/ast/AstTreeDumpTests.kt new file mode 100644 index 0000000000..cc824437f5 --- /dev/null +++ b/pmd-java/src/test/kotlin/net/sourceforge/pmd/lang/java/ast/AstTreeDumpTests.kt @@ -0,0 +1,24 @@ +/* + * BSD-style license; for more info see http://pmd.sourceforge.net/license.html + */ + +package net.sourceforge.pmd.lang.java.ast + +import org.junit.Test + +/** + * Compare a dump of a file against a saved baseline. + * + * @author Clément Fournier + */ +class AstTreeDumpTests : AbstractJavaTreeDumpTest() { + + + @Test + fun testCornerCases() = doTest("ParserCornerCases") + + @Test + fun testComplicatedLambda() = doTest("Bug1429") + + +} diff --git a/pmd-java/src/test/resources/net/sourceforge/pmd/lang/java/ast/testdata/Bug1429.java b/pmd-java/src/test/resources/net/sourceforge/pmd/lang/java/ast/testdata/Bug1429.java new file mode 100644 index 0000000000..2f61b06e26 --- /dev/null +++ b/pmd-java/src/test/resources/net/sourceforge/pmd/lang/java/ast/testdata/Bug1429.java @@ -0,0 +1,22 @@ +/* + * BSD-style license; for more info see http://pmd.sourceforge.net/license.html + */ + +public class Bug1429 { + public Set getAttributeTuples() { + return (Set) (this.attributes == null ? Collections. emptySet() : new HashSet( + CollectionUtils.collect(this.attributes.keySet(), new Transformer() { + @Override + public Object transform(final Object obj) { + final String key = (String) obj; + final String value = HGXLIFFTypeConfiguration.this.attributes.get(key); + + String result = key; + if (StringUtils.isNotEmpty(value)) { + result = result.concat(":").concat(value); + } + return result; + } + }))); + } +} diff --git a/pmd-java/src/test/resources/net/sourceforge/pmd/lang/java/ast/testdata/Bug1429.txt b/pmd-java/src/test/resources/net/sourceforge/pmd/lang/java/ast/testdata/Bug1429.txt new file mode 100644 index 0000000000..3e88e2adaa --- /dev/null +++ b/pmd-java/src/test/resources/net/sourceforge/pmd/lang/java/ast/testdata/Bug1429.txt @@ -0,0 +1,94 @@ ++-- CompilationUnit[@PackageName = "", @declarationsAreInDefaultPackage = true] + +-- TypeDeclaration[] + +-- ClassOrInterfaceDeclaration[@Abstract = false, @BinaryName = "Bug1429", @Default = false, @Final = false, @Image = "Bug1429", @Interface = false, @Local = false, @Modifiers = 1, @Native = false, @Nested = null, @PackagePrivate = false, @Private = false, @Protected = false, @Public = true, @SimpleName = "Bug1429", @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 = 0, @Default = false, @Final = false, @Image = "getAttributeTuples", @InterfaceMember = false, @Kind = MethodLikeKind.METHOD, @MethodName = "getAttributeTuples", @Modifiers = 1, @Name = "getAttributeTuples", @Native = false, @PackagePrivate = false, @Private = false, @Protected = false, @Public = true, @Static = false, @Strictfp = false, @Synchronized = false, @SyntacticallyAbstract = false, @SyntacticallyPublic = true, @Transient = false, @Varargs = false, @Void = false, @Volatile = false] + +-- ResultType[@Void = false, @returnsArray = false] + | +-- ClassOrInterfaceType[@AnonymousClass = false, @ArrayDepth = 0, @ArrayType = false, @ClassOrInterfaceType = true, @Image = "Set", @PrimitiveType = false, @ReferenceToClassSameCompilationUnit = false, @ReferenceType = true, @SimpleName = "Set", @TypeImage = "Set"] + | +-- TypeArguments[@Diamond = false] + | +-- ClassOrInterfaceType[@AnonymousClass = false, @ArrayDepth = 0, @ArrayType = false, @ClassOrInterfaceType = true, @Image = "String", @PrimitiveType = false, @ReferenceToClassSameCompilationUnit = false, @ReferenceType = true, @SimpleName = "String", @TypeImage = "String"] + +-- FormalParameters[@ParameterCount = 0] + +-- Block[@containsComment = false] + +-- ReturnStatement[] + +-- CastExpression[@CompileTimeConstant = false, @Expression = true, @ParenthesisDepth = 0, @Parenthesized = false] + +-- ClassOrInterfaceType[@AnonymousClass = false, @ArrayDepth = 0, @ArrayType = false, @ClassOrInterfaceType = true, @Image = "Set", @PrimitiveType = false, @ReferenceToClassSameCompilationUnit = false, @ReferenceType = true, @SimpleName = "Set", @TypeImage = "Set"] + | +-- TypeArguments[@Diamond = false] + | +-- ClassOrInterfaceType[@AnonymousClass = false, @ArrayDepth = 0, @ArrayType = false, @ClassOrInterfaceType = true, @Image = "String", @PrimitiveType = false, @ReferenceToClassSameCompilationUnit = false, @ReferenceType = true, @SimpleName = "String", @TypeImage = "String"] + +-- ConditionalExpression[@CompileTimeConstant = false, @Expression = true, @ParenthesisDepth = 1, @Parenthesized = true] + +-- InfixExpression[@CompileTimeConstant = false, @Expression = true, @Operator = BinaryOp.EQ, @ParenthesisDepth = 0, @Parenthesized = false] + | +-- FieldAccess[@AccessType = AccessType.READ, @CompileTimeConstant = false, @Expression = true, @FieldName = "attributes", @Image = "attributes", @ParenthesisDepth = 0, @Parenthesized = false] + | | +-- ThisExpression[@CompileTimeConstant = false, @Expression = true, @ParenthesisDepth = 0, @Parenthesized = false] + | +-- NullLiteral[@BooleanLiteral = false, @CharLiteral = false, @CompileTimeConstant = false, @DoubleLiteral = false, @Expression = true, @FloatLiteral = false, @IntLiteral = false, @LongLiteral = false, @NullLiteral = true, @NumericLiteral = false, @ParenthesisDepth = 0, @Parenthesized = false, @StringLiteral = false] + +-- MethodCall[@CompileTimeConstant = false, @Expression = true, @Image = "emptySet", @MethodName = "emptySet", @ParenthesisDepth = 0, @Parenthesized = false] + | +-- AmbiguousName[@ArrayDepth = 0, @ArrayType = false, @ClassOrInterfaceType = false, @CompileTimeConstant = false, @Expression = true, @Image = "Collections", @Name = "Collections", @ParenthesisDepth = 0, @Parenthesized = false, @PrimitiveType = false, @ReferenceType = true, @Segments = null, @TypeImage = "Collections"] + | +-- TypeArguments[@Diamond = false] + | | +-- ClassOrInterfaceType[@AnonymousClass = false, @ArrayDepth = 0, @ArrayType = false, @ClassOrInterfaceType = true, @Image = "String", @PrimitiveType = false, @ReferenceToClassSameCompilationUnit = false, @ReferenceType = true, @SimpleName = "String", @TypeImage = "String"] + | +-- ArgumentList[@ArgumentCount = 0] + +-- ConstructorCall[@AnonymousClass = false, @CompileTimeConstant = false, @DiamondTypeArgs = false, @Expression = true, @ParenthesisDepth = 0, @Parenthesized = false, @QualifiedInstanceCreation = false] + +-- ClassOrInterfaceType[@AnonymousClass = false, @ArrayDepth = 0, @ArrayType = false, @ClassOrInterfaceType = true, @Image = "HashSet", @PrimitiveType = false, @ReferenceToClassSameCompilationUnit = false, @ReferenceType = true, @SimpleName = "HashSet", @TypeImage = "HashSet"] + | +-- TypeArguments[@Diamond = false] + | +-- ClassOrInterfaceType[@AnonymousClass = false, @ArrayDepth = 0, @ArrayType = false, @ClassOrInterfaceType = true, @Image = "String", @PrimitiveType = false, @ReferenceToClassSameCompilationUnit = false, @ReferenceType = true, @SimpleName = "String", @TypeImage = "String"] + +-- ArgumentList[@ArgumentCount = 1] + +-- MethodCall[@CompileTimeConstant = false, @Expression = true, @Image = "collect", @MethodName = "collect", @ParenthesisDepth = 0, @Parenthesized = false] + +-- AmbiguousName[@ArrayDepth = 0, @ArrayType = false, @ClassOrInterfaceType = false, @CompileTimeConstant = false, @Expression = true, @Image = "CollectionUtils", @Name = "CollectionUtils", @ParenthesisDepth = 0, @Parenthesized = false, @PrimitiveType = false, @ReferenceType = true, @Segments = null, @TypeImage = "CollectionUtils"] + +-- ArgumentList[@ArgumentCount = 2] + +-- MethodCall[@CompileTimeConstant = false, @Expression = true, @Image = "keySet", @MethodName = "keySet", @ParenthesisDepth = 0, @Parenthesized = false] + | +-- FieldAccess[@AccessType = AccessType.READ, @CompileTimeConstant = false, @Expression = true, @FieldName = "attributes", @Image = "attributes", @ParenthesisDepth = 0, @Parenthesized = false] + | | +-- ThisExpression[@CompileTimeConstant = false, @Expression = true, @ParenthesisDepth = 0, @Parenthesized = false] + | +-- ArgumentList[@ArgumentCount = 0] + +-- ConstructorCall[@AnonymousClass = true, @CompileTimeConstant = false, @DiamondTypeArgs = false, @Expression = true, @ParenthesisDepth = 0, @Parenthesized = false, @QualifiedInstanceCreation = false] + +-- ClassOrInterfaceType[@AnonymousClass = false, @ArrayDepth = 0, @ArrayType = false, @ClassOrInterfaceType = true, @Image = "Transformer", @PrimitiveType = false, @ReferenceToClassSameCompilationUnit = false, @ReferenceType = true, @SimpleName = "Transformer", @TypeImage = "Transformer"] + +-- ArgumentList[@ArgumentCount = 0] + +-- AnonymousClassDeclaration[] + +-- ClassOrInterfaceBody[@AnonymousInnerClass = false, @EnumChild = false] + +-- ClassOrInterfaceBodyDeclaration[@AnonymousInnerClass = false, @EnumChild = false, @Kind = DeclarationKind.METHOD] + +-- MethodDeclaration[@Abstract = false, @Arity = 1, @Default = false, @Final = false, @Image = "transform", @InterfaceMember = false, @Kind = MethodLikeKind.METHOD, @MethodName = "transform", @Modifiers = 1, @Name = "transform", @Native = false, @PackagePrivate = false, @Private = false, @Protected = false, @Public = true, @Static = false, @Strictfp = false, @Synchronized = false, @SyntacticallyAbstract = false, @SyntacticallyPublic = true, @Transient = false, @Varargs = false, @Void = false, @Volatile = false] + +-- MarkerAnnotation[@AnnotationName = "Override", @Image = "Override", @SimpleName = "Override"] + +-- ResultType[@Void = false, @returnsArray = false] + | +-- ClassOrInterfaceType[@AnonymousClass = false, @ArrayDepth = 0, @ArrayType = false, @ClassOrInterfaceType = true, @Image = "Object", @PrimitiveType = false, @ReferenceToClassSameCompilationUnit = false, @ReferenceType = true, @SimpleName = "Object", @TypeImage = "Object"] + +-- FormalParameters[@ParameterCount = 1] + | +-- FormalParameter[@Abstract = false, @Array = false, @ArrayDepth = 0, @Default = false, @Final = true, @Modifiers = 32, @Native = false, @PackagePrivate = true, @Private = false, @Protected = false, @Public = false, @Static = false, @Strictfp = false, @Synchronized = false, @Transient = false, @TypeInferred = false, @Varargs = false, @Volatile = false] + | +-- ClassOrInterfaceType[@AnonymousClass = false, @ArrayDepth = 0, @ArrayType = false, @ClassOrInterfaceType = true, @Image = "Object", @PrimitiveType = false, @ReferenceToClassSameCompilationUnit = false, @ReferenceType = true, @SimpleName = "Object", @TypeImage = "Object"] + | +-- VariableDeclaratorId[@Array = false, @ArrayDepth = 0, @ArrayType = false, @EnumConstant = false, @ExceptionBlockParameter = false, @Field = false, @Final = true, @FormalParameter = true, @Image = "obj", @LambdaParameter = false, @LocalVariable = false, @ResourceDeclaration = false, @TypeInferred = false, @VariableName = "obj"] + +-- Block[@containsComment = false] + +-- LocalVariableDeclaration[@Abstract = false, @Array = false, @ArrayDepth = 0, @Default = false, @Final = true, @Modifiers = 32, @Native = false, @PackagePrivate = true, @Private = false, @Protected = false, @Public = false, @Static = false, @Strictfp = false, @Synchronized = false, @Transient = false, @TypeInferred = false, @VariableName = "key", @Volatile = false] + | +-- ClassOrInterfaceType[@AnonymousClass = false, @ArrayDepth = 0, @ArrayType = false, @ClassOrInterfaceType = true, @Image = "String", @PrimitiveType = false, @ReferenceToClassSameCompilationUnit = false, @ReferenceType = true, @SimpleName = "String", @TypeImage = "String"] + | +-- VariableDeclarator[@Initializer = true, @Name = "key"] + | +-- VariableDeclaratorId[@Array = false, @ArrayDepth = 0, @ArrayType = false, @EnumConstant = false, @ExceptionBlockParameter = false, @Field = false, @Final = true, @FormalParameter = false, @Image = "key", @LambdaParameter = false, @LocalVariable = true, @ResourceDeclaration = false, @TypeInferred = false, @VariableName = "key"] + | +-- CastExpression[@CompileTimeConstant = false, @Expression = true, @ParenthesisDepth = 0, @Parenthesized = false] + | +-- ClassOrInterfaceType[@AnonymousClass = false, @ArrayDepth = 0, @ArrayType = false, @ClassOrInterfaceType = true, @Image = "String", @PrimitiveType = false, @ReferenceToClassSameCompilationUnit = false, @ReferenceType = true, @SimpleName = "String", @TypeImage = "String"] + | +-- VariableAccess[@AccessType = AccessType.READ, @CompileTimeConstant = false, @Expression = true, @Image = "obj", @ParenthesisDepth = 0, @Parenthesized = false, @VariableName = "obj"] + +-- LocalVariableDeclaration[@Abstract = false, @Array = false, @ArrayDepth = 0, @Default = false, @Final = true, @Modifiers = 32, @Native = false, @PackagePrivate = true, @Private = false, @Protected = false, @Public = false, @Static = false, @Strictfp = false, @Synchronized = false, @Transient = false, @TypeInferred = false, @VariableName = "value", @Volatile = false] + | +-- ClassOrInterfaceType[@AnonymousClass = false, @ArrayDepth = 0, @ArrayType = false, @ClassOrInterfaceType = true, @Image = "String", @PrimitiveType = false, @ReferenceToClassSameCompilationUnit = false, @ReferenceType = true, @SimpleName = "String", @TypeImage = "String"] + | +-- VariableDeclarator[@Initializer = true, @Name = "value"] + | +-- VariableDeclaratorId[@Array = false, @ArrayDepth = 0, @ArrayType = false, @EnumConstant = false, @ExceptionBlockParameter = false, @Field = false, @Final = true, @FormalParameter = false, @Image = "value", @LambdaParameter = false, @LocalVariable = true, @ResourceDeclaration = false, @TypeInferred = false, @VariableName = "value"] + | +-- MethodCall[@CompileTimeConstant = false, @Expression = true, @Image = "get", @MethodName = "get", @ParenthesisDepth = 0, @Parenthesized = false] + | +-- FieldAccess[@AccessType = AccessType.READ, @CompileTimeConstant = false, @Expression = true, @FieldName = "attributes", @Image = "attributes", @ParenthesisDepth = 0, @Parenthesized = false] + | | +-- ThisExpression[@CompileTimeConstant = false, @Expression = true, @ParenthesisDepth = 0, @Parenthesized = false] + | | +-- ClassOrInterfaceType[@AnonymousClass = false, @ArrayDepth = 0, @ArrayType = false, @ClassOrInterfaceType = true, @Image = "HGXLIFFTypeConfiguration", @PrimitiveType = false, @ReferenceToClassSameCompilationUnit = false, @ReferenceType = true, @SimpleName = "HGXLIFFTypeConfiguration", @TypeImage = "HGXLIFFTypeConfiguration"] + | +-- ArgumentList[@ArgumentCount = 1] + | +-- VariableAccess[@AccessType = AccessType.READ, @CompileTimeConstant = false, @Expression = true, @Image = "key", @ParenthesisDepth = 0, @Parenthesized = false, @VariableName = "key"] + +-- 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 = "result", @Volatile = false] + | +-- ClassOrInterfaceType[@AnonymousClass = false, @ArrayDepth = 0, @ArrayType = false, @ClassOrInterfaceType = true, @Image = "String", @PrimitiveType = false, @ReferenceToClassSameCompilationUnit = false, @ReferenceType = true, @SimpleName = "String", @TypeImage = "String"] + | +-- VariableDeclarator[@Initializer = true, @Name = "result"] + | +-- VariableDeclaratorId[@Array = false, @ArrayDepth = 0, @ArrayType = false, @EnumConstant = false, @ExceptionBlockParameter = false, @Field = false, @Final = false, @FormalParameter = false, @Image = "result", @LambdaParameter = false, @LocalVariable = true, @ResourceDeclaration = false, @TypeInferred = false, @VariableName = "result"] + | +-- VariableAccess[@AccessType = AccessType.READ, @CompileTimeConstant = false, @Expression = true, @Image = "key", @ParenthesisDepth = 0, @Parenthesized = false, @VariableName = "key"] + +-- IfStatement[@Else = false] + | +-- MethodCall[@CompileTimeConstant = false, @Expression = true, @Image = "isNotEmpty", @MethodName = "isNotEmpty", @ParenthesisDepth = 0, @Parenthesized = false] + | | +-- AmbiguousName[@ArrayDepth = 0, @ArrayType = false, @ClassOrInterfaceType = false, @CompileTimeConstant = false, @Expression = true, @Image = "StringUtils", @Name = "StringUtils", @ParenthesisDepth = 0, @Parenthesized = false, @PrimitiveType = false, @ReferenceType = true, @Segments = null, @TypeImage = "StringUtils"] + | | +-- ArgumentList[@ArgumentCount = 1] + | | +-- VariableAccess[@AccessType = AccessType.READ, @CompileTimeConstant = false, @Expression = true, @Image = "value", @ParenthesisDepth = 0, @Parenthesized = false, @VariableName = "value"] + | +-- Block[@containsComment = false] + | +-- ExpressionStatement[] + | +-- AssignmentExpression[@CompileTimeConstant = false, @Compound = false, @Expression = true, @Operator = AssignmentOp.ASSIGN, @ParenthesisDepth = 0, @Parenthesized = false] + | +-- VariableAccess[@AccessType = AccessType.WRITE, @CompileTimeConstant = false, @Expression = true, @Image = "result", @ParenthesisDepth = 0, @Parenthesized = false, @VariableName = "result"] + | +-- MethodCall[@CompileTimeConstant = false, @Expression = true, @Image = "concat", @MethodName = "concat", @ParenthesisDepth = 0, @Parenthesized = false] + | +-- MethodCall[@CompileTimeConstant = false, @Expression = true, @Image = "concat", @MethodName = "concat", @ParenthesisDepth = 0, @Parenthesized = false] + | | +-- AmbiguousName[@ArrayDepth = 0, @ArrayType = false, @ClassOrInterfaceType = false, @CompileTimeConstant = false, @Expression = true, @Image = "result", @Name = "result", @ParenthesisDepth = 0, @Parenthesized = false, @PrimitiveType = false, @ReferenceType = true, @Segments = null, @TypeImage = "result"] + | | +-- ArgumentList[@ArgumentCount = 1] + | | +-- StringLiteral[@BooleanLiteral = false, @CharLiteral = false, @CompileTimeConstant = true, @ConstValue = ":", @DoubleLiteral = false, @Expression = true, @FloatLiteral = false, @Image = "":"", @IntLiteral = false, @LongLiteral = false, @NullLiteral = false, @NumericLiteral = false, @ParenthesisDepth = 0, @Parenthesized = false, @StringLiteral = true, @TextBlock = false] + | +-- ArgumentList[@ArgumentCount = 1] + | +-- VariableAccess[@AccessType = AccessType.READ, @CompileTimeConstant = false, @Expression = true, @Image = "value", @ParenthesisDepth = 0, @Parenthesized = false, @VariableName = "value"] + +-- ReturnStatement[] + +-- VariableAccess[@AccessType = AccessType.READ, @CompileTimeConstant = false, @Expression = true, @Image = "result", @ParenthesisDepth = 0, @Parenthesized = false, @VariableName = "result"] diff --git a/pmd-java/src/test/resources/net/sourceforge/pmd/lang/java/ast/testdata/ParserCornerCases.java b/pmd-java/src/test/resources/net/sourceforge/pmd/lang/java/ast/testdata/ParserCornerCases.java new file mode 100644 index 0000000000..8249176a00 --- /dev/null +++ b/pmd-java/src/test/resources/net/sourceforge/pmd/lang/java/ast/testdata/ParserCornerCases.java @@ -0,0 +1,224 @@ +/** + * BSD-style license; for more info see http://pmd.sourceforge.net/license.html + */ + +/* + * This file is to test the JavaCC java grammar, whether we can parse specific java constructs without + * throwing a syntax error. + */ + +class Superclass { + + public Superclass() { + } + + public Superclass(Class clazz) { + } + + T doStuff(T s) { + return s; + } +} + +class Outer { + Outer() { + System.out.println("Outer constructor"); + } + + class Inner { + Inner() { + System.out.println("Inner constructor"); + } + } +} +class Child extends Outer.Inner { + Child(Outer o) { + o.super(); + System.out.println("Child constructor"); + } +} + +public class ParserCornerCases extends Superclass { + + public ParserCornerCases() { + super(); + } + + public ParserCornerCases(int a) { + this(a, 2); + } + + public ParserCornerCases(int a, int b) { + super(String.class); + } + + public ParserCornerCases(String title) { + this(); + } + + public strictfp void testGeneric() { + String o = super. doStuff("foo"); + String v = this. thisGeneric("bar"); + } + + X thisGeneric(X x) { + return x; + } + + Class getByteArrayClass() { + return (byte[].class); + } + + public void bitwiseOperator() { + if ((modifiers & InputEvent.SHIFT_DOWN_MASK) != 0 ) { + buf.append("shift "); + } + } +} + +/** + * Test case from http://jira.codehaus.org/browse/MPMD-126 + */ +class PmdTestParent { + public PmdTestParent(Object obj) {} +} + +class PmdTestChild extends PmdTestParent { + + public PmdTestChild() { + // the following line produced a parsing problem + super(new Object() { + + public Object create() { + + Object memoryMonitor = null; + + if (memoryMonitor == null) { + memoryMonitor = new Object(); + } + + return memoryMonitor; + } + }); + } +} + +/* + * Test cases for bug #1020 Parsing Error + */ +class SimpleBean { + String name; +} + +class SimpleBeanUser { + SimpleBeanUser(SimpleBean o) { + + } + + SimpleBeanUser() { + this(new SimpleBean() {{ + name = "test"; + }}); + } +} + +class SimpleBeanUser2 extends SimpleBeanUser { + SimpleBeanUser2() { + super(new SimpleBean(){{ + name = "test2"; + }}); + } +} + +/* + * Test case for bug #1007 Parse Exception with annotation + */ +class TestParseAnnototation { + void parse() { + for (@SuppressWarnings("unchecked") int i = 0; i < 10; i++) { + } + for (@SuppressWarnings("unchecked") Iterator it = Fachabteilung.values().iterator(); it.hasNext();) { + } + List l = new ArrayList(); + for (@SuppressWarnings("unchecked") String s : l) { + } + } +} + +/* + * Test case for bug #956 PMD Parse Exception + */ +class FooBlock {} +class MyFoo { + MyFoo(FooBlock b) { + } +} +class Foo extends MyFoo { + public Foo() { + super(new FooBlock() { + public Object valueOf(Object object) { + String fish = "salmon"; + return fish; + } + }); + } +} + +/* + * Verifies #1122 parse error at class.super + */ +class SuperTest { + /** + * @throws UnsupportedOperationException + */ + public Iterator iterator() { + if (this.mods.contains(Modification.Iterator)) { + return new Iterator() { + Iterator wrapped = ImmutableSet.super.iterator(); + + public boolean hasNext() { + return this.wrapped.hasNext(); + } + + public E next() { + return this.wrapped.next(); + } + + public void remove() { + if (ImmutableSet.this.mods.contains(Modification.RemoveIter)) { + this.wrapped.remove(); + } + throw new UnsupportedOperationException(); + } + }; + } + throw new UnsupportedOperationException(); + } +} + +/* + * Test case for #1310 PMD cannot parse int.class + */ +class ClazzPropertyOfPrimitiveTypes { + public void test() { + Class c = int.class; + c = short.class; + c = long.class; + c = float.class; + c = double.class; + c = char.class; + c = byte.class; + c = void.class; + + if (c == int.class || c == short.class || c == long.class || c == double.class || c == char.class || c == byte.class || c == void.class) { + + } + + if ("a".equals((int.class).getName())) { + + } + + if ((Integer.class.equals(clazz)) || (int.class.equals(clazz))) { + } + } +} diff --git a/pmd-java/src/test/resources/net/sourceforge/pmd/lang/java/ast/testdata/ParserCornerCases.txt b/pmd-java/src/test/resources/net/sourceforge/pmd/lang/java/ast/testdata/ParserCornerCases.txt new file mode 100644 index 0000000000..06d4ae2653 --- /dev/null +++ b/pmd-java/src/test/resources/net/sourceforge/pmd/lang/java/ast/testdata/ParserCornerCases.txt @@ -0,0 +1,606 @@ ++-- CompilationUnit[@PackageName = "", @declarationsAreInDefaultPackage = true] + +-- TypeDeclaration[] + | +-- ClassOrInterfaceDeclaration[@Abstract = false, @BinaryName = "Superclass", @Default = false, @Final = false, @Image = "Superclass", @Interface = false, @Local = false, @Modifiers = 0, @Native = false, @Nested = null, @PackagePrivate = true, @Private = false, @Protected = false, @Public = false, @SimpleName = "Superclass", @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.CONSTRUCTOR] + | | +-- ConstructorDeclaration[@Abstract = false, @Arity = 0, @Default = false, @Final = false, @Image = "Superclass", @Kind = MethodLikeKind.CONSTRUCTOR, @Modifiers = 1, @Name = "Superclass", @Native = false, @PackagePrivate = false, @Private = false, @Protected = false, @Public = true, @Static = false, @Strictfp = false, @Synchronized = false, @Transient = false, @Varargs = false, @Volatile = false, @containsComment = false] + | | +-- FormalParameters[@ParameterCount = 0] + | | +-- Block[@containsComment = false] + | +-- ClassOrInterfaceBodyDeclaration[@AnonymousInnerClass = false, @EnumChild = false, @Kind = DeclarationKind.CONSTRUCTOR] + | | +-- ConstructorDeclaration[@Abstract = false, @Arity = 1, @Default = false, @Final = false, @Image = "Superclass", @Kind = MethodLikeKind.CONSTRUCTOR, @Modifiers = 1, @Name = "Superclass", @Native = false, @PackagePrivate = false, @Private = false, @Protected = false, @Public = true, @Static = false, @Strictfp = false, @Synchronized = false, @Transient = false, @Varargs = false, @Volatile = false, @containsComment = false] + | | +-- TypeParameters[] + | | | +-- TypeParameter[@Image = "V", @ParameterName = "V", @TypeBound = false] + | | +-- FormalParameters[@ParameterCount = 1] + | | | +-- FormalParameter[@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, @Varargs = false, @Volatile = false] + | | | +-- ClassOrInterfaceType[@AnonymousClass = false, @ArrayDepth = 0, @ArrayType = false, @ClassOrInterfaceType = true, @Image = "Class", @PrimitiveType = false, @ReferenceToClassSameCompilationUnit = false, @ReferenceType = true, @SimpleName = "Class", @TypeImage = "Class"] + | | | | +-- TypeArguments[@Diamond = false] + | | | | +-- ClassOrInterfaceType[@AnonymousClass = false, @ArrayDepth = 0, @ArrayType = false, @ClassOrInterfaceType = true, @Image = "V", @PrimitiveType = false, @ReferenceToClassSameCompilationUnit = false, @ReferenceType = true, @SimpleName = "V", @TypeImage = "V"] + | | | +-- VariableDeclaratorId[@Array = false, @ArrayDepth = 0, @ArrayType = false, @EnumConstant = false, @ExceptionBlockParameter = false, @Field = false, @Final = false, @FormalParameter = true, @Image = "clazz", @LambdaParameter = false, @LocalVariable = false, @ResourceDeclaration = false, @TypeInferred = false, @VariableName = "clazz"] + | | +-- Block[@containsComment = false] + | +-- ClassOrInterfaceBodyDeclaration[@AnonymousInnerClass = false, @EnumChild = false, @Kind = DeclarationKind.METHOD] + | +-- MethodDeclaration[@Abstract = false, @Arity = 1, @Default = false, @Final = false, @Image = "doStuff", @InterfaceMember = false, @Kind = MethodLikeKind.METHOD, @MethodName = "doStuff", @Modifiers = 0, @Name = "doStuff", @Native = false, @PackagePrivate = true, @Private = false, @Protected = false, @Public = false, @Static = false, @Strictfp = false, @Synchronized = false, @SyntacticallyAbstract = false, @SyntacticallyPublic = false, @Transient = false, @Varargs = false, @Void = false, @Volatile = false] + | +-- TypeParameters[] + | | +-- TypeParameter[@Image = "T", @ParameterName = "T", @TypeBound = false] + | +-- ResultType[@Void = false, @returnsArray = false] + | | +-- ClassOrInterfaceType[@AnonymousClass = false, @ArrayDepth = 0, @ArrayType = false, @ClassOrInterfaceType = true, @Image = "T", @PrimitiveType = false, @ReferenceToClassSameCompilationUnit = false, @ReferenceType = true, @SimpleName = "T", @TypeImage = "T"] + | +-- FormalParameters[@ParameterCount = 1] + | | +-- FormalParameter[@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, @Varargs = false, @Volatile = false] + | | +-- ClassOrInterfaceType[@AnonymousClass = false, @ArrayDepth = 0, @ArrayType = false, @ClassOrInterfaceType = true, @Image = "T", @PrimitiveType = false, @ReferenceToClassSameCompilationUnit = false, @ReferenceType = true, @SimpleName = "T", @TypeImage = "T"] + | | +-- VariableDeclaratorId[@Array = false, @ArrayDepth = 0, @ArrayType = false, @EnumConstant = false, @ExceptionBlockParameter = false, @Field = false, @Final = false, @FormalParameter = true, @Image = "s", @LambdaParameter = false, @LocalVariable = false, @ResourceDeclaration = false, @TypeInferred = false, @VariableName = "s"] + | +-- Block[@containsComment = false] + | +-- ReturnStatement[] + | +-- VariableAccess[@AccessType = AccessType.READ, @CompileTimeConstant = false, @Expression = true, @Image = "s", @ParenthesisDepth = 0, @Parenthesized = false, @VariableName = "s"] + +-- TypeDeclaration[] + | +-- ClassOrInterfaceDeclaration[@Abstract = false, @BinaryName = "Outer", @Default = false, @Final = false, @Image = "Outer", @Interface = false, @Local = false, @Modifiers = 0, @Native = false, @Nested = null, @PackagePrivate = true, @Private = false, @Protected = false, @Public = false, @SimpleName = "Outer", @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.CONSTRUCTOR] + | | +-- ConstructorDeclaration[@Abstract = false, @Arity = 0, @Default = false, @Final = false, @Image = "Outer", @Kind = MethodLikeKind.CONSTRUCTOR, @Modifiers = 0, @Name = "Outer", @Native = false, @PackagePrivate = true, @Private = false, @Protected = false, @Public = false, @Static = false, @Strictfp = false, @Synchronized = false, @Transient = false, @Varargs = false, @Volatile = false, @containsComment = false] + | | +-- FormalParameters[@ParameterCount = 0] + | | +-- Block[@containsComment = false] + | | +-- ExpressionStatement[] + | | +-- MethodCall[@CompileTimeConstant = false, @Expression = true, @Image = "println", @MethodName = "println", @ParenthesisDepth = 0, @Parenthesized = false] + | | +-- AmbiguousName[@ArrayDepth = 0, @ArrayType = false, @ClassOrInterfaceType = false, @CompileTimeConstant = false, @Expression = true, @Image = "System.out", @Name = "System.out", @ParenthesisDepth = 0, @Parenthesized = false, @PrimitiveType = false, @ReferenceType = true, @Segments = null, @TypeImage = "System.out"] + | | +-- ArgumentList[@ArgumentCount = 1] + | | +-- StringLiteral[@BooleanLiteral = false, @CharLiteral = false, @CompileTimeConstant = true, @ConstValue = "Outer constructor", @DoubleLiteral = false, @Expression = true, @FloatLiteral = false, @Image = ""Outer constructor"", @IntLiteral = false, @LongLiteral = false, @NullLiteral = false, @NumericLiteral = false, @ParenthesisDepth = 0, @Parenthesized = false, @StringLiteral = true, @TextBlock = false] + | +-- ClassOrInterfaceBodyDeclaration[@AnonymousInnerClass = false, @EnumChild = false, @Kind = DeclarationKind.CLASS] + | +-- ClassOrInterfaceDeclaration[@Abstract = false, @BinaryName = "Outer$Inner", @Default = false, @Final = false, @Image = "Inner", @Interface = false, @Local = false, @Modifiers = 0, @Native = false, @Nested = null, @PackagePrivate = true, @Private = false, @Protected = false, @Public = false, @SimpleName = "Inner", @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.CONSTRUCTOR] + | +-- ConstructorDeclaration[@Abstract = false, @Arity = 0, @Default = false, @Final = false, @Image = "Inner", @Kind = MethodLikeKind.CONSTRUCTOR, @Modifiers = 0, @Name = "Inner", @Native = false, @PackagePrivate = true, @Private = false, @Protected = false, @Public = false, @Static = false, @Strictfp = false, @Synchronized = false, @Transient = false, @Varargs = false, @Volatile = false, @containsComment = false] + | +-- FormalParameters[@ParameterCount = 0] + | +-- Block[@containsComment = false] + | +-- ExpressionStatement[] + | +-- MethodCall[@CompileTimeConstant = false, @Expression = true, @Image = "println", @MethodName = "println", @ParenthesisDepth = 0, @Parenthesized = false] + | +-- AmbiguousName[@ArrayDepth = 0, @ArrayType = false, @ClassOrInterfaceType = false, @CompileTimeConstant = false, @Expression = true, @Image = "System.out", @Name = "System.out", @ParenthesisDepth = 0, @Parenthesized = false, @PrimitiveType = false, @ReferenceType = true, @Segments = null, @TypeImage = "System.out"] + | +-- ArgumentList[@ArgumentCount = 1] + | +-- StringLiteral[@BooleanLiteral = false, @CharLiteral = false, @CompileTimeConstant = true, @ConstValue = "Inner constructor", @DoubleLiteral = false, @Expression = true, @FloatLiteral = false, @Image = ""Inner constructor"", @IntLiteral = false, @LongLiteral = false, @NullLiteral = false, @NumericLiteral = false, @ParenthesisDepth = 0, @Parenthesized = false, @StringLiteral = true, @TextBlock = false] + +-- TypeDeclaration[] + | +-- ClassOrInterfaceDeclaration[@Abstract = false, @BinaryName = "Child", @Default = false, @Final = false, @Image = "Child", @Interface = false, @Local = false, @Modifiers = 0, @Native = false, @Nested = null, @PackagePrivate = true, @Private = false, @Protected = false, @Public = false, @SimpleName = "Child", @Static = false, @Strictfp = false, @Synchronized = false, @Transient = false, @TypeKind = TypeKind.CLASS, @Volatile = false] + | +-- ExtendsList[] + | | +-- ClassOrInterfaceType[@AnonymousClass = false, @ArrayDepth = 0, @ArrayType = false, @ClassOrInterfaceType = true, @Image = "Inner", @PrimitiveType = false, @ReferenceToClassSameCompilationUnit = true, @ReferenceType = true, @SimpleName = "Inner", @TypeImage = "Outer.Inner"] + | | +-- AmbiguousName[@ArrayDepth = 0, @ArrayType = false, @ClassOrInterfaceType = false, @CompileTimeConstant = false, @Expression = true, @Image = "Outer", @Name = "Outer", @ParenthesisDepth = 0, @Parenthesized = false, @PrimitiveType = false, @ReferenceType = true, @Segments = null, @TypeImage = "Outer"] + | +-- ClassOrInterfaceBody[@AnonymousInnerClass = false, @EnumChild = false] + | +-- ClassOrInterfaceBodyDeclaration[@AnonymousInnerClass = false, @EnumChild = false, @Kind = DeclarationKind.CONSTRUCTOR] + | +-- ConstructorDeclaration[@Abstract = false, @Arity = 1, @Default = false, @Final = false, @Image = "Child", @Kind = MethodLikeKind.CONSTRUCTOR, @Modifiers = 0, @Name = "Child", @Native = false, @PackagePrivate = true, @Private = false, @Protected = false, @Public = false, @Static = false, @Strictfp = false, @Synchronized = false, @Transient = false, @Varargs = false, @Volatile = false, @containsComment = false] + | +-- FormalParameters[@ParameterCount = 1] + | | +-- FormalParameter[@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, @Varargs = false, @Volatile = false] + | | +-- ClassOrInterfaceType[@AnonymousClass = false, @ArrayDepth = 0, @ArrayType = false, @ClassOrInterfaceType = true, @Image = "Outer", @PrimitiveType = false, @ReferenceToClassSameCompilationUnit = true, @ReferenceType = true, @SimpleName = "Outer", @TypeImage = "Outer"] + | | +-- VariableDeclaratorId[@Array = false, @ArrayDepth = 0, @ArrayType = false, @EnumConstant = false, @ExceptionBlockParameter = false, @Field = false, @Final = false, @FormalParameter = true, @Image = "o", @LambdaParameter = false, @LocalVariable = false, @ResourceDeclaration = false, @TypeInferred = false, @VariableName = "o"] + | +-- Block[@containsComment = false] + | +-- ExplicitConstructorInvocation[@ArgumentCount = 0, @Qualified = true, @Super = true, @This = false] + | | +-- VariableAccess[@AccessType = AccessType.READ, @CompileTimeConstant = false, @Expression = true, @Image = "o", @ParenthesisDepth = 0, @Parenthesized = false, @VariableName = "o"] + | | +-- ArgumentList[@ArgumentCount = 0] + | +-- ExpressionStatement[] + | +-- MethodCall[@CompileTimeConstant = false, @Expression = true, @Image = "println", @MethodName = "println", @ParenthesisDepth = 0, @Parenthesized = false] + | +-- AmbiguousName[@ArrayDepth = 0, @ArrayType = false, @ClassOrInterfaceType = false, @CompileTimeConstant = false, @Expression = true, @Image = "System.out", @Name = "System.out", @ParenthesisDepth = 0, @Parenthesized = false, @PrimitiveType = false, @ReferenceType = true, @Segments = null, @TypeImage = "System.out"] + | +-- ArgumentList[@ArgumentCount = 1] + | +-- StringLiteral[@BooleanLiteral = false, @CharLiteral = false, @CompileTimeConstant = true, @ConstValue = "Child constructor", @DoubleLiteral = false, @Expression = true, @FloatLiteral = false, @Image = ""Child constructor"", @IntLiteral = false, @LongLiteral = false, @NullLiteral = false, @NumericLiteral = false, @ParenthesisDepth = 0, @Parenthesized = false, @StringLiteral = true, @TextBlock = false] + +-- TypeDeclaration[] + | +-- ClassOrInterfaceDeclaration[@Abstract = false, @BinaryName = "ParserCornerCases", @Default = false, @Final = false, @Image = "ParserCornerCases", @Interface = false, @Local = false, @Modifiers = 1, @Native = false, @Nested = null, @PackagePrivate = false, @Private = false, @Protected = false, @Public = true, @SimpleName = "ParserCornerCases", @Static = false, @Strictfp = false, @Synchronized = false, @Transient = false, @TypeKind = TypeKind.CLASS, @Volatile = false] + | +-- ExtendsList[] + | | +-- ClassOrInterfaceType[@AnonymousClass = false, @ArrayDepth = 0, @ArrayType = false, @ClassOrInterfaceType = true, @Image = "Superclass", @PrimitiveType = false, @ReferenceToClassSameCompilationUnit = true, @ReferenceType = true, @SimpleName = "Superclass", @TypeImage = "Superclass"] + | +-- ClassOrInterfaceBody[@AnonymousInnerClass = false, @EnumChild = false] + | +-- ClassOrInterfaceBodyDeclaration[@AnonymousInnerClass = false, @EnumChild = false, @Kind = DeclarationKind.CONSTRUCTOR] + | | +-- ConstructorDeclaration[@Abstract = false, @Arity = 0, @Default = false, @Final = false, @Image = "ParserCornerCases", @Kind = MethodLikeKind.CONSTRUCTOR, @Modifiers = 1, @Name = "ParserCornerCases", @Native = false, @PackagePrivate = false, @Private = false, @Protected = false, @Public = true, @Static = false, @Strictfp = false, @Synchronized = false, @Transient = false, @Varargs = false, @Volatile = false, @containsComment = false] + | | +-- FormalParameters[@ParameterCount = 0] + | | +-- Block[@containsComment = false] + | | +-- ExplicitConstructorInvocation[@ArgumentCount = 0, @Qualified = false, @Super = true, @This = false] + | | +-- ArgumentList[@ArgumentCount = 0] + | +-- ClassOrInterfaceBodyDeclaration[@AnonymousInnerClass = false, @EnumChild = false, @Kind = DeclarationKind.CONSTRUCTOR] + | | +-- ConstructorDeclaration[@Abstract = false, @Arity = 1, @Default = false, @Final = false, @Image = "ParserCornerCases", @Kind = MethodLikeKind.CONSTRUCTOR, @Modifiers = 1, @Name = "ParserCornerCases", @Native = false, @PackagePrivate = false, @Private = false, @Protected = false, @Public = true, @Static = false, @Strictfp = false, @Synchronized = false, @Transient = false, @Varargs = false, @Volatile = false, @containsComment = false] + | | +-- FormalParameters[@ParameterCount = 1] + | | | +-- FormalParameter[@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, @Varargs = false, @Volatile = false] + | | | +-- PrimitiveType[@ArrayDepth = 0, @ArrayType = false, @Boolean = false, @ClassOrInterfaceType = false, @Image = "int", @ModelConstant = PrimitiveType.INT, @PrimitiveType = true, @ReferenceType = false, @TypeImage = "int"] + | | | +-- VariableDeclaratorId[@Array = false, @ArrayDepth = 0, @ArrayType = false, @EnumConstant = false, @ExceptionBlockParameter = false, @Field = false, @Final = false, @FormalParameter = true, @Image = "a", @LambdaParameter = false, @LocalVariable = false, @ResourceDeclaration = false, @TypeInferred = false, @VariableName = "a"] + | | +-- Block[@containsComment = false] + | | +-- ExplicitConstructorInvocation[@ArgumentCount = 2, @Qualified = false, @Super = false, @This = true] + | | +-- TypeArguments[@Diamond = false] + | | | +-- ClassOrInterfaceType[@AnonymousClass = false, @ArrayDepth = 0, @ArrayType = false, @ClassOrInterfaceType = true, @Image = "Integer", @PrimitiveType = false, @ReferenceToClassSameCompilationUnit = false, @ReferenceType = true, @SimpleName = "Integer", @TypeImage = "Integer"] + | | +-- ArgumentList[@ArgumentCount = 2] + | | +-- VariableAccess[@AccessType = AccessType.READ, @CompileTimeConstant = false, @Expression = true, @Image = "a", @ParenthesisDepth = 0, @Parenthesized = false, @VariableName = "a"] + | | +-- NumericLiteral[@Base = 10, @BooleanLiteral = false, @CharLiteral = false, @CompileTimeConstant = false, @DoubleLiteral = false, @Expression = true, @FloatLiteral = false, @Image = "2", @IntLiteral = true, @Integral = true, @LongLiteral = false, @NullLiteral = false, @NumericLiteral = true, @ParenthesisDepth = 0, @Parenthesized = false, @PrimitiveType = PrimitiveType.INT, @StringLiteral = false, @ValueAsDouble = 2.0, @ValueAsFloat = 2.0, @ValueAsInt = 2, @ValueAsLong = 2] + | +-- ClassOrInterfaceBodyDeclaration[@AnonymousInnerClass = false, @EnumChild = false, @Kind = DeclarationKind.CONSTRUCTOR] + | | +-- ConstructorDeclaration[@Abstract = false, @Arity = 2, @Default = false, @Final = false, @Image = "ParserCornerCases", @Kind = MethodLikeKind.CONSTRUCTOR, @Modifiers = 1, @Name = "ParserCornerCases", @Native = false, @PackagePrivate = false, @Private = false, @Protected = false, @Public = true, @Static = false, @Strictfp = false, @Synchronized = false, @Transient = false, @Varargs = false, @Volatile = false, @containsComment = false] + | | +-- TypeParameters[] + | | | +-- TypeParameter[@Image = "W", @ParameterName = "W", @TypeBound = false] + | | +-- FormalParameters[@ParameterCount = 2] + | | | +-- FormalParameter[@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, @Varargs = false, @Volatile = false] + | | | | +-- PrimitiveType[@ArrayDepth = 0, @ArrayType = false, @Boolean = false, @ClassOrInterfaceType = false, @Image = "int", @ModelConstant = PrimitiveType.INT, @PrimitiveType = true, @ReferenceType = false, @TypeImage = "int"] + | | | | +-- VariableDeclaratorId[@Array = false, @ArrayDepth = 0, @ArrayType = false, @EnumConstant = false, @ExceptionBlockParameter = false, @Field = false, @Final = false, @FormalParameter = true, @Image = "a", @LambdaParameter = false, @LocalVariable = false, @ResourceDeclaration = false, @TypeInferred = false, @VariableName = "a"] + | | | +-- FormalParameter[@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, @Varargs = false, @Volatile = false] + | | | +-- PrimitiveType[@ArrayDepth = 0, @ArrayType = false, @Boolean = false, @ClassOrInterfaceType = false, @Image = "int", @ModelConstant = PrimitiveType.INT, @PrimitiveType = true, @ReferenceType = false, @TypeImage = "int"] + | | | +-- VariableDeclaratorId[@Array = false, @ArrayDepth = 0, @ArrayType = false, @EnumConstant = false, @ExceptionBlockParameter = false, @Field = false, @Final = false, @FormalParameter = true, @Image = "b", @LambdaParameter = false, @LocalVariable = false, @ResourceDeclaration = false, @TypeInferred = false, @VariableName = "b"] + | | +-- Block[@containsComment = false] + | | +-- ExplicitConstructorInvocation[@ArgumentCount = 1, @Qualified = false, @Super = true, @This = false] + | | +-- TypeArguments[@Diamond = false] + | | | +-- ClassOrInterfaceType[@AnonymousClass = false, @ArrayDepth = 0, @ArrayType = false, @ClassOrInterfaceType = true, @Image = "String", @PrimitiveType = false, @ReferenceToClassSameCompilationUnit = false, @ReferenceType = true, @SimpleName = "String", @TypeImage = "String"] + | | +-- ArgumentList[@ArgumentCount = 1] + | | +-- ClassLiteral[@CompileTimeConstant = false, @Expression = true, @ParenthesisDepth = 0, @Parenthesized = false, @Void = false] + | | +-- ClassOrInterfaceType[@AnonymousClass = false, @ArrayDepth = 0, @ArrayType = false, @ClassOrInterfaceType = true, @Image = "String", @PrimitiveType = false, @ReferenceToClassSameCompilationUnit = false, @ReferenceType = true, @SimpleName = "String", @TypeImage = "String"] + | +-- ClassOrInterfaceBodyDeclaration[@AnonymousInnerClass = false, @EnumChild = false, @Kind = DeclarationKind.CONSTRUCTOR] + | | +-- ConstructorDeclaration[@Abstract = false, @Arity = 1, @Default = false, @Final = false, @Image = "ParserCornerCases", @Kind = MethodLikeKind.CONSTRUCTOR, @Modifiers = 1, @Name = "ParserCornerCases", @Native = false, @PackagePrivate = false, @Private = false, @Protected = false, @Public = true, @Static = false, @Strictfp = false, @Synchronized = false, @Transient = false, @Varargs = false, @Volatile = false, @containsComment = false] + | | +-- FormalParameters[@ParameterCount = 1] + | | | +-- FormalParameter[@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, @Varargs = false, @Volatile = false] + | | | +-- ClassOrInterfaceType[@AnonymousClass = false, @ArrayDepth = 0, @ArrayType = false, @ClassOrInterfaceType = true, @Image = "String", @PrimitiveType = false, @ReferenceToClassSameCompilationUnit = false, @ReferenceType = true, @SimpleName = "String", @TypeImage = "String"] + | | | +-- VariableDeclaratorId[@Array = false, @ArrayDepth = 0, @ArrayType = false, @EnumConstant = false, @ExceptionBlockParameter = false, @Field = false, @Final = false, @FormalParameter = true, @Image = "title", @LambdaParameter = false, @LocalVariable = false, @ResourceDeclaration = false, @TypeInferred = false, @VariableName = "title"] + | | +-- Block[@containsComment = false] + | | +-- ExplicitConstructorInvocation[@ArgumentCount = 0, @Qualified = false, @Super = false, @This = true] + | | +-- ArgumentList[@ArgumentCount = 0] + | +-- ClassOrInterfaceBodyDeclaration[@AnonymousInnerClass = false, @EnumChild = false, @Kind = DeclarationKind.METHOD] + | | +-- MethodDeclaration[@Abstract = false, @Arity = 0, @Default = false, @Final = false, @Image = "testGeneric", @InterfaceMember = false, @Kind = MethodLikeKind.METHOD, @MethodName = "testGeneric", @Modifiers = 4097, @Name = "testGeneric", @Native = false, @PackagePrivate = false, @Private = false, @Protected = false, @Public = true, @Static = false, @Strictfp = true, @Synchronized = false, @SyntacticallyAbstract = false, @SyntacticallyPublic = true, @Transient = false, @Varargs = false, @Void = true, @Volatile = false] + | | +-- ResultType[@Void = true, @returnsArray = false] + | | +-- FormalParameters[@ParameterCount = 0] + | | +-- Block[@containsComment = 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] + | | | +-- ClassOrInterfaceType[@AnonymousClass = false, @ArrayDepth = 0, @ArrayType = false, @ClassOrInterfaceType = true, @Image = "String", @PrimitiveType = false, @ReferenceToClassSameCompilationUnit = false, @ReferenceType = true, @SimpleName = "String", @TypeImage = "String"] + | | | +-- VariableDeclarator[@Initializer = true, @Name = "o"] + | | | +-- VariableDeclaratorId[@Array = false, @ArrayDepth = 0, @ArrayType = false, @EnumConstant = false, @ExceptionBlockParameter = false, @Field = false, @Final = false, @FormalParameter = false, @Image = "o", @LambdaParameter = false, @LocalVariable = true, @ResourceDeclaration = false, @TypeInferred = false, @VariableName = "o"] + | | | +-- MethodCall[@CompileTimeConstant = false, @Expression = true, @Image = "doStuff", @MethodName = "doStuff", @ParenthesisDepth = 0, @Parenthesized = false] + | | | +-- SuperExpression[@CompileTimeConstant = false, @Expression = true, @ParenthesisDepth = 0, @Parenthesized = false] + | | | +-- TypeArguments[@Diamond = false] + | | | | +-- ClassOrInterfaceType[@AnonymousClass = false, @ArrayDepth = 0, @ArrayType = false, @ClassOrInterfaceType = true, @Image = "String", @PrimitiveType = false, @ReferenceToClassSameCompilationUnit = false, @ReferenceType = true, @SimpleName = "String", @TypeImage = "String"] + | | | +-- ArgumentList[@ArgumentCount = 1] + | | | +-- StringLiteral[@BooleanLiteral = false, @CharLiteral = false, @CompileTimeConstant = true, @ConstValue = "foo", @DoubleLiteral = false, @Expression = true, @FloatLiteral = false, @Image = ""foo"", @IntLiteral = false, @LongLiteral = false, @NullLiteral = false, @NumericLiteral = false, @ParenthesisDepth = 0, @Parenthesized = false, @StringLiteral = true, @TextBlock = 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 = "v", @Volatile = false] + | | +-- ClassOrInterfaceType[@AnonymousClass = false, @ArrayDepth = 0, @ArrayType = false, @ClassOrInterfaceType = true, @Image = "String", @PrimitiveType = false, @ReferenceToClassSameCompilationUnit = false, @ReferenceType = true, @SimpleName = "String", @TypeImage = "String"] + | | +-- VariableDeclarator[@Initializer = true, @Name = "v"] + | | +-- VariableDeclaratorId[@Array = false, @ArrayDepth = 0, @ArrayType = false, @EnumConstant = false, @ExceptionBlockParameter = false, @Field = false, @Final = false, @FormalParameter = false, @Image = "v", @LambdaParameter = false, @LocalVariable = true, @ResourceDeclaration = false, @TypeInferred = false, @VariableName = "v"] + | | +-- MethodCall[@CompileTimeConstant = false, @Expression = true, @Image = "thisGeneric", @MethodName = "thisGeneric", @ParenthesisDepth = 0, @Parenthesized = false] + | | +-- ThisExpression[@CompileTimeConstant = false, @Expression = true, @ParenthesisDepth = 0, @Parenthesized = false] + | | +-- TypeArguments[@Diamond = false] + | | | +-- ClassOrInterfaceType[@AnonymousClass = false, @ArrayDepth = 0, @ArrayType = false, @ClassOrInterfaceType = true, @Image = "String", @PrimitiveType = false, @ReferenceToClassSameCompilationUnit = false, @ReferenceType = true, @SimpleName = "String", @TypeImage = "String"] + | | +-- ArgumentList[@ArgumentCount = 1] + | | +-- StringLiteral[@BooleanLiteral = false, @CharLiteral = false, @CompileTimeConstant = true, @ConstValue = "bar", @DoubleLiteral = false, @Expression = true, @FloatLiteral = false, @Image = ""bar"", @IntLiteral = false, @LongLiteral = false, @NullLiteral = false, @NumericLiteral = false, @ParenthesisDepth = 0, @Parenthesized = false, @StringLiteral = true, @TextBlock = false] + | +-- ClassOrInterfaceBodyDeclaration[@AnonymousInnerClass = false, @EnumChild = false, @Kind = DeclarationKind.METHOD] + | | +-- MethodDeclaration[@Abstract = false, @Arity = 1, @Default = false, @Final = false, @Image = "thisGeneric", @InterfaceMember = false, @Kind = MethodLikeKind.METHOD, @MethodName = "thisGeneric", @Modifiers = 0, @Name = "thisGeneric", @Native = false, @PackagePrivate = true, @Private = false, @Protected = false, @Public = false, @Static = false, @Strictfp = false, @Synchronized = false, @SyntacticallyAbstract = false, @SyntacticallyPublic = false, @Transient = false, @Varargs = false, @Void = false, @Volatile = false] + | | +-- TypeParameters[] + | | | +-- TypeParameter[@Image = "X", @ParameterName = "X", @TypeBound = false] + | | +-- ResultType[@Void = false, @returnsArray = false] + | | | +-- ClassOrInterfaceType[@AnonymousClass = false, @ArrayDepth = 0, @ArrayType = false, @ClassOrInterfaceType = true, @Image = "X", @PrimitiveType = false, @ReferenceToClassSameCompilationUnit = false, @ReferenceType = true, @SimpleName = "X", @TypeImage = "X"] + | | +-- FormalParameters[@ParameterCount = 1] + | | | +-- FormalParameter[@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, @Varargs = false, @Volatile = false] + | | | +-- ClassOrInterfaceType[@AnonymousClass = false, @ArrayDepth = 0, @ArrayType = false, @ClassOrInterfaceType = true, @Image = "X", @PrimitiveType = false, @ReferenceToClassSameCompilationUnit = false, @ReferenceType = true, @SimpleName = "X", @TypeImage = "X"] + | | | +-- VariableDeclaratorId[@Array = false, @ArrayDepth = 0, @ArrayType = false, @EnumConstant = false, @ExceptionBlockParameter = false, @Field = false, @Final = false, @FormalParameter = true, @Image = "x", @LambdaParameter = false, @LocalVariable = false, @ResourceDeclaration = false, @TypeInferred = false, @VariableName = "x"] + | | +-- Block[@containsComment = false] + | | +-- ReturnStatement[] + | | +-- VariableAccess[@AccessType = AccessType.READ, @CompileTimeConstant = false, @Expression = true, @Image = "x", @ParenthesisDepth = 0, @Parenthesized = false, @VariableName = "x"] + | +-- ClassOrInterfaceBodyDeclaration[@AnonymousInnerClass = false, @EnumChild = false, @Kind = DeclarationKind.METHOD] + | | +-- MethodDeclaration[@Abstract = false, @Arity = 0, @Default = false, @Final = false, @Image = "getByteArrayClass", @InterfaceMember = false, @Kind = MethodLikeKind.METHOD, @MethodName = "getByteArrayClass", @Modifiers = 0, @Name = "getByteArrayClass", @Native = false, @PackagePrivate = true, @Private = false, @Protected = false, @Public = false, @Static = false, @Strictfp = false, @Synchronized = false, @SyntacticallyAbstract = false, @SyntacticallyPublic = false, @Transient = false, @Varargs = false, @Void = false, @Volatile = false] + | | +-- ResultType[@Void = false, @returnsArray = false] + | | | +-- ClassOrInterfaceType[@AnonymousClass = false, @ArrayDepth = 0, @ArrayType = false, @ClassOrInterfaceType = true, @Image = "Class", @PrimitiveType = false, @ReferenceToClassSameCompilationUnit = false, @ReferenceType = true, @SimpleName = "Class", @TypeImage = "Class"] + | | +-- FormalParameters[@ParameterCount = 0] + | | +-- Block[@containsComment = false] + | | +-- ReturnStatement[] + | | +-- ClassLiteral[@CompileTimeConstant = false, @Expression = true, @ParenthesisDepth = 1, @Parenthesized = true, @Void = false] + | | +-- ArrayType[@ArrayDepth = 1, @ArrayType = true, @ClassOrInterfaceType = false, @PrimitiveType = false, @ReferenceType = true, @TypeImage = "byte"] + | | +-- PrimitiveType[@ArrayDepth = 0, @ArrayType = false, @Boolean = false, @ClassOrInterfaceType = false, @Image = "byte", @ModelConstant = PrimitiveType.BYTE, @PrimitiveType = true, @ReferenceType = false, @TypeImage = "byte"] + | | +-- ArrayDimensions[@Size = 1] + | | +-- ArrayTypeDim[] + | +-- ClassOrInterfaceBodyDeclaration[@AnonymousInnerClass = false, @EnumChild = false, @Kind = DeclarationKind.METHOD] + | +-- MethodDeclaration[@Abstract = false, @Arity = 0, @Default = false, @Final = false, @Image = "bitwiseOperator", @InterfaceMember = false, @Kind = MethodLikeKind.METHOD, @MethodName = "bitwiseOperator", @Modifiers = 1, @Name = "bitwiseOperator", @Native = false, @PackagePrivate = false, @Private = false, @Protected = false, @Public = true, @Static = false, @Strictfp = false, @Synchronized = false, @SyntacticallyAbstract = false, @SyntacticallyPublic = true, @Transient = false, @Varargs = false, @Void = true, @Volatile = false] + | +-- ResultType[@Void = true, @returnsArray = false] + | +-- FormalParameters[@ParameterCount = 0] + | +-- Block[@containsComment = false] + | +-- IfStatement[@Else = false] + | +-- InfixExpression[@CompileTimeConstant = false, @Expression = true, @Operator = BinaryOp.NE, @ParenthesisDepth = 0, @Parenthesized = false] + | | +-- InfixExpression[@CompileTimeConstant = false, @Expression = true, @Operator = BinaryOp.AND, @ParenthesisDepth = 1, @Parenthesized = true] + | | | +-- VariableAccess[@AccessType = AccessType.READ, @CompileTimeConstant = false, @Expression = true, @Image = "modifiers", @ParenthesisDepth = 0, @Parenthesized = false, @VariableName = "modifiers"] + | | | +-- FieldAccess[@AccessType = AccessType.READ, @CompileTimeConstant = false, @Expression = true, @FieldName = "SHIFT_DOWN_MASK", @Image = "SHIFT_DOWN_MASK", @ParenthesisDepth = 0, @Parenthesized = false] + | | | +-- AmbiguousName[@ArrayDepth = 0, @ArrayType = false, @ClassOrInterfaceType = false, @CompileTimeConstant = false, @Expression = true, @Image = "InputEvent", @Name = "InputEvent", @ParenthesisDepth = 0, @Parenthesized = false, @PrimitiveType = false, @ReferenceType = true, @Segments = null, @TypeImage = "InputEvent"] + | | +-- NumericLiteral[@Base = 10, @BooleanLiteral = false, @CharLiteral = false, @CompileTimeConstant = false, @DoubleLiteral = false, @Expression = true, @FloatLiteral = false, @Image = "0", @IntLiteral = true, @Integral = true, @LongLiteral = false, @NullLiteral = false, @NumericLiteral = true, @ParenthesisDepth = 0, @Parenthesized = false, @PrimitiveType = PrimitiveType.INT, @StringLiteral = false, @ValueAsDouble = 0.0, @ValueAsFloat = 0.0, @ValueAsInt = 0, @ValueAsLong = 0] + | +-- Block[@containsComment = false] + | +-- ExpressionStatement[] + | +-- MethodCall[@CompileTimeConstant = false, @Expression = true, @Image = "append", @MethodName = "append", @ParenthesisDepth = 0, @Parenthesized = false] + | +-- AmbiguousName[@ArrayDepth = 0, @ArrayType = false, @ClassOrInterfaceType = false, @CompileTimeConstant = false, @Expression = true, @Image = "buf", @Name = "buf", @ParenthesisDepth = 0, @Parenthesized = false, @PrimitiveType = false, @ReferenceType = true, @Segments = null, @TypeImage = "buf"] + | +-- ArgumentList[@ArgumentCount = 1] + | +-- StringLiteral[@BooleanLiteral = false, @CharLiteral = false, @CompileTimeConstant = true, @ConstValue = "shift ", @DoubleLiteral = false, @Expression = true, @FloatLiteral = false, @Image = ""shift "", @IntLiteral = false, @LongLiteral = false, @NullLiteral = false, @NumericLiteral = false, @ParenthesisDepth = 0, @Parenthesized = false, @StringLiteral = true, @TextBlock = false] + +-- TypeDeclaration[] + | +-- ClassOrInterfaceDeclaration[@Abstract = false, @BinaryName = "PmdTestParent", @Default = false, @Final = false, @Image = "PmdTestParent", @Interface = false, @Local = false, @Modifiers = 0, @Native = false, @Nested = null, @PackagePrivate = true, @Private = false, @Protected = false, @Public = false, @SimpleName = "PmdTestParent", @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.CONSTRUCTOR] + | +-- ConstructorDeclaration[@Abstract = false, @Arity = 1, @Default = false, @Final = false, @Image = "PmdTestParent", @Kind = MethodLikeKind.CONSTRUCTOR, @Modifiers = 1, @Name = "PmdTestParent", @Native = false, @PackagePrivate = false, @Private = false, @Protected = false, @Public = true, @Static = false, @Strictfp = false, @Synchronized = false, @Transient = false, @Varargs = false, @Volatile = false, @containsComment = false] + | +-- FormalParameters[@ParameterCount = 1] + | | +-- FormalParameter[@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, @Varargs = false, @Volatile = false] + | | +-- ClassOrInterfaceType[@AnonymousClass = false, @ArrayDepth = 0, @ArrayType = false, @ClassOrInterfaceType = true, @Image = "Object", @PrimitiveType = false, @ReferenceToClassSameCompilationUnit = false, @ReferenceType = true, @SimpleName = "Object", @TypeImage = "Object"] + | | +-- VariableDeclaratorId[@Array = false, @ArrayDepth = 0, @ArrayType = false, @EnumConstant = false, @ExceptionBlockParameter = false, @Field = false, @Final = false, @FormalParameter = true, @Image = "obj", @LambdaParameter = false, @LocalVariable = false, @ResourceDeclaration = false, @TypeInferred = false, @VariableName = "obj"] + | +-- Block[@containsComment = false] + +-- TypeDeclaration[] + | +-- ClassOrInterfaceDeclaration[@Abstract = false, @BinaryName = "PmdTestChild", @Default = false, @Final = false, @Image = "PmdTestChild", @Interface = false, @Local = false, @Modifiers = 0, @Native = false, @Nested = null, @PackagePrivate = true, @Private = false, @Protected = false, @Public = false, @SimpleName = "PmdTestChild", @Static = false, @Strictfp = false, @Synchronized = false, @Transient = false, @TypeKind = TypeKind.CLASS, @Volatile = false] + | +-- ExtendsList[] + | | +-- ClassOrInterfaceType[@AnonymousClass = false, @ArrayDepth = 0, @ArrayType = false, @ClassOrInterfaceType = true, @Image = "PmdTestParent", @PrimitiveType = false, @ReferenceToClassSameCompilationUnit = true, @ReferenceType = true, @SimpleName = "PmdTestParent", @TypeImage = "PmdTestParent"] + | +-- ClassOrInterfaceBody[@AnonymousInnerClass = false, @EnumChild = false] + | +-- ClassOrInterfaceBodyDeclaration[@AnonymousInnerClass = false, @EnumChild = false, @Kind = DeclarationKind.CONSTRUCTOR] + | +-- ConstructorDeclaration[@Abstract = false, @Arity = 0, @Default = false, @Final = false, @Image = "PmdTestChild", @Kind = MethodLikeKind.CONSTRUCTOR, @Modifiers = 1, @Name = "PmdTestChild", @Native = false, @PackagePrivate = false, @Private = false, @Protected = false, @Public = true, @Static = false, @Strictfp = false, @Synchronized = false, @Transient = false, @Varargs = false, @Volatile = false, @containsComment = false] + | +-- FormalParameters[@ParameterCount = 0] + | +-- Block[@containsComment = false] + | +-- ExplicitConstructorInvocation[@ArgumentCount = 1, @Qualified = false, @Super = true, @This = false] + | +-- ArgumentList[@ArgumentCount = 1] + | +-- ConstructorCall[@AnonymousClass = true, @CompileTimeConstant = false, @DiamondTypeArgs = false, @Expression = true, @ParenthesisDepth = 0, @Parenthesized = false, @QualifiedInstanceCreation = false] + | +-- ClassOrInterfaceType[@AnonymousClass = false, @ArrayDepth = 0, @ArrayType = false, @ClassOrInterfaceType = true, @Image = "Object", @PrimitiveType = false, @ReferenceToClassSameCompilationUnit = false, @ReferenceType = true, @SimpleName = "Object", @TypeImage = "Object"] + | +-- ArgumentList[@ArgumentCount = 0] + | +-- AnonymousClassDeclaration[] + | +-- ClassOrInterfaceBody[@AnonymousInnerClass = false, @EnumChild = false] + | +-- ClassOrInterfaceBodyDeclaration[@AnonymousInnerClass = false, @EnumChild = false, @Kind = DeclarationKind.METHOD] + | +-- MethodDeclaration[@Abstract = false, @Arity = 0, @Default = false, @Final = false, @Image = "create", @InterfaceMember = false, @Kind = MethodLikeKind.METHOD, @MethodName = "create", @Modifiers = 1, @Name = "create", @Native = false, @PackagePrivate = false, @Private = false, @Protected = false, @Public = true, @Static = false, @Strictfp = false, @Synchronized = false, @SyntacticallyAbstract = false, @SyntacticallyPublic = true, @Transient = false, @Varargs = false, @Void = false, @Volatile = false] + | +-- ResultType[@Void = false, @returnsArray = false] + | | +-- ClassOrInterfaceType[@AnonymousClass = false, @ArrayDepth = 0, @ArrayType = false, @ClassOrInterfaceType = true, @Image = "Object", @PrimitiveType = false, @ReferenceToClassSameCompilationUnit = false, @ReferenceType = true, @SimpleName = "Object", @TypeImage = "Object"] + | +-- FormalParameters[@ParameterCount = 0] + | +-- Block[@containsComment = 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 = "memoryMonitor", @Volatile = false] + | | +-- ClassOrInterfaceType[@AnonymousClass = false, @ArrayDepth = 0, @ArrayType = false, @ClassOrInterfaceType = true, @Image = "Object", @PrimitiveType = false, @ReferenceToClassSameCompilationUnit = false, @ReferenceType = true, @SimpleName = "Object", @TypeImage = "Object"] + | | +-- VariableDeclarator[@Initializer = true, @Name = "memoryMonitor"] + | | +-- VariableDeclaratorId[@Array = false, @ArrayDepth = 0, @ArrayType = false, @EnumConstant = false, @ExceptionBlockParameter = false, @Field = false, @Final = false, @FormalParameter = false, @Image = "memoryMonitor", @LambdaParameter = false, @LocalVariable = true, @ResourceDeclaration = false, @TypeInferred = false, @VariableName = "memoryMonitor"] + | | +-- NullLiteral[@BooleanLiteral = false, @CharLiteral = false, @CompileTimeConstant = false, @DoubleLiteral = false, @Expression = true, @FloatLiteral = false, @IntLiteral = false, @LongLiteral = false, @NullLiteral = true, @NumericLiteral = false, @ParenthesisDepth = 0, @Parenthesized = false, @StringLiteral = false] + | +-- IfStatement[@Else = false] + | | +-- InfixExpression[@CompileTimeConstant = false, @Expression = true, @Operator = BinaryOp.EQ, @ParenthesisDepth = 0, @Parenthesized = false] + | | | +-- VariableAccess[@AccessType = AccessType.READ, @CompileTimeConstant = false, @Expression = true, @Image = "memoryMonitor", @ParenthesisDepth = 0, @Parenthesized = false, @VariableName = "memoryMonitor"] + | | | +-- NullLiteral[@BooleanLiteral = false, @CharLiteral = false, @CompileTimeConstant = false, @DoubleLiteral = false, @Expression = true, @FloatLiteral = false, @IntLiteral = false, @LongLiteral = false, @NullLiteral = true, @NumericLiteral = false, @ParenthesisDepth = 0, @Parenthesized = false, @StringLiteral = false] + | | +-- Block[@containsComment = false] + | | +-- ExpressionStatement[] + | | +-- AssignmentExpression[@CompileTimeConstant = false, @Compound = false, @Expression = true, @Operator = AssignmentOp.ASSIGN, @ParenthesisDepth = 0, @Parenthesized = false] + | | +-- VariableAccess[@AccessType = AccessType.WRITE, @CompileTimeConstant = false, @Expression = true, @Image = "memoryMonitor", @ParenthesisDepth = 0, @Parenthesized = false, @VariableName = "memoryMonitor"] + | | +-- ConstructorCall[@AnonymousClass = false, @CompileTimeConstant = false, @DiamondTypeArgs = false, @Expression = true, @ParenthesisDepth = 0, @Parenthesized = false, @QualifiedInstanceCreation = false] + | | +-- ClassOrInterfaceType[@AnonymousClass = false, @ArrayDepth = 0, @ArrayType = false, @ClassOrInterfaceType = true, @Image = "Object", @PrimitiveType = false, @ReferenceToClassSameCompilationUnit = false, @ReferenceType = true, @SimpleName = "Object", @TypeImage = "Object"] + | | +-- ArgumentList[@ArgumentCount = 0] + | +-- ReturnStatement[] + | +-- VariableAccess[@AccessType = AccessType.READ, @CompileTimeConstant = false, @Expression = true, @Image = "memoryMonitor", @ParenthesisDepth = 0, @Parenthesized = false, @VariableName = "memoryMonitor"] + +-- TypeDeclaration[] + | +-- ClassOrInterfaceDeclaration[@Abstract = false, @BinaryName = "SimpleBean", @Default = false, @Final = false, @Image = "SimpleBean", @Interface = false, @Local = false, @Modifiers = 0, @Native = false, @Nested = null, @PackagePrivate = true, @Private = false, @Protected = false, @Public = false, @SimpleName = "SimpleBean", @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.FIELD] + | +-- FieldDeclaration[@Abstract = false, @AnnotationMember = false, @Array = false, @ArrayDepth = 0, @Default = false, @Final = false, @InterfaceMember = false, @Modifiers = 0, @Native = false, @PackagePrivate = true, @Private = false, @Protected = false, @Public = false, @Static = false, @Strictfp = false, @Synchronized = false, @SyntacticallyFinal = false, @SyntacticallyPublic = false, @SyntacticallyStatic = false, @Transient = false, @VariableName = "name", @Volatile = false] + | +-- ClassOrInterfaceType[@AnonymousClass = false, @ArrayDepth = 0, @ArrayType = false, @ClassOrInterfaceType = true, @Image = "String", @PrimitiveType = false, @ReferenceToClassSameCompilationUnit = false, @ReferenceType = true, @SimpleName = "String", @TypeImage = "String"] + | +-- VariableDeclarator[@Initializer = false, @Name = "name"] + | +-- VariableDeclaratorId[@Array = false, @ArrayDepth = 0, @ArrayType = false, @EnumConstant = false, @ExceptionBlockParameter = false, @Field = true, @Final = false, @FormalParameter = false, @Image = "name", @LambdaParameter = false, @LocalVariable = false, @ResourceDeclaration = false, @TypeInferred = false, @VariableName = "name"] + +-- TypeDeclaration[] + | +-- ClassOrInterfaceDeclaration[@Abstract = false, @BinaryName = "SimpleBeanUser", @Default = false, @Final = false, @Image = "SimpleBeanUser", @Interface = false, @Local = false, @Modifiers = 0, @Native = false, @Nested = null, @PackagePrivate = true, @Private = false, @Protected = false, @Public = false, @SimpleName = "SimpleBeanUser", @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.CONSTRUCTOR] + | | +-- ConstructorDeclaration[@Abstract = false, @Arity = 1, @Default = false, @Final = false, @Image = "SimpleBeanUser", @Kind = MethodLikeKind.CONSTRUCTOR, @Modifiers = 0, @Name = "SimpleBeanUser", @Native = false, @PackagePrivate = true, @Private = false, @Protected = false, @Public = false, @Static = false, @Strictfp = false, @Synchronized = false, @Transient = false, @Varargs = false, @Volatile = false, @containsComment = false] + | | +-- FormalParameters[@ParameterCount = 1] + | | | +-- FormalParameter[@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, @Varargs = false, @Volatile = false] + | | | +-- ClassOrInterfaceType[@AnonymousClass = false, @ArrayDepth = 0, @ArrayType = false, @ClassOrInterfaceType = true, @Image = "SimpleBean", @PrimitiveType = false, @ReferenceToClassSameCompilationUnit = true, @ReferenceType = true, @SimpleName = "SimpleBean", @TypeImage = "SimpleBean"] + | | | +-- VariableDeclaratorId[@Array = false, @ArrayDepth = 0, @ArrayType = false, @EnumConstant = false, @ExceptionBlockParameter = false, @Field = false, @Final = false, @FormalParameter = true, @Image = "o", @LambdaParameter = false, @LocalVariable = false, @ResourceDeclaration = false, @TypeInferred = false, @VariableName = "o"] + | | +-- Block[@containsComment = false] + | +-- ClassOrInterfaceBodyDeclaration[@AnonymousInnerClass = false, @EnumChild = false, @Kind = DeclarationKind.CONSTRUCTOR] + | +-- ConstructorDeclaration[@Abstract = false, @Arity = 0, @Default = false, @Final = false, @Image = "SimpleBeanUser", @Kind = MethodLikeKind.CONSTRUCTOR, @Modifiers = 0, @Name = "SimpleBeanUser", @Native = false, @PackagePrivate = true, @Private = false, @Protected = false, @Public = false, @Static = false, @Strictfp = false, @Synchronized = false, @Transient = false, @Varargs = false, @Volatile = false, @containsComment = false] + | +-- FormalParameters[@ParameterCount = 0] + | +-- Block[@containsComment = false] + | +-- ExplicitConstructorInvocation[@ArgumentCount = 1, @Qualified = false, @Super = false, @This = true] + | +-- ArgumentList[@ArgumentCount = 1] + | +-- ConstructorCall[@AnonymousClass = true, @CompileTimeConstant = false, @DiamondTypeArgs = false, @Expression = true, @ParenthesisDepth = 0, @Parenthesized = false, @QualifiedInstanceCreation = false] + | +-- ClassOrInterfaceType[@AnonymousClass = false, @ArrayDepth = 0, @ArrayType = false, @ClassOrInterfaceType = true, @Image = "SimpleBean", @PrimitiveType = false, @ReferenceToClassSameCompilationUnit = true, @ReferenceType = true, @SimpleName = "SimpleBean", @TypeImage = "SimpleBean"] + | +-- ArgumentList[@ArgumentCount = 0] + | +-- AnonymousClassDeclaration[] + | +-- ClassOrInterfaceBody[@AnonymousInnerClass = false, @EnumChild = false] + | +-- ClassOrInterfaceBodyDeclaration[@AnonymousInnerClass = false, @EnumChild = false, @Kind = DeclarationKind.INITIALIZER] + | +-- Initializer[@Static = false] + | +-- Block[@containsComment = false] + | +-- ExpressionStatement[] + | +-- AssignmentExpression[@CompileTimeConstant = false, @Compound = false, @Expression = true, @Operator = AssignmentOp.ASSIGN, @ParenthesisDepth = 0, @Parenthesized = false] + | +-- VariableAccess[@AccessType = AccessType.WRITE, @CompileTimeConstant = false, @Expression = true, @Image = "name", @ParenthesisDepth = 0, @Parenthesized = false, @VariableName = "name"] + | +-- StringLiteral[@BooleanLiteral = false, @CharLiteral = false, @CompileTimeConstant = true, @ConstValue = "test", @DoubleLiteral = false, @Expression = true, @FloatLiteral = false, @Image = ""test"", @IntLiteral = false, @LongLiteral = false, @NullLiteral = false, @NumericLiteral = false, @ParenthesisDepth = 0, @Parenthesized = false, @StringLiteral = true, @TextBlock = false] + +-- TypeDeclaration[] + | +-- ClassOrInterfaceDeclaration[@Abstract = false, @BinaryName = "SimpleBeanUser2", @Default = false, @Final = false, @Image = "SimpleBeanUser2", @Interface = false, @Local = false, @Modifiers = 0, @Native = false, @Nested = null, @PackagePrivate = true, @Private = false, @Protected = false, @Public = false, @SimpleName = "SimpleBeanUser2", @Static = false, @Strictfp = false, @Synchronized = false, @Transient = false, @TypeKind = TypeKind.CLASS, @Volatile = false] + | +-- ExtendsList[] + | | +-- ClassOrInterfaceType[@AnonymousClass = false, @ArrayDepth = 0, @ArrayType = false, @ClassOrInterfaceType = true, @Image = "SimpleBeanUser", @PrimitiveType = false, @ReferenceToClassSameCompilationUnit = true, @ReferenceType = true, @SimpleName = "SimpleBeanUser", @TypeImage = "SimpleBeanUser"] + | +-- ClassOrInterfaceBody[@AnonymousInnerClass = false, @EnumChild = false] + | +-- ClassOrInterfaceBodyDeclaration[@AnonymousInnerClass = false, @EnumChild = false, @Kind = DeclarationKind.CONSTRUCTOR] + | +-- ConstructorDeclaration[@Abstract = false, @Arity = 0, @Default = false, @Final = false, @Image = "SimpleBeanUser2", @Kind = MethodLikeKind.CONSTRUCTOR, @Modifiers = 0, @Name = "SimpleBeanUser2", @Native = false, @PackagePrivate = true, @Private = false, @Protected = false, @Public = false, @Static = false, @Strictfp = false, @Synchronized = false, @Transient = false, @Varargs = false, @Volatile = false, @containsComment = false] + | +-- FormalParameters[@ParameterCount = 0] + | +-- Block[@containsComment = false] + | +-- ExplicitConstructorInvocation[@ArgumentCount = 1, @Qualified = false, @Super = true, @This = false] + | +-- ArgumentList[@ArgumentCount = 1] + | +-- ConstructorCall[@AnonymousClass = true, @CompileTimeConstant = false, @DiamondTypeArgs = false, @Expression = true, @ParenthesisDepth = 0, @Parenthesized = false, @QualifiedInstanceCreation = false] + | +-- ClassOrInterfaceType[@AnonymousClass = false, @ArrayDepth = 0, @ArrayType = false, @ClassOrInterfaceType = true, @Image = "SimpleBean", @PrimitiveType = false, @ReferenceToClassSameCompilationUnit = true, @ReferenceType = true, @SimpleName = "SimpleBean", @TypeImage = "SimpleBean"] + | +-- ArgumentList[@ArgumentCount = 0] + | +-- AnonymousClassDeclaration[] + | +-- ClassOrInterfaceBody[@AnonymousInnerClass = false, @EnumChild = false] + | +-- ClassOrInterfaceBodyDeclaration[@AnonymousInnerClass = false, @EnumChild = false, @Kind = DeclarationKind.INITIALIZER] + | +-- Initializer[@Static = false] + | +-- Block[@containsComment = false] + | +-- ExpressionStatement[] + | +-- AssignmentExpression[@CompileTimeConstant = false, @Compound = false, @Expression = true, @Operator = AssignmentOp.ASSIGN, @ParenthesisDepth = 0, @Parenthesized = false] + | +-- VariableAccess[@AccessType = AccessType.WRITE, @CompileTimeConstant = false, @Expression = true, @Image = "name", @ParenthesisDepth = 0, @Parenthesized = false, @VariableName = "name"] + | +-- StringLiteral[@BooleanLiteral = false, @CharLiteral = false, @CompileTimeConstant = true, @ConstValue = "test2", @DoubleLiteral = false, @Expression = true, @FloatLiteral = false, @Image = ""test2"", @IntLiteral = false, @LongLiteral = false, @NullLiteral = false, @NumericLiteral = false, @ParenthesisDepth = 0, @Parenthesized = false, @StringLiteral = true, @TextBlock = false] + +-- TypeDeclaration[] + | +-- ClassOrInterfaceDeclaration[@Abstract = false, @BinaryName = "TestParseAnnototation", @Default = false, @Final = false, @Image = "TestParseAnnototation", @Interface = false, @Local = false, @Modifiers = 0, @Native = false, @Nested = null, @PackagePrivate = true, @Private = false, @Protected = false, @Public = false, @SimpleName = "TestParseAnnototation", @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 = 0, @Default = false, @Final = false, @Image = "parse", @InterfaceMember = false, @Kind = MethodLikeKind.METHOD, @MethodName = "parse", @Modifiers = 0, @Name = "parse", @Native = false, @PackagePrivate = true, @Private = false, @Protected = false, @Public = false, @Static = false, @Strictfp = false, @Synchronized = false, @SyntacticallyAbstract = false, @SyntacticallyPublic = false, @Transient = false, @Varargs = false, @Void = true, @Volatile = false] + | +-- ResultType[@Void = true, @returnsArray = false] + | +-- FormalParameters[@ParameterCount = 0] + | +-- Block[@containsComment = false] + | +-- ForStatement[] + | | +-- ForInit[] + | | | +-- 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 = "i", @Volatile = false] + | | | +-- SingleMemberAnnotation[@AnnotationName = "SuppressWarnings", @Image = "SuppressWarnings", @SimpleName = "SuppressWarnings"] + | | | | +-- StringLiteral[@BooleanLiteral = false, @CharLiteral = false, @CompileTimeConstant = true, @ConstValue = "unchecked", @DoubleLiteral = false, @Expression = true, @FloatLiteral = false, @Image = ""unchecked"", @IntLiteral = false, @LongLiteral = false, @NullLiteral = false, @NumericLiteral = false, @ParenthesisDepth = 0, @Parenthesized = false, @StringLiteral = true, @TextBlock = false] + | | | +-- PrimitiveType[@ArrayDepth = 0, @ArrayType = false, @Boolean = false, @ClassOrInterfaceType = false, @Image = "int", @ModelConstant = PrimitiveType.INT, @PrimitiveType = true, @ReferenceType = false, @TypeImage = "int"] + | | | +-- VariableDeclarator[@Initializer = true, @Name = "i"] + | | | +-- VariableDeclaratorId[@Array = false, @ArrayDepth = 0, @ArrayType = false, @EnumConstant = false, @ExceptionBlockParameter = false, @Field = false, @Final = false, @FormalParameter = false, @Image = "i", @LambdaParameter = false, @LocalVariable = true, @ResourceDeclaration = false, @TypeInferred = false, @VariableName = "i"] + | | | +-- NumericLiteral[@Base = 10, @BooleanLiteral = false, @CharLiteral = false, @CompileTimeConstant = false, @DoubleLiteral = false, @Expression = true, @FloatLiteral = false, @Image = "0", @IntLiteral = true, @Integral = true, @LongLiteral = false, @NullLiteral = false, @NumericLiteral = true, @ParenthesisDepth = 0, @Parenthesized = false, @PrimitiveType = PrimitiveType.INT, @StringLiteral = false, @ValueAsDouble = 0.0, @ValueAsFloat = 0.0, @ValueAsInt = 0, @ValueAsLong = 0] + | | +-- InfixExpression[@CompileTimeConstant = false, @Expression = true, @Operator = BinaryOp.LT, @ParenthesisDepth = 0, @Parenthesized = false] + | | | +-- VariableAccess[@AccessType = AccessType.READ, @CompileTimeConstant = false, @Expression = true, @Image = "i", @ParenthesisDepth = 0, @Parenthesized = false, @VariableName = "i"] + | | | +-- NumericLiteral[@Base = 10, @BooleanLiteral = false, @CharLiteral = false, @CompileTimeConstant = false, @DoubleLiteral = false, @Expression = true, @FloatLiteral = false, @Image = "10", @IntLiteral = true, @Integral = true, @LongLiteral = false, @NullLiteral = false, @NumericLiteral = true, @ParenthesisDepth = 0, @Parenthesized = false, @PrimitiveType = PrimitiveType.INT, @StringLiteral = false, @ValueAsDouble = 10.0, @ValueAsFloat = 10.0, @ValueAsInt = 10, @ValueAsLong = 10] + | | +-- ForUpdate[] + | | | +-- StatementExpressionList[] + | | | +-- UnaryExpression[@CompileTimeConstant = false, @Expression = true, @Operator = UnaryOp.POST_INCREMENT, @ParenthesisDepth = 0, @Parenthesized = false, @Prefix = false] + | | | +-- VariableAccess[@AccessType = AccessType.WRITE, @CompileTimeConstant = false, @Expression = true, @Image = "i", @ParenthesisDepth = 0, @Parenthesized = false, @VariableName = "i"] + | | +-- Block[@containsComment = false] + | +-- ForStatement[] + | | +-- ForInit[] + | | | +-- 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 = "it", @Volatile = false] + | | | +-- SingleMemberAnnotation[@AnnotationName = "SuppressWarnings", @Image = "SuppressWarnings", @SimpleName = "SuppressWarnings"] + | | | | +-- StringLiteral[@BooleanLiteral = false, @CharLiteral = false, @CompileTimeConstant = true, @ConstValue = "unchecked", @DoubleLiteral = false, @Expression = true, @FloatLiteral = false, @Image = ""unchecked"", @IntLiteral = false, @LongLiteral = false, @NullLiteral = false, @NumericLiteral = false, @ParenthesisDepth = 0, @Parenthesized = false, @StringLiteral = true, @TextBlock = false] + | | | +-- ClassOrInterfaceType[@AnonymousClass = false, @ArrayDepth = 0, @ArrayType = false, @ClassOrInterfaceType = true, @Image = "Iterator", @PrimitiveType = false, @ReferenceToClassSameCompilationUnit = false, @ReferenceType = true, @SimpleName = "Iterator", @TypeImage = "Iterator"] + | | | +-- VariableDeclarator[@Initializer = true, @Name = "it"] + | | | +-- VariableDeclaratorId[@Array = false, @ArrayDepth = 0, @ArrayType = false, @EnumConstant = false, @ExceptionBlockParameter = false, @Field = false, @Final = false, @FormalParameter = false, @Image = "it", @LambdaParameter = false, @LocalVariable = true, @ResourceDeclaration = false, @TypeInferred = false, @VariableName = "it"] + | | | +-- MethodCall[@CompileTimeConstant = false, @Expression = true, @Image = "iterator", @MethodName = "iterator", @ParenthesisDepth = 0, @Parenthesized = false] + | | | +-- MethodCall[@CompileTimeConstant = false, @Expression = true, @Image = "values", @MethodName = "values", @ParenthesisDepth = 0, @Parenthesized = false] + | | | | +-- AmbiguousName[@ArrayDepth = 0, @ArrayType = false, @ClassOrInterfaceType = false, @CompileTimeConstant = false, @Expression = true, @Image = "Fachabteilung", @Name = "Fachabteilung", @ParenthesisDepth = 0, @Parenthesized = false, @PrimitiveType = false, @ReferenceType = true, @Segments = null, @TypeImage = "Fachabteilung"] + | | | | +-- ArgumentList[@ArgumentCount = 0] + | | | +-- ArgumentList[@ArgumentCount = 0] + | | +-- MethodCall[@CompileTimeConstant = false, @Expression = true, @Image = "hasNext", @MethodName = "hasNext", @ParenthesisDepth = 0, @Parenthesized = false] + | | | +-- AmbiguousName[@ArrayDepth = 0, @ArrayType = false, @ClassOrInterfaceType = false, @CompileTimeConstant = false, @Expression = true, @Image = "it", @Name = "it", @ParenthesisDepth = 0, @Parenthesized = false, @PrimitiveType = false, @ReferenceType = true, @Segments = null, @TypeImage = "it"] + | | | +-- ArgumentList[@ArgumentCount = 0] + | | +-- Block[@containsComment = 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 = "l", @Volatile = false] + | | +-- ClassOrInterfaceType[@AnonymousClass = false, @ArrayDepth = 0, @ArrayType = false, @ClassOrInterfaceType = true, @Image = "List", @PrimitiveType = false, @ReferenceToClassSameCompilationUnit = false, @ReferenceType = true, @SimpleName = "List", @TypeImage = "List"] + | | | +-- TypeArguments[@Diamond = false] + | | | +-- ClassOrInterfaceType[@AnonymousClass = false, @ArrayDepth = 0, @ArrayType = false, @ClassOrInterfaceType = true, @Image = "String", @PrimitiveType = false, @ReferenceToClassSameCompilationUnit = false, @ReferenceType = true, @SimpleName = "String", @TypeImage = "String"] + | | +-- VariableDeclarator[@Initializer = true, @Name = "l"] + | | +-- VariableDeclaratorId[@Array = false, @ArrayDepth = 0, @ArrayType = false, @EnumConstant = false, @ExceptionBlockParameter = false, @Field = false, @Final = false, @FormalParameter = false, @Image = "l", @LambdaParameter = false, @LocalVariable = true, @ResourceDeclaration = false, @TypeInferred = false, @VariableName = "l"] + | | +-- ConstructorCall[@AnonymousClass = false, @CompileTimeConstant = false, @DiamondTypeArgs = false, @Expression = true, @ParenthesisDepth = 0, @Parenthesized = false, @QualifiedInstanceCreation = false] + | | +-- ClassOrInterfaceType[@AnonymousClass = false, @ArrayDepth = 0, @ArrayType = false, @ClassOrInterfaceType = true, @Image = "ArrayList", @PrimitiveType = false, @ReferenceToClassSameCompilationUnit = false, @ReferenceType = true, @SimpleName = "ArrayList", @TypeImage = "ArrayList"] + | | | +-- TypeArguments[@Diamond = false] + | | | +-- ClassOrInterfaceType[@AnonymousClass = false, @ArrayDepth = 0, @ArrayType = false, @ClassOrInterfaceType = true, @Image = "String", @PrimitiveType = false, @ReferenceToClassSameCompilationUnit = false, @ReferenceType = true, @SimpleName = "String", @TypeImage = "String"] + | | +-- ArgumentList[@ArgumentCount = 0] + | +-- ForeachStatement[] + | +-- 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 = "s", @Volatile = false] + | | +-- SingleMemberAnnotation[@AnnotationName = "SuppressWarnings", @Image = "SuppressWarnings", @SimpleName = "SuppressWarnings"] + | | | +-- StringLiteral[@BooleanLiteral = false, @CharLiteral = false, @CompileTimeConstant = true, @ConstValue = "unchecked", @DoubleLiteral = false, @Expression = true, @FloatLiteral = false, @Image = ""unchecked"", @IntLiteral = false, @LongLiteral = false, @NullLiteral = false, @NumericLiteral = false, @ParenthesisDepth = 0, @Parenthesized = false, @StringLiteral = true, @TextBlock = false] + | | +-- ClassOrInterfaceType[@AnonymousClass = false, @ArrayDepth = 0, @ArrayType = false, @ClassOrInterfaceType = true, @Image = "String", @PrimitiveType = false, @ReferenceToClassSameCompilationUnit = false, @ReferenceType = true, @SimpleName = "String", @TypeImage = "String"] + | | +-- VariableDeclarator[@Initializer = false, @Name = "s"] + | | +-- VariableDeclaratorId[@Array = false, @ArrayDepth = 0, @ArrayType = false, @EnumConstant = false, @ExceptionBlockParameter = false, @Field = false, @Final = false, @FormalParameter = false, @Image = "s", @LambdaParameter = false, @LocalVariable = true, @ResourceDeclaration = false, @TypeInferred = false, @VariableName = "s"] + | +-- VariableAccess[@AccessType = AccessType.READ, @CompileTimeConstant = false, @Expression = true, @Image = "l", @ParenthesisDepth = 0, @Parenthesized = false, @VariableName = "l"] + | +-- Block[@containsComment = false] + +-- TypeDeclaration[] + | +-- ClassOrInterfaceDeclaration[@Abstract = false, @BinaryName = "FooBlock", @Default = false, @Final = false, @Image = "FooBlock", @Interface = false, @Local = false, @Modifiers = 0, @Native = false, @Nested = null, @PackagePrivate = true, @Private = false, @Protected = false, @Public = false, @SimpleName = "FooBlock", @Static = false, @Strictfp = false, @Synchronized = false, @Transient = false, @TypeKind = TypeKind.CLASS, @Volatile = false] + | +-- ClassOrInterfaceBody[@AnonymousInnerClass = false, @EnumChild = false] + +-- TypeDeclaration[] + | +-- ClassOrInterfaceDeclaration[@Abstract = false, @BinaryName = "MyFoo", @Default = false, @Final = false, @Image = "MyFoo", @Interface = false, @Local = false, @Modifiers = 0, @Native = false, @Nested = null, @PackagePrivate = true, @Private = false, @Protected = false, @Public = false, @SimpleName = "MyFoo", @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.CONSTRUCTOR] + | +-- ConstructorDeclaration[@Abstract = false, @Arity = 1, @Default = false, @Final = false, @Image = "MyFoo", @Kind = MethodLikeKind.CONSTRUCTOR, @Modifiers = 0, @Name = "MyFoo", @Native = false, @PackagePrivate = true, @Private = false, @Protected = false, @Public = false, @Static = false, @Strictfp = false, @Synchronized = false, @Transient = false, @Varargs = false, @Volatile = false, @containsComment = false] + | +-- FormalParameters[@ParameterCount = 1] + | | +-- FormalParameter[@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, @Varargs = false, @Volatile = false] + | | +-- ClassOrInterfaceType[@AnonymousClass = false, @ArrayDepth = 0, @ArrayType = false, @ClassOrInterfaceType = true, @Image = "FooBlock", @PrimitiveType = false, @ReferenceToClassSameCompilationUnit = true, @ReferenceType = true, @SimpleName = "FooBlock", @TypeImage = "FooBlock"] + | | +-- VariableDeclaratorId[@Array = false, @ArrayDepth = 0, @ArrayType = false, @EnumConstant = false, @ExceptionBlockParameter = false, @Field = false, @Final = false, @FormalParameter = true, @Image = "b", @LambdaParameter = false, @LocalVariable = false, @ResourceDeclaration = false, @TypeInferred = false, @VariableName = "b"] + | +-- Block[@containsComment = false] + +-- TypeDeclaration[] + | +-- ClassOrInterfaceDeclaration[@Abstract = false, @BinaryName = "Foo", @Default = false, @Final = false, @Image = "Foo", @Interface = false, @Local = false, @Modifiers = 0, @Native = false, @Nested = null, @PackagePrivate = true, @Private = false, @Protected = false, @Public = false, @SimpleName = "Foo", @Static = false, @Strictfp = false, @Synchronized = false, @Transient = false, @TypeKind = TypeKind.CLASS, @Volatile = false] + | +-- ExtendsList[] + | | +-- ClassOrInterfaceType[@AnonymousClass = false, @ArrayDepth = 0, @ArrayType = false, @ClassOrInterfaceType = true, @Image = "MyFoo", @PrimitiveType = false, @ReferenceToClassSameCompilationUnit = true, @ReferenceType = true, @SimpleName = "MyFoo", @TypeImage = "MyFoo"] + | +-- ClassOrInterfaceBody[@AnonymousInnerClass = false, @EnumChild = false] + | +-- ClassOrInterfaceBodyDeclaration[@AnonymousInnerClass = false, @EnumChild = false, @Kind = DeclarationKind.CONSTRUCTOR] + | +-- ConstructorDeclaration[@Abstract = false, @Arity = 0, @Default = false, @Final = false, @Image = "Foo", @Kind = MethodLikeKind.CONSTRUCTOR, @Modifiers = 1, @Name = "Foo", @Native = false, @PackagePrivate = false, @Private = false, @Protected = false, @Public = true, @Static = false, @Strictfp = false, @Synchronized = false, @Transient = false, @Varargs = false, @Volatile = false, @containsComment = false] + | +-- FormalParameters[@ParameterCount = 0] + | +-- Block[@containsComment = false] + | +-- ExplicitConstructorInvocation[@ArgumentCount = 1, @Qualified = false, @Super = true, @This = false] + | +-- ArgumentList[@ArgumentCount = 1] + | +-- ConstructorCall[@AnonymousClass = true, @CompileTimeConstant = false, @DiamondTypeArgs = false, @Expression = true, @ParenthesisDepth = 0, @Parenthesized = false, @QualifiedInstanceCreation = false] + | +-- ClassOrInterfaceType[@AnonymousClass = false, @ArrayDepth = 0, @ArrayType = false, @ClassOrInterfaceType = true, @Image = "FooBlock", @PrimitiveType = false, @ReferenceToClassSameCompilationUnit = true, @ReferenceType = true, @SimpleName = "FooBlock", @TypeImage = "FooBlock"] + | +-- ArgumentList[@ArgumentCount = 0] + | +-- AnonymousClassDeclaration[] + | +-- ClassOrInterfaceBody[@AnonymousInnerClass = false, @EnumChild = false] + | +-- ClassOrInterfaceBodyDeclaration[@AnonymousInnerClass = false, @EnumChild = false, @Kind = DeclarationKind.METHOD] + | +-- MethodDeclaration[@Abstract = false, @Arity = 1, @Default = false, @Final = false, @Image = "valueOf", @InterfaceMember = false, @Kind = MethodLikeKind.METHOD, @MethodName = "valueOf", @Modifiers = 1, @Name = "valueOf", @Native = false, @PackagePrivate = false, @Private = false, @Protected = false, @Public = true, @Static = false, @Strictfp = false, @Synchronized = false, @SyntacticallyAbstract = false, @SyntacticallyPublic = true, @Transient = false, @Varargs = false, @Void = false, @Volatile = false] + | +-- ResultType[@Void = false, @returnsArray = false] + | | +-- ClassOrInterfaceType[@AnonymousClass = false, @ArrayDepth = 0, @ArrayType = false, @ClassOrInterfaceType = true, @Image = "Object", @PrimitiveType = false, @ReferenceToClassSameCompilationUnit = false, @ReferenceType = true, @SimpleName = "Object", @TypeImage = "Object"] + | +-- FormalParameters[@ParameterCount = 1] + | | +-- FormalParameter[@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, @Varargs = false, @Volatile = false] + | | +-- ClassOrInterfaceType[@AnonymousClass = false, @ArrayDepth = 0, @ArrayType = false, @ClassOrInterfaceType = true, @Image = "Object", @PrimitiveType = false, @ReferenceToClassSameCompilationUnit = false, @ReferenceType = true, @SimpleName = "Object", @TypeImage = "Object"] + | | +-- VariableDeclaratorId[@Array = false, @ArrayDepth = 0, @ArrayType = false, @EnumConstant = false, @ExceptionBlockParameter = false, @Field = false, @Final = false, @FormalParameter = true, @Image = "object", @LambdaParameter = false, @LocalVariable = false, @ResourceDeclaration = false, @TypeInferred = false, @VariableName = "object"] + | +-- Block[@containsComment = 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 = "fish", @Volatile = false] + | | +-- ClassOrInterfaceType[@AnonymousClass = false, @ArrayDepth = 0, @ArrayType = false, @ClassOrInterfaceType = true, @Image = "String", @PrimitiveType = false, @ReferenceToClassSameCompilationUnit = false, @ReferenceType = true, @SimpleName = "String", @TypeImage = "String"] + | | +-- VariableDeclarator[@Initializer = true, @Name = "fish"] + | | +-- VariableDeclaratorId[@Array = false, @ArrayDepth = 0, @ArrayType = false, @EnumConstant = false, @ExceptionBlockParameter = false, @Field = false, @Final = false, @FormalParameter = false, @Image = "fish", @LambdaParameter = false, @LocalVariable = true, @ResourceDeclaration = false, @TypeInferred = false, @VariableName = "fish"] + | | +-- StringLiteral[@BooleanLiteral = false, @CharLiteral = false, @CompileTimeConstant = true, @ConstValue = "salmon", @DoubleLiteral = false, @Expression = true, @FloatLiteral = false, @Image = ""salmon"", @IntLiteral = false, @LongLiteral = false, @NullLiteral = false, @NumericLiteral = false, @ParenthesisDepth = 0, @Parenthesized = false, @StringLiteral = true, @TextBlock = false] + | +-- ReturnStatement[] + | +-- VariableAccess[@AccessType = AccessType.READ, @CompileTimeConstant = false, @Expression = true, @Image = "fish", @ParenthesisDepth = 0, @Parenthesized = false, @VariableName = "fish"] + +-- TypeDeclaration[] + | +-- ClassOrInterfaceDeclaration[@Abstract = false, @BinaryName = "SuperTest", @Default = false, @Final = false, @Image = "SuperTest", @Interface = false, @Local = false, @Modifiers = 0, @Native = false, @Nested = null, @PackagePrivate = true, @Private = false, @Protected = false, @Public = false, @SimpleName = "SuperTest", @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 = 0, @Default = false, @Final = false, @Image = "iterator", @InterfaceMember = false, @Kind = MethodLikeKind.METHOD, @MethodName = "iterator", @Modifiers = 1, @Name = "iterator", @Native = false, @PackagePrivate = false, @Private = false, @Protected = false, @Public = true, @Static = false, @Strictfp = false, @Synchronized = false, @SyntacticallyAbstract = false, @SyntacticallyPublic = true, @Transient = false, @Varargs = false, @Void = false, @Volatile = false] + | +-- ResultType[@Void = false, @returnsArray = false] + | | +-- ClassOrInterfaceType[@AnonymousClass = false, @ArrayDepth = 0, @ArrayType = false, @ClassOrInterfaceType = true, @Image = "Iterator", @PrimitiveType = false, @ReferenceToClassSameCompilationUnit = false, @ReferenceType = true, @SimpleName = "Iterator", @TypeImage = "Iterator"] + | | +-- TypeArguments[@Diamond = false] + | | +-- ClassOrInterfaceType[@AnonymousClass = false, @ArrayDepth = 0, @ArrayType = false, @ClassOrInterfaceType = true, @Image = "E", @PrimitiveType = false, @ReferenceToClassSameCompilationUnit = false, @ReferenceType = true, @SimpleName = "E", @TypeImage = "E"] + | +-- FormalParameters[@ParameterCount = 0] + | +-- Block[@containsComment = false] + | +-- IfStatement[@Else = false] + | | +-- MethodCall[@CompileTimeConstant = false, @Expression = true, @Image = "contains", @MethodName = "contains", @ParenthesisDepth = 0, @Parenthesized = false] + | | | +-- FieldAccess[@AccessType = AccessType.READ, @CompileTimeConstant = false, @Expression = true, @FieldName = "mods", @Image = "mods", @ParenthesisDepth = 0, @Parenthesized = false] + | | | | +-- ThisExpression[@CompileTimeConstant = false, @Expression = true, @ParenthesisDepth = 0, @Parenthesized = false] + | | | +-- ArgumentList[@ArgumentCount = 1] + | | | +-- FieldAccess[@AccessType = AccessType.READ, @CompileTimeConstant = false, @Expression = true, @FieldName = "Iterator", @Image = "Iterator", @ParenthesisDepth = 0, @Parenthesized = false] + | | | +-- AmbiguousName[@ArrayDepth = 0, @ArrayType = false, @ClassOrInterfaceType = false, @CompileTimeConstant = false, @Expression = true, @Image = "Modification", @Name = "Modification", @ParenthesisDepth = 0, @Parenthesized = false, @PrimitiveType = false, @ReferenceType = true, @Segments = null, @TypeImage = "Modification"] + | | +-- Block[@containsComment = false] + | | +-- ReturnStatement[] + | | +-- ConstructorCall[@AnonymousClass = true, @CompileTimeConstant = false, @DiamondTypeArgs = false, @Expression = true, @ParenthesisDepth = 0, @Parenthesized = false, @QualifiedInstanceCreation = false] + | | +-- ClassOrInterfaceType[@AnonymousClass = false, @ArrayDepth = 0, @ArrayType = false, @ClassOrInterfaceType = true, @Image = "Iterator", @PrimitiveType = false, @ReferenceToClassSameCompilationUnit = false, @ReferenceType = true, @SimpleName = "Iterator", @TypeImage = "Iterator"] + | | | +-- TypeArguments[@Diamond = false] + | | | +-- ClassOrInterfaceType[@AnonymousClass = false, @ArrayDepth = 0, @ArrayType = false, @ClassOrInterfaceType = true, @Image = "E", @PrimitiveType = false, @ReferenceToClassSameCompilationUnit = false, @ReferenceType = true, @SimpleName = "E", @TypeImage = "E"] + | | +-- ArgumentList[@ArgumentCount = 0] + | | +-- AnonymousClassDeclaration[] + | | +-- ClassOrInterfaceBody[@AnonymousInnerClass = false, @EnumChild = false] + | | +-- ClassOrInterfaceBodyDeclaration[@AnonymousInnerClass = false, @EnumChild = false, @Kind = DeclarationKind.FIELD] + | | | +-- FieldDeclaration[@Abstract = false, @AnnotationMember = false, @Array = false, @ArrayDepth = 0, @Default = false, @Final = false, @InterfaceMember = false, @Modifiers = 0, @Native = false, @PackagePrivate = true, @Private = false, @Protected = false, @Public = false, @Static = false, @Strictfp = false, @Synchronized = false, @SyntacticallyFinal = false, @SyntacticallyPublic = false, @SyntacticallyStatic = false, @Transient = false, @VariableName = "wrapped", @Volatile = false] + | | | +-- ClassOrInterfaceType[@AnonymousClass = false, @ArrayDepth = 0, @ArrayType = false, @ClassOrInterfaceType = true, @Image = "Iterator", @PrimitiveType = false, @ReferenceToClassSameCompilationUnit = false, @ReferenceType = true, @SimpleName = "Iterator", @TypeImage = "Iterator"] + | | | | +-- TypeArguments[@Diamond = false] + | | | | +-- ClassOrInterfaceType[@AnonymousClass = false, @ArrayDepth = 0, @ArrayType = false, @ClassOrInterfaceType = true, @Image = "E", @PrimitiveType = false, @ReferenceToClassSameCompilationUnit = false, @ReferenceType = true, @SimpleName = "E", @TypeImage = "E"] + | | | +-- VariableDeclarator[@Initializer = true, @Name = "wrapped"] + | | | +-- VariableDeclaratorId[@Array = false, @ArrayDepth = 0, @ArrayType = false, @EnumConstant = false, @ExceptionBlockParameter = false, @Field = true, @Final = false, @FormalParameter = false, @Image = "wrapped", @LambdaParameter = false, @LocalVariable = false, @ResourceDeclaration = false, @TypeInferred = false, @VariableName = "wrapped"] + | | | +-- MethodCall[@CompileTimeConstant = false, @Expression = true, @Image = "iterator", @MethodName = "iterator", @ParenthesisDepth = 0, @Parenthesized = false] + | | | +-- SuperExpression[@CompileTimeConstant = false, @Expression = true, @ParenthesisDepth = 0, @Parenthesized = false] + | | | | +-- ClassOrInterfaceType[@AnonymousClass = false, @ArrayDepth = 0, @ArrayType = false, @ClassOrInterfaceType = true, @Image = "ImmutableSet", @PrimitiveType = false, @ReferenceToClassSameCompilationUnit = false, @ReferenceType = true, @SimpleName = "ImmutableSet", @TypeImage = "ImmutableSet"] + | | | +-- ArgumentList[@ArgumentCount = 0] + | | +-- ClassOrInterfaceBodyDeclaration[@AnonymousInnerClass = false, @EnumChild = false, @Kind = DeclarationKind.METHOD] + | | | +-- MethodDeclaration[@Abstract = false, @Arity = 0, @Default = false, @Final = false, @Image = "hasNext", @InterfaceMember = false, @Kind = MethodLikeKind.METHOD, @MethodName = "hasNext", @Modifiers = 1, @Name = "hasNext", @Native = false, @PackagePrivate = false, @Private = false, @Protected = false, @Public = true, @Static = false, @Strictfp = false, @Synchronized = false, @SyntacticallyAbstract = false, @SyntacticallyPublic = true, @Transient = false, @Varargs = false, @Void = false, @Volatile = false] + | | | +-- ResultType[@Void = false, @returnsArray = false] + | | | | +-- PrimitiveType[@ArrayDepth = 0, @ArrayType = false, @Boolean = true, @ClassOrInterfaceType = false, @Image = "boolean", @ModelConstant = PrimitiveType.BOOLEAN, @PrimitiveType = true, @ReferenceType = false, @TypeImage = "boolean"] + | | | +-- FormalParameters[@ParameterCount = 0] + | | | +-- Block[@containsComment = false] + | | | +-- ReturnStatement[] + | | | +-- MethodCall[@CompileTimeConstant = false, @Expression = true, @Image = "hasNext", @MethodName = "hasNext", @ParenthesisDepth = 0, @Parenthesized = false] + | | | +-- FieldAccess[@AccessType = AccessType.READ, @CompileTimeConstant = false, @Expression = true, @FieldName = "wrapped", @Image = "wrapped", @ParenthesisDepth = 0, @Parenthesized = false] + | | | | +-- ThisExpression[@CompileTimeConstant = false, @Expression = true, @ParenthesisDepth = 0, @Parenthesized = false] + | | | +-- ArgumentList[@ArgumentCount = 0] + | | +-- ClassOrInterfaceBodyDeclaration[@AnonymousInnerClass = false, @EnumChild = false, @Kind = DeclarationKind.METHOD] + | | | +-- MethodDeclaration[@Abstract = false, @Arity = 0, @Default = false, @Final = false, @Image = "next", @InterfaceMember = false, @Kind = MethodLikeKind.METHOD, @MethodName = "next", @Modifiers = 1, @Name = "next", @Native = false, @PackagePrivate = false, @Private = false, @Protected = false, @Public = true, @Static = false, @Strictfp = false, @Synchronized = false, @SyntacticallyAbstract = false, @SyntacticallyPublic = true, @Transient = false, @Varargs = false, @Void = false, @Volatile = false] + | | | +-- ResultType[@Void = false, @returnsArray = false] + | | | | +-- ClassOrInterfaceType[@AnonymousClass = false, @ArrayDepth = 0, @ArrayType = false, @ClassOrInterfaceType = true, @Image = "E", @PrimitiveType = false, @ReferenceToClassSameCompilationUnit = false, @ReferenceType = true, @SimpleName = "E", @TypeImage = "E"] + | | | +-- FormalParameters[@ParameterCount = 0] + | | | +-- Block[@containsComment = false] + | | | +-- ReturnStatement[] + | | | +-- MethodCall[@CompileTimeConstant = false, @Expression = true, @Image = "next", @MethodName = "next", @ParenthesisDepth = 0, @Parenthesized = false] + | | | +-- FieldAccess[@AccessType = AccessType.READ, @CompileTimeConstant = false, @Expression = true, @FieldName = "wrapped", @Image = "wrapped", @ParenthesisDepth = 0, @Parenthesized = false] + | | | | +-- ThisExpression[@CompileTimeConstant = false, @Expression = true, @ParenthesisDepth = 0, @Parenthesized = false] + | | | +-- ArgumentList[@ArgumentCount = 0] + | | +-- ClassOrInterfaceBodyDeclaration[@AnonymousInnerClass = false, @EnumChild = false, @Kind = DeclarationKind.METHOD] + | | +-- MethodDeclaration[@Abstract = false, @Arity = 0, @Default = false, @Final = false, @Image = "remove", @InterfaceMember = false, @Kind = MethodLikeKind.METHOD, @MethodName = "remove", @Modifiers = 1, @Name = "remove", @Native = false, @PackagePrivate = false, @Private = false, @Protected = false, @Public = true, @Static = false, @Strictfp = false, @Synchronized = false, @SyntacticallyAbstract = false, @SyntacticallyPublic = true, @Transient = false, @Varargs = false, @Void = true, @Volatile = false] + | | +-- ResultType[@Void = true, @returnsArray = false] + | | +-- FormalParameters[@ParameterCount = 0] + | | +-- Block[@containsComment = false] + | | +-- IfStatement[@Else = false] + | | | +-- MethodCall[@CompileTimeConstant = false, @Expression = true, @Image = "contains", @MethodName = "contains", @ParenthesisDepth = 0, @Parenthesized = false] + | | | | +-- FieldAccess[@AccessType = AccessType.READ, @CompileTimeConstant = false, @Expression = true, @FieldName = "mods", @Image = "mods", @ParenthesisDepth = 0, @Parenthesized = false] + | | | | | +-- ThisExpression[@CompileTimeConstant = false, @Expression = true, @ParenthesisDepth = 0, @Parenthesized = false] + | | | | | +-- ClassOrInterfaceType[@AnonymousClass = false, @ArrayDepth = 0, @ArrayType = false, @ClassOrInterfaceType = true, @Image = "ImmutableSet", @PrimitiveType = false, @ReferenceToClassSameCompilationUnit = false, @ReferenceType = true, @SimpleName = "ImmutableSet", @TypeImage = "ImmutableSet"] + | | | | +-- ArgumentList[@ArgumentCount = 1] + | | | | +-- FieldAccess[@AccessType = AccessType.READ, @CompileTimeConstant = false, @Expression = true, @FieldName = "RemoveIter", @Image = "RemoveIter", @ParenthesisDepth = 0, @Parenthesized = false] + | | | | +-- AmbiguousName[@ArrayDepth = 0, @ArrayType = false, @ClassOrInterfaceType = false, @CompileTimeConstant = false, @Expression = true, @Image = "Modification", @Name = "Modification", @ParenthesisDepth = 0, @Parenthesized = false, @PrimitiveType = false, @ReferenceType = true, @Segments = null, @TypeImage = "Modification"] + | | | +-- Block[@containsComment = false] + | | | +-- ExpressionStatement[] + | | | +-- MethodCall[@CompileTimeConstant = false, @Expression = true, @Image = "remove", @MethodName = "remove", @ParenthesisDepth = 0, @Parenthesized = false] + | | | +-- FieldAccess[@AccessType = AccessType.READ, @CompileTimeConstant = false, @Expression = true, @FieldName = "wrapped", @Image = "wrapped", @ParenthesisDepth = 0, @Parenthesized = false] + | | | | +-- ThisExpression[@CompileTimeConstant = false, @Expression = true, @ParenthesisDepth = 0, @Parenthesized = false] + | | | +-- ArgumentList[@ArgumentCount = 0] + | | +-- ThrowStatement[@FirstClassOrInterfaceTypeImage = "UnsupportedOperationException"] + | | +-- ConstructorCall[@AnonymousClass = false, @CompileTimeConstant = false, @DiamondTypeArgs = false, @Expression = true, @ParenthesisDepth = 0, @Parenthesized = false, @QualifiedInstanceCreation = false] + | | +-- ClassOrInterfaceType[@AnonymousClass = false, @ArrayDepth = 0, @ArrayType = false, @ClassOrInterfaceType = true, @Image = "UnsupportedOperationException", @PrimitiveType = false, @ReferenceToClassSameCompilationUnit = false, @ReferenceType = true, @SimpleName = "UnsupportedOperationException", @TypeImage = "UnsupportedOperationException"] + | | +-- ArgumentList[@ArgumentCount = 0] + | +-- ThrowStatement[@FirstClassOrInterfaceTypeImage = "UnsupportedOperationException"] + | +-- ConstructorCall[@AnonymousClass = false, @CompileTimeConstant = false, @DiamondTypeArgs = false, @Expression = true, @ParenthesisDepth = 0, @Parenthesized = false, @QualifiedInstanceCreation = false] + | +-- ClassOrInterfaceType[@AnonymousClass = false, @ArrayDepth = 0, @ArrayType = false, @ClassOrInterfaceType = true, @Image = "UnsupportedOperationException", @PrimitiveType = false, @ReferenceToClassSameCompilationUnit = false, @ReferenceType = true, @SimpleName = "UnsupportedOperationException", @TypeImage = "UnsupportedOperationException"] + | +-- ArgumentList[@ArgumentCount = 0] + +-- TypeDeclaration[] + +-- ClassOrInterfaceDeclaration[@Abstract = false, @BinaryName = "ClazzPropertyOfPrimitiveTypes", @Default = false, @Final = false, @Image = "ClazzPropertyOfPrimitiveTypes", @Interface = false, @Local = false, @Modifiers = 0, @Native = false, @Nested = null, @PackagePrivate = true, @Private = false, @Protected = false, @Public = false, @SimpleName = "ClazzPropertyOfPrimitiveTypes", @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 = 0, @Default = false, @Final = false, @Image = "test", @InterfaceMember = false, @Kind = MethodLikeKind.METHOD, @MethodName = "test", @Modifiers = 1, @Name = "test", @Native = false, @PackagePrivate = false, @Private = false, @Protected = false, @Public = true, @Static = false, @Strictfp = false, @Synchronized = false, @SyntacticallyAbstract = false, @SyntacticallyPublic = true, @Transient = false, @Varargs = false, @Void = true, @Volatile = false] + +-- ResultType[@Void = true, @returnsArray = false] + +-- FormalParameters[@ParameterCount = 0] + +-- Block[@containsComment = 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 = "c", @Volatile = false] + | +-- ClassOrInterfaceType[@AnonymousClass = false, @ArrayDepth = 0, @ArrayType = false, @ClassOrInterfaceType = true, @Image = "Class", @PrimitiveType = false, @ReferenceToClassSameCompilationUnit = false, @ReferenceType = true, @SimpleName = "Class", @TypeImage = "Class"] + | | +-- TypeArguments[@Diamond = false] + | | +-- WildcardType[@ArrayDepth = 0, @ArrayType = false, @ClassOrInterfaceType = false, @LowerBound = false, @PrimitiveType = false, @ReferenceType = true, @TypeImage = "?", @UpperBound = false] + | +-- VariableDeclarator[@Initializer = true, @Name = "c"] + | +-- VariableDeclaratorId[@Array = false, @ArrayDepth = 0, @ArrayType = false, @EnumConstant = false, @ExceptionBlockParameter = false, @Field = false, @Final = false, @FormalParameter = false, @Image = "c", @LambdaParameter = false, @LocalVariable = true, @ResourceDeclaration = false, @TypeInferred = false, @VariableName = "c"] + | +-- ClassLiteral[@CompileTimeConstant = false, @Expression = true, @ParenthesisDepth = 0, @Parenthesized = false, @Void = false] + | +-- PrimitiveType[@ArrayDepth = 0, @ArrayType = false, @Boolean = false, @ClassOrInterfaceType = false, @Image = "int", @ModelConstant = PrimitiveType.INT, @PrimitiveType = true, @ReferenceType = false, @TypeImage = "int"] + +-- ExpressionStatement[] + | +-- AssignmentExpression[@CompileTimeConstant = false, @Compound = false, @Expression = true, @Operator = AssignmentOp.ASSIGN, @ParenthesisDepth = 0, @Parenthesized = false] + | +-- VariableAccess[@AccessType = AccessType.WRITE, @CompileTimeConstant = false, @Expression = true, @Image = "c", @ParenthesisDepth = 0, @Parenthesized = false, @VariableName = "c"] + | +-- ClassLiteral[@CompileTimeConstant = false, @Expression = true, @ParenthesisDepth = 0, @Parenthesized = false, @Void = false] + | +-- PrimitiveType[@ArrayDepth = 0, @ArrayType = false, @Boolean = false, @ClassOrInterfaceType = false, @Image = "short", @ModelConstant = PrimitiveType.SHORT, @PrimitiveType = true, @ReferenceType = false, @TypeImage = "short"] + +-- ExpressionStatement[] + | +-- AssignmentExpression[@CompileTimeConstant = false, @Compound = false, @Expression = true, @Operator = AssignmentOp.ASSIGN, @ParenthesisDepth = 0, @Parenthesized = false] + | +-- VariableAccess[@AccessType = AccessType.WRITE, @CompileTimeConstant = false, @Expression = true, @Image = "c", @ParenthesisDepth = 0, @Parenthesized = false, @VariableName = "c"] + | +-- ClassLiteral[@CompileTimeConstant = false, @Expression = true, @ParenthesisDepth = 0, @Parenthesized = false, @Void = false] + | +-- PrimitiveType[@ArrayDepth = 0, @ArrayType = false, @Boolean = false, @ClassOrInterfaceType = false, @Image = "long", @ModelConstant = PrimitiveType.LONG, @PrimitiveType = true, @ReferenceType = false, @TypeImage = "long"] + +-- ExpressionStatement[] + | +-- AssignmentExpression[@CompileTimeConstant = false, @Compound = false, @Expression = true, @Operator = AssignmentOp.ASSIGN, @ParenthesisDepth = 0, @Parenthesized = false] + | +-- VariableAccess[@AccessType = AccessType.WRITE, @CompileTimeConstant = false, @Expression = true, @Image = "c", @ParenthesisDepth = 0, @Parenthesized = false, @VariableName = "c"] + | +-- ClassLiteral[@CompileTimeConstant = false, @Expression = true, @ParenthesisDepth = 0, @Parenthesized = false, @Void = false] + | +-- PrimitiveType[@ArrayDepth = 0, @ArrayType = false, @Boolean = false, @ClassOrInterfaceType = false, @Image = "float", @ModelConstant = PrimitiveType.FLOAT, @PrimitiveType = true, @ReferenceType = false, @TypeImage = "float"] + +-- ExpressionStatement[] + | +-- AssignmentExpression[@CompileTimeConstant = false, @Compound = false, @Expression = true, @Operator = AssignmentOp.ASSIGN, @ParenthesisDepth = 0, @Parenthesized = false] + | +-- VariableAccess[@AccessType = AccessType.WRITE, @CompileTimeConstant = false, @Expression = true, @Image = "c", @ParenthesisDepth = 0, @Parenthesized = false, @VariableName = "c"] + | +-- ClassLiteral[@CompileTimeConstant = false, @Expression = true, @ParenthesisDepth = 0, @Parenthesized = false, @Void = false] + | +-- PrimitiveType[@ArrayDepth = 0, @ArrayType = false, @Boolean = false, @ClassOrInterfaceType = false, @Image = "double", @ModelConstant = PrimitiveType.DOUBLE, @PrimitiveType = true, @ReferenceType = false, @TypeImage = "double"] + +-- ExpressionStatement[] + | +-- AssignmentExpression[@CompileTimeConstant = false, @Compound = false, @Expression = true, @Operator = AssignmentOp.ASSIGN, @ParenthesisDepth = 0, @Parenthesized = false] + | +-- VariableAccess[@AccessType = AccessType.WRITE, @CompileTimeConstant = false, @Expression = true, @Image = "c", @ParenthesisDepth = 0, @Parenthesized = false, @VariableName = "c"] + | +-- ClassLiteral[@CompileTimeConstant = false, @Expression = true, @ParenthesisDepth = 0, @Parenthesized = false, @Void = false] + | +-- PrimitiveType[@ArrayDepth = 0, @ArrayType = false, @Boolean = false, @ClassOrInterfaceType = false, @Image = "char", @ModelConstant = PrimitiveType.CHAR, @PrimitiveType = true, @ReferenceType = false, @TypeImage = "char"] + +-- ExpressionStatement[] + | +-- AssignmentExpression[@CompileTimeConstant = false, @Compound = false, @Expression = true, @Operator = AssignmentOp.ASSIGN, @ParenthesisDepth = 0, @Parenthesized = false] + | +-- VariableAccess[@AccessType = AccessType.WRITE, @CompileTimeConstant = false, @Expression = true, @Image = "c", @ParenthesisDepth = 0, @Parenthesized = false, @VariableName = "c"] + | +-- ClassLiteral[@CompileTimeConstant = false, @Expression = true, @ParenthesisDepth = 0, @Parenthesized = false, @Void = false] + | +-- PrimitiveType[@ArrayDepth = 0, @ArrayType = false, @Boolean = false, @ClassOrInterfaceType = false, @Image = "byte", @ModelConstant = PrimitiveType.BYTE, @PrimitiveType = true, @ReferenceType = false, @TypeImage = "byte"] + +-- ExpressionStatement[] + | +-- AssignmentExpression[@CompileTimeConstant = false, @Compound = false, @Expression = true, @Operator = AssignmentOp.ASSIGN, @ParenthesisDepth = 0, @Parenthesized = false] + | +-- VariableAccess[@AccessType = AccessType.WRITE, @CompileTimeConstant = false, @Expression = true, @Image = "c", @ParenthesisDepth = 0, @Parenthesized = false, @VariableName = "c"] + | +-- ClassLiteral[@CompileTimeConstant = false, @Expression = true, @ParenthesisDepth = 0, @Parenthesized = false, @Void = true] + +-- IfStatement[@Else = false] + | +-- InfixExpression[@CompileTimeConstant = false, @Expression = true, @Operator = BinaryOp.CONDITIONAL_OR, @ParenthesisDepth = 0, @Parenthesized = false] + | | +-- InfixExpression[@CompileTimeConstant = false, @Expression = true, @Operator = BinaryOp.CONDITIONAL_OR, @ParenthesisDepth = 0, @Parenthesized = false] + | | | +-- InfixExpression[@CompileTimeConstant = false, @Expression = true, @Operator = BinaryOp.CONDITIONAL_OR, @ParenthesisDepth = 0, @Parenthesized = false] + | | | | +-- InfixExpression[@CompileTimeConstant = false, @Expression = true, @Operator = BinaryOp.CONDITIONAL_OR, @ParenthesisDepth = 0, @Parenthesized = false] + | | | | | +-- InfixExpression[@CompileTimeConstant = false, @Expression = true, @Operator = BinaryOp.CONDITIONAL_OR, @ParenthesisDepth = 0, @Parenthesized = false] + | | | | | | +-- InfixExpression[@CompileTimeConstant = false, @Expression = true, @Operator = BinaryOp.CONDITIONAL_OR, @ParenthesisDepth = 0, @Parenthesized = false] + | | | | | | | +-- InfixExpression[@CompileTimeConstant = false, @Expression = true, @Operator = BinaryOp.EQ, @ParenthesisDepth = 0, @Parenthesized = false] + | | | | | | | | +-- VariableAccess[@AccessType = AccessType.READ, @CompileTimeConstant = false, @Expression = true, @Image = "c", @ParenthesisDepth = 0, @Parenthesized = false, @VariableName = "c"] + | | | | | | | | +-- ClassLiteral[@CompileTimeConstant = false, @Expression = true, @ParenthesisDepth = 0, @Parenthesized = false, @Void = false] + | | | | | | | | +-- PrimitiveType[@ArrayDepth = 0, @ArrayType = false, @Boolean = false, @ClassOrInterfaceType = false, @Image = "int", @ModelConstant = PrimitiveType.INT, @PrimitiveType = true, @ReferenceType = false, @TypeImage = "int"] + | | | | | | | +-- InfixExpression[@CompileTimeConstant = false, @Expression = true, @Operator = BinaryOp.EQ, @ParenthesisDepth = 0, @Parenthesized = false] + | | | | | | | +-- VariableAccess[@AccessType = AccessType.READ, @CompileTimeConstant = false, @Expression = true, @Image = "c", @ParenthesisDepth = 0, @Parenthesized = false, @VariableName = "c"] + | | | | | | | +-- ClassLiteral[@CompileTimeConstant = false, @Expression = true, @ParenthesisDepth = 0, @Parenthesized = false, @Void = false] + | | | | | | | +-- PrimitiveType[@ArrayDepth = 0, @ArrayType = false, @Boolean = false, @ClassOrInterfaceType = false, @Image = "short", @ModelConstant = PrimitiveType.SHORT, @PrimitiveType = true, @ReferenceType = false, @TypeImage = "short"] + | | | | | | +-- InfixExpression[@CompileTimeConstant = false, @Expression = true, @Operator = BinaryOp.EQ, @ParenthesisDepth = 0, @Parenthesized = false] + | | | | | | +-- VariableAccess[@AccessType = AccessType.READ, @CompileTimeConstant = false, @Expression = true, @Image = "c", @ParenthesisDepth = 0, @Parenthesized = false, @VariableName = "c"] + | | | | | | +-- ClassLiteral[@CompileTimeConstant = false, @Expression = true, @ParenthesisDepth = 0, @Parenthesized = false, @Void = false] + | | | | | | +-- PrimitiveType[@ArrayDepth = 0, @ArrayType = false, @Boolean = false, @ClassOrInterfaceType = false, @Image = "long", @ModelConstant = PrimitiveType.LONG, @PrimitiveType = true, @ReferenceType = false, @TypeImage = "long"] + | | | | | +-- InfixExpression[@CompileTimeConstant = false, @Expression = true, @Operator = BinaryOp.EQ, @ParenthesisDepth = 0, @Parenthesized = false] + | | | | | +-- VariableAccess[@AccessType = AccessType.READ, @CompileTimeConstant = false, @Expression = true, @Image = "c", @ParenthesisDepth = 0, @Parenthesized = false, @VariableName = "c"] + | | | | | +-- ClassLiteral[@CompileTimeConstant = false, @Expression = true, @ParenthesisDepth = 0, @Parenthesized = false, @Void = false] + | | | | | +-- PrimitiveType[@ArrayDepth = 0, @ArrayType = false, @Boolean = false, @ClassOrInterfaceType = false, @Image = "double", @ModelConstant = PrimitiveType.DOUBLE, @PrimitiveType = true, @ReferenceType = false, @TypeImage = "double"] + | | | | +-- InfixExpression[@CompileTimeConstant = false, @Expression = true, @Operator = BinaryOp.EQ, @ParenthesisDepth = 0, @Parenthesized = false] + | | | | +-- VariableAccess[@AccessType = AccessType.READ, @CompileTimeConstant = false, @Expression = true, @Image = "c", @ParenthesisDepth = 0, @Parenthesized = false, @VariableName = "c"] + | | | | +-- ClassLiteral[@CompileTimeConstant = false, @Expression = true, @ParenthesisDepth = 0, @Parenthesized = false, @Void = false] + | | | | +-- PrimitiveType[@ArrayDepth = 0, @ArrayType = false, @Boolean = false, @ClassOrInterfaceType = false, @Image = "char", @ModelConstant = PrimitiveType.CHAR, @PrimitiveType = true, @ReferenceType = false, @TypeImage = "char"] + | | | +-- InfixExpression[@CompileTimeConstant = false, @Expression = true, @Operator = BinaryOp.EQ, @ParenthesisDepth = 0, @Parenthesized = false] + | | | +-- VariableAccess[@AccessType = AccessType.READ, @CompileTimeConstant = false, @Expression = true, @Image = "c", @ParenthesisDepth = 0, @Parenthesized = false, @VariableName = "c"] + | | | +-- ClassLiteral[@CompileTimeConstant = false, @Expression = true, @ParenthesisDepth = 0, @Parenthesized = false, @Void = false] + | | | +-- PrimitiveType[@ArrayDepth = 0, @ArrayType = false, @Boolean = false, @ClassOrInterfaceType = false, @Image = "byte", @ModelConstant = PrimitiveType.BYTE, @PrimitiveType = true, @ReferenceType = false, @TypeImage = "byte"] + | | +-- InfixExpression[@CompileTimeConstant = false, @Expression = true, @Operator = BinaryOp.EQ, @ParenthesisDepth = 0, @Parenthesized = false] + | | +-- VariableAccess[@AccessType = AccessType.READ, @CompileTimeConstant = false, @Expression = true, @Image = "c", @ParenthesisDepth = 0, @Parenthesized = false, @VariableName = "c"] + | | +-- ClassLiteral[@CompileTimeConstant = false, @Expression = true, @ParenthesisDepth = 0, @Parenthesized = false, @Void = true] + | +-- Block[@containsComment = false] + +-- IfStatement[@Else = false] + | +-- MethodCall[@CompileTimeConstant = false, @Expression = true, @Image = "equals", @MethodName = "equals", @ParenthesisDepth = 0, @Parenthesized = false] + | | +-- StringLiteral[@BooleanLiteral = false, @CharLiteral = false, @CompileTimeConstant = true, @ConstValue = "a", @DoubleLiteral = false, @Expression = true, @FloatLiteral = false, @Image = ""a"", @IntLiteral = false, @LongLiteral = false, @NullLiteral = false, @NumericLiteral = false, @ParenthesisDepth = 0, @Parenthesized = false, @StringLiteral = true, @TextBlock = false] + | | +-- ArgumentList[@ArgumentCount = 1] + | | +-- MethodCall[@CompileTimeConstant = false, @Expression = true, @Image = "getName", @MethodName = "getName", @ParenthesisDepth = 0, @Parenthesized = false] + | | +-- ClassLiteral[@CompileTimeConstant = false, @Expression = true, @ParenthesisDepth = 1, @Parenthesized = true, @Void = false] + | | | +-- PrimitiveType[@ArrayDepth = 0, @ArrayType = false, @Boolean = false, @ClassOrInterfaceType = false, @Image = "int", @ModelConstant = PrimitiveType.INT, @PrimitiveType = true, @ReferenceType = false, @TypeImage = "int"] + | | +-- ArgumentList[@ArgumentCount = 0] + | +-- Block[@containsComment = false] + +-- IfStatement[@Else = false] + +-- InfixExpression[@CompileTimeConstant = false, @Expression = true, @Operator = BinaryOp.CONDITIONAL_OR, @ParenthesisDepth = 0, @Parenthesized = false] + | +-- MethodCall[@CompileTimeConstant = false, @Expression = true, @Image = "equals", @MethodName = "equals", @ParenthesisDepth = 1, @Parenthesized = true] + | | +-- ClassLiteral[@CompileTimeConstant = false, @Expression = true, @ParenthesisDepth = 0, @Parenthesized = false, @Void = false] + | | | +-- ClassOrInterfaceType[@AnonymousClass = false, @ArrayDepth = 0, @ArrayType = false, @ClassOrInterfaceType = true, @Image = "Integer", @PrimitiveType = false, @ReferenceToClassSameCompilationUnit = false, @ReferenceType = true, @SimpleName = "Integer", @TypeImage = "Integer"] + | | +-- ArgumentList[@ArgumentCount = 1] + | | +-- VariableAccess[@AccessType = AccessType.READ, @CompileTimeConstant = false, @Expression = true, @Image = "clazz", @ParenthesisDepth = 0, @Parenthesized = false, @VariableName = "clazz"] + | +-- MethodCall[@CompileTimeConstant = false, @Expression = true, @Image = "equals", @MethodName = "equals", @ParenthesisDepth = 1, @Parenthesized = true] + | +-- ClassLiteral[@CompileTimeConstant = false, @Expression = true, @ParenthesisDepth = 0, @Parenthesized = false, @Void = false] + | | +-- PrimitiveType[@ArrayDepth = 0, @ArrayType = false, @Boolean = false, @ClassOrInterfaceType = false, @Image = "int", @ModelConstant = PrimitiveType.INT, @PrimitiveType = true, @ReferenceType = false, @TypeImage = "int"] + | +-- ArgumentList[@ArgumentCount = 1] + | +-- VariableAccess[@AccessType = AccessType.READ, @CompileTimeConstant = false, @Expression = true, @Image = "clazz", @ParenthesisDepth = 0, @Parenthesized = false, @VariableName = "clazz"] + +-- Block[@containsComment = false] diff --git a/pmd-lang-test/pom.xml b/pmd-lang-test/pom.xml index 910eda2842..2de8d05bb9 100644 --- a/pmd-lang-test/pom.xml +++ b/pmd-lang-test/pom.xml @@ -132,7 +132,7 @@ com.github.oowekyala.treeutils tree-matchers - 2.0.1 + 2.1.0 compile diff --git a/pmd-lang-test/src/main/kotlin/net/sourceforge/pmd/lang/ast/test/AstMatcherDslAdapter.kt b/pmd-lang-test/src/main/kotlin/net/sourceforge/pmd/lang/ast/test/AstMatcherDslAdapter.kt index 99ed28c236..419fafabff 100644 --- a/pmd-lang-test/src/main/kotlin/net/sourceforge/pmd/lang/ast/test/AstMatcherDslAdapter.kt +++ b/pmd-lang-test/src/main/kotlin/net/sourceforge/pmd/lang/ast/test/AstMatcherDslAdapter.kt @@ -4,6 +4,7 @@ package net.sourceforge.pmd.lang.ast.test +import com.github.oowekyala.treeutils.DoublyLinkedTreeLikeAdapter import com.github.oowekyala.treeutils.TreeLikeAdapter import com.github.oowekyala.treeutils.matchers.MatchingConfig import com.github.oowekyala.treeutils.matchers.TreeNodeWrapper @@ -12,10 +13,14 @@ import com.github.oowekyala.treeutils.printers.KotlintestBeanTreePrinter import net.sourceforge.pmd.lang.ast.Node /** An adapter for [baseShouldMatchSubtree]. */ -object NodeTreeLikeAdapter : TreeLikeAdapter { +object NodeTreeLikeAdapter : DoublyLinkedTreeLikeAdapter { override fun getChildren(node: Node): List = node.findChildrenOfType(Node::class.java) override fun nodeName(type: Class): String = type.simpleName.removePrefix("AST") + + override fun getParent(node: Node): Node? = node.parent + + override fun getChild(node: Node, index: Int): Node? = node.safeGetChild(index) } /** A subtree matcher written in the DSL documented on [TreeNodeWrapper]. */ diff --git a/pmd-lang-test/src/main/kotlin/net/sourceforge/pmd/lang/ast/test/BaseTreeDumpTest.kt b/pmd-lang-test/src/main/kotlin/net/sourceforge/pmd/lang/ast/test/BaseTreeDumpTest.kt new file mode 100644 index 0000000000..6bb0b4c8e1 --- /dev/null +++ b/pmd-lang-test/src/main/kotlin/net/sourceforge/pmd/lang/ast/test/BaseTreeDumpTest.kt @@ -0,0 +1,80 @@ +/* + * BSD-style license; for more info see http://pmd.sourceforge.net/license.html + */ + +package net.sourceforge.pmd.lang.ast.test + +import com.github.oowekyala.treeutils.printers.TreePrinter +import net.sourceforge.pmd.lang.ast.Node +import java.nio.file.Path +import java.nio.file.Paths +import kotlin.test.assertEquals + + +/** + * Compare a dump of a file against a saved baseline. + * + * @param printer The node printer used to dump the trees + * @param pathToFixtures Path to the test files within the directory of the test case + * @param extension Extension that the unparsed source file is supposed to have + */ +abstract class BaseTreeDumpTest( + val printer: TreePrinter, + val pathToFixtures: String, + val extension: String +) { + + /** + * Parses the given string into a node. + */ + abstract fun parseFile(fileText: String): Node + + + /** + * Executes the test. The test files are looked up in [pathToFixtures], + * in the resource directory *of the subclass*. + * The reference test file must be named [fileBaseName] + [ExpectedExt]. + * The source file to parse must be named [fileBaseName] + [extension]. + */ + fun doTest(fileBaseName: String) { + val expectedFile = findTestFile(javaClass, "$pathToFixtures/$fileBaseName$ExpectedExt").toFile() + val sourceFile = findTestFile(javaClass, "$pathToFixtures/$fileBaseName$extension").toFile() + + assert(sourceFile.isFile) { + "Source file $sourceFile is missing" + } + + val parsed = parseFile(sourceFile.readText()) // UTF-8 + val actual = printer.dumpSubtree(parsed) + + if (!expectedFile.exists()) { + expectedFile.writeText(actual) + throw AssertionError("Reference file $expectedFile doesn't exist, created it anyway") + } + + val expected = expectedFile.readText() + + assertEquals(expected, actual, "Tree dump comparison failed, see the reference: $expectedFile") + } + + // Outputting a path makes for better error messages + private val srcTestResources = let { + // this is set from maven surefire + System.getProperty("mvn.project.src.test.resources") + ?.let { Paths.get(it).toAbsolutePath() } + // that's for when the tests are run inside the IDE + ?: Paths.get(javaClass.protectionDomain.codeSource.location.file) + // go up from target/test-classes into the project root + .resolve("../../src/test/resources").normalize() + } + + private fun findTestFile(contextClass: Class<*>, resourcePath: String): Path { + val path = contextClass.`package`.name.replace('.', '/') + return srcTestResources.resolve("$path/$resourcePath") + } + + companion object { + const val ExpectedExt = ".txt" + } + +} diff --git a/pmd-lang-test/src/main/kotlin/net/sourceforge/pmd/lang/ast/test/NodePrinters.kt b/pmd-lang-test/src/main/kotlin/net/sourceforge/pmd/lang/ast/test/NodePrinters.kt new file mode 100644 index 0000000000..adc6c2d285 --- /dev/null +++ b/pmd-lang-test/src/main/kotlin/net/sourceforge/pmd/lang/ast/test/NodePrinters.kt @@ -0,0 +1,83 @@ +/* + * BSD-style license; for more info see http://pmd.sourceforge.net/license.html + */ + +package net.sourceforge.pmd.lang.ast.test + +import com.github.oowekyala.treeutils.printers.SimpleTreePrinter +import net.sourceforge.pmd.lang.ast.Node +import net.sourceforge.pmd.lang.ast.xpath.Attribute +import org.apache.commons.lang3.StringEscapeUtils + +/** + * Prints just the structure, like so: + * + * └── LocalVariableDeclaration + * ├── Type + * │ └── PrimitiveType + * └── VariableDeclarator + * ├── VariableDeclaratorId + * └── VariableInitializer + * └── 1 child not shown + * + */ +object SimpleNodePrinter : SimpleTreePrinter(NodeTreeLikeAdapter, UnicodeStrings) + +/** + * Prints all the XPath attributes of the node. + */ +object FullAttributePrinter : BaseNodeAttributePrinter() + + +open class RelevantAttributePrinter(stringConfig: StringConfig = UnicodeStrings) : BaseNodeAttributePrinter(stringConfig) { + + private val Ignored = setOf("BeginLine", "EndLine", "BeginColumn", "EndColumn", "FindBoundary", "SingleLine") + + override fun ignoreAttribute(node: Node, attribute: Attribute): Boolean = + Ignored.contains(attribute.name) || attribute.name == "Image" && attribute.value == null + +} + +/** + * Base attribute printer, subclass to filter attributes. + */ +open class BaseNodeAttributePrinter(stringConfig: StringConfig = UnicodeStrings) : SimpleTreePrinter(NodeTreeLikeAdapter, stringConfig) { + + protected open fun ignoreAttribute(node: Node, attribute: Attribute): Boolean = true + + override fun StringBuilder.appendSingleNode(node: Node): StringBuilder { + + append(node.xPathNodeName) + + return node.xPathAttributesIterator + .asSequence() + // sort to get deterministic results + .sortedBy { it.name } + .filterNot { ignoreAttribute(node, it) } + .joinTo(buffer = this, prefix = "[", postfix = "]") { + "@${it.name} = ${valueToString(it.value)}" + } + } + + protected open fun valueToString(value: Any?): String? { + return when (value) { + is String -> "\"" + StringEscapeUtils.unescapeJava(value) + "\"" + is Char -> '\''.toString() + value.toString().replace("'".toRegex(), "\\'") + '\''.toString() + is Enum<*> -> value.enumDeclaringClass.simpleName + "." + value.name + is Class<*> -> value.canonicalName?.let { "$it.class" } + is Number, is Boolean, null -> value.toString() + else -> null + } + } + + private val Enum<*>.enumDeclaringClass: Class<*> + get() = this.javaClass.let { + when { + it.isEnum -> it + else -> it.enclosingClass.takeIf { it.isEnum } + ?: throw IllegalStateException() + } + } + +} + diff --git a/pom.xml b/pom.xml index 1dfe7db0e1..3252464717 100644 --- a/pom.xml +++ b/pom.xml @@ -256,6 +256,9 @@ once alphabetical + + ${project.basedir}/src/test/resources +