# local variable

class A {
  public int b() {
    int c = 5;
  }
}

==>

Program(
  ClassDeclaration(class,
    Definition,
    ClassBody(
      MethodDeclaration(
        Modifiers(public),
        PrimitiveType,
        Definition,
        FormalParameters,
        Block(
          LocalVariableDeclaration(
            PrimitiveType,
            VariableDeclarator(
              Definition,
              AssignOp,
              IntegerLiteral)))))))


# local array variable

String[] nodeNames = internalCluster().getNodeNames();
Integer[][] inputArrays = new Integer[0x100][];

==>

Program(
  LocalVariableDeclaration(
    ArrayType(
      TypeName,
      Dimension),
    VariableDeclarator(
      Definition,
      AssignOp,
      MethodInvocation(
        MethodInvocation(
          MethodName(Identifier),
          ArgumentList),
        MethodName(Identifier),
        ArgumentList))),
  LocalVariableDeclaration(
    ArrayType(
      TypeName,
      Dimension, Dimension),
    VariableDeclarator(
      Definition,
      AssignOp,
      ArrayCreationExpression(new,
        TypeName,
        Dimension(IntegerLiteral),
        Dimension))))


# module

module com.foo { }
open module com.foo { }

==>

Program(
  ModuleDeclaration(module,
    ScopedIdentifier(
      Identifier,
      Identifier),
    ModuleBody),
  ModuleDeclaration(open, module,
    ScopedIdentifier(
      Identifier,
      Identifier),
    ModuleBody))


# module with normal annotation

@RequestForEnhancement(
    id       = 2868724,
    synopsis = "Provide time-travel functionality",
    engineer = "Mr. Peabody",
    date     = "4/1/2004"
)
module com.foo { }

==>

Program(
  ModuleDeclaration(
    Annotation(
      Identifier,
      AnnotationArgumentList(
        ElementValuePair(Identifier, AssignOp, IntegerLiteral),
        ElementValuePair(Identifier, AssignOp, StringLiteral),
        ElementValuePair(Identifier, AssignOp, StringLiteral),
        ElementValuePair(Identifier, AssignOp, StringLiteral))),
    module,
    ScopedIdentifier(Identifier, Identifier),
    ModuleBody))


# module with marker annotation

@Preliminary module com.foo { }
@Preliminary open module com.foo { }

==>

Program(
  ModuleDeclaration(
    MarkerAnnotation(Identifier),
    module,
    ScopedIdentifier(Identifier, Identifier),
    ModuleBody),
  ModuleDeclaration(
    MarkerAnnotation(Identifier),
    open, module,
    ScopedIdentifier(Identifier, Identifier),
    ModuleBody))


# module with single element annotation

@Copyright("a")
module com.foo {}

==>

Program(
  ModuleDeclaration(
    Annotation(
      Identifier,
      AnnotationArgumentList(StringLiteral)),
    module,
    ScopedIdentifier(
      Identifier,
      Identifier),
    ModuleBody))


# package_declaration

package myVector;

==>

Program(PackageDeclaration(package,Identifier))

# module directive

module com.example.foo {
    requires com.example.foo.http;
}

==>

Program(
  ModuleDeclaration(module,
    ScopedIdentifier(
      ScopedIdentifier(
        Identifier,
        Identifier),
      Identifier),
    ModuleBody(
      ModuleDirective(requires,
        ScopedIdentifier(
          ScopedIdentifier(
            ScopedIdentifier(
              Identifier,
              Identifier),
            Identifier),
          Identifier)))))


# module directive with requires, exports, opens, uses and provides

module com.example.foo {
    requires com.example.http;
    requires java.logging;

    requires transitive com.example.network;

    exports com.example.bar;
    exports com.example.internal to com.example.probe;

    opens com.example.quux;
    opens com.example.internal to com.example.network, com.example.probe;

    uses com.example.Intf;
    provides com.example.Intf with com.example.Impl;
}

==>

Program(
  ModuleDeclaration(module,
    ScopedIdentifier(ScopedIdentifier(Identifier, Identifier), Identifier),
    ModuleBody(
      ModuleDirective(requires,
        ScopedIdentifier(ScopedIdentifier(Identifier, Identifier), Identifier)),
      ModuleDirective(requires,
        ScopedIdentifier(Identifier, Identifier)),
      ModuleDirective(requires, transitive,
        ScopedIdentifier(ScopedIdentifier(Identifier, Identifier), Identifier)),
      ModuleDirective(exports,
        ScopedIdentifier(ScopedIdentifier(Identifier, Identifier), Identifier)),
      ModuleDirective(exports,
        ScopedIdentifier(ScopedIdentifier(Identifier, Identifier), Identifier),
        to, ScopedIdentifier(ScopedIdentifier(Identifier, Identifier), Identifier)),
      ModuleDirective(opens,
        ScopedIdentifier(ScopedIdentifier(Identifier, Identifier), Identifier)),
      ModuleDirective(opens,
        ScopedIdentifier(ScopedIdentifier(Identifier, Identifier), Identifier),
        to, ScopedIdentifier(ScopedIdentifier(Identifier, Identifier), Identifier),
        ScopedIdentifier(ScopedIdentifier(Identifier, Identifier), Identifier)),
      ModuleDirective(uses,
        ScopedIdentifier(ScopedIdentifier(Identifier, Identifier), Identifier)),
      ModuleDirective(provides,
        ScopedIdentifier(ScopedIdentifier(Identifier, Identifier), Identifier),
        with, ScopedIdentifier(ScopedIdentifier(Identifier, Identifier), Identifier)))))


# single type import declaration

import java.util.Vector;

==>

Program(ImportDeclaration(import,
  ScopedIdentifier(ScopedIdentifier(Identifier, Identifier), Identifier)))


# type_import_on_declaraction

import java.util.*;

==>

Program(ImportDeclaration(import,
  ScopedIdentifier(Identifier, Identifier), Asterisk))


# single static import declaration

import static java.util.Vector;

==>

Program(ImportDeclaration(import, static,
  ScopedIdentifier(
    ScopedIdentifier(Identifier, Identifier),
    Identifier)))


# static import on demand declaration

import static java.util.*;

==>

Program(ImportDeclaration(import, static,
  ScopedIdentifier(Identifier, Identifier),
  Asterisk))


# class declaration

class Point {
}

==>

Program(
  ClassDeclaration(class, Definition, ClassBody))


# class declaration involving public, private, abstract and superclass

public class Point {
}

private class Point {
}

abstract class ColoredPoint extends Point {
}

==>

Program(
  ClassDeclaration(Modifiers(public), class, Definition, ClassBody),
  ClassDeclaration(Modifiers(private), class, Definition, ClassBody),
  ClassDeclaration(Modifiers(abstract), class, Definition, Superclass(extends, TypeName), ClassBody))


# class declaration with implements

public class Dog implements ISpeak {
}

==>

Program(
  ClassDeclaration(
     Modifiers(public), class, Definition,
     SuperInterfaces(implements,InterfaceTypeList(TypeName)), ClassBody))


# class declaration with body

class Point {
  int x;

  void bar() {
    x = 2;
  }
}

==>

Program(
  ClassDeclaration(class,
    Definition,
    ClassBody(
      FieldDeclaration(
        PrimitiveType,
        VariableDeclarator(Definition)),
      MethodDeclaration(
        void,
        Definition,
        FormalParameters,
        Block(
          ExpressionStatement(
            AssignmentExpression(Identifier, AssignOp, IntegerLiteral)))))))


# interface declaration

interface Top {
}

==>

Program(
  InterfaceDeclaration(
    interface,
    Definition,
    InterfaceBody))


# interface declaration with extends

interface Left extends Top {
}

interface Bottom extends Left, Right {}

==>

Program(
  InterfaceDeclaration(
    interface,
    Definition,
    ExtendsInterfaces(extends,InterfaceTypeList(TypeName)),
    InterfaceBody),
  InterfaceDeclaration(
    interface,
    Definition,
    ExtendsInterfaces(extends,InterfaceTypeList(TypeName, TypeName)), InterfaceBody))


# interface with annotation type declaration

@interface SelfRef {}

==>

Program(
  AnnotationTypeDeclaration(Identifier, AnnotationTypeBody))


# method declaration

class Beyonce {
  void calculateAnswer(double wingSpan, int numberOfEngines,
                       double length, double grossTons) {
      //do the calculation here
  }
}

==>

Program(
  ClassDeclaration(class,
    Definition,
    ClassBody(
      MethodDeclaration(
        void,
        Definition,
        FormalParameters(
          FormalParameter(PrimitiveType, Definition),
          FormalParameter(PrimitiveType, Definition),
          FormalParameter(PrimitiveType, Definition),
          FormalParameter(PrimitiveType, Definition)),
        Block(LineComment)))))


# constructor declaration

class Point {
  int x, y;
  Point(int x, int y) {
    this.x = x;
    this.y = y;
  }

  Point() {
    this(0, 0);
  }
}

==>

Program(
  ClassDeclaration(class,
    Definition,
    ClassBody(
      FieldDeclaration(
        PrimitiveType,
        VariableDeclarator(Definition),
        VariableDeclarator(Definition)),
      ConstructorDeclaration(
        Definition,
        FormalParameters(
          FormalParameter(
            PrimitiveType,
            Definition),
          FormalParameter(
            PrimitiveType,
            Definition)),
        ConstructorBody(
          ExpressionStatement(AssignmentExpression(
            FieldAccess(
              this,
              Identifier),
            AssignOp,
            Identifier)),
          ExpressionStatement(AssignmentExpression(
            FieldAccess(
              this,
              Identifier),
            AssignOp,
            Identifier)))),
      ConstructorDeclaration(
        Definition,
        FormalParameters,
        ConstructorBody(
          ExplicitConstructorInvocation(
            this,
            ArgumentList(
              IntegerLiteral,
              IntegerLiteral)))))))


# throws

class Beyonce {
  BufferedReader newReader() throws FileNotFoundException {
    new BufferedReader(new InputStreamReader(new FileInputStream(file), charset));
  }
}

==>

Program(
  ClassDeclaration(class,
    Definition,
      ClassBody(
        MethodDeclaration(
          TypeName,
          Definition,
          FormalParameters,
          Throws(throws,TypeName),
          Block(
            ExpressionStatement(
              ObjectCreationExpression(new,
                TypeName,
                ArgumentList(
                  ObjectCreationExpression(new,
                    TypeName,
                    ArgumentList(
                      ObjectCreationExpression(new,
                        TypeName,
                        ArgumentList(Identifier)),
                      Identifier))))))))))


# object instantiation

class Point {
  public double Foo() {
    new BufferedWriter();
    Foo.new BufferedWriter();
  }
}

==>

Program(
  ClassDeclaration(class,
    Definition,
    ClassBody(
      MethodDeclaration(
        Modifiers(public),
        PrimitiveType,
        Definition,
        FormalParameters,
        Block(
          ExpressionStatement(
            ObjectCreationExpression(new,
              TypeName,
              ArgumentList)),
          ExpressionStatement(
            ObjectCreationExpression(
              Identifier, new,
              TypeName,
              ArgumentList)))))))


# variable declaration

class JayZ {
  public void Beyonce() {
    int blue_ivy_carter;
  };
}

==>

Program(
  ClassDeclaration(class,
    Definition,
    ClassBody(
      MethodDeclaration(
        Modifiers(public),
        void,
        Definition,
        FormalParameters,
        Block(
          LocalVariableDeclaration(
            PrimitiveType,
            VariableDeclarator(Definition)))))))


# enum declaration

enum HandSign {
   SCISSOR, PAPER, STONE
}

==>

Program(
  EnumDeclaration(enum,
    Definition,
    EnumBody(
      EnumConstant(Definition),
      EnumConstant(Definition),
      EnumConstant(Definition))))

