==================================
while statement
==================================

class WhileDemo {
    void main(String args){
        int count = 1;
        while (count < 11) {
            System.out.println("Count is: " + count);
            count++;
        }
    }
}

---

(program
  (class_definition
    name: (identifier)
    body: (class_body
      (method_signature
        (function_signature
          (void_type)
          name: (identifier)
          (formal_parameter_list
            (formal_parameter
              (type_identifier)
              name: (identifier)))))
      (function_body
        (block
          (local_variable_declaration
            (initialized_variable_definition
              (type_identifier)
              name: (identifier)
              value: (decimal_integer_literal)))
          (while_statement
            condition: (parenthesized_expression
              (relational_expression
                (identifier)
                (relational_operator)
                (decimal_integer_literal)))
            body: (block
              (expression_statement
                (identifier)
                (selector
                  (unconditional_assignable_selector
                    (identifier)))
                (selector
                  (unconditional_assignable_selector
                    (identifier)))
                (selector
                  (argument_part
                    (arguments
                      (argument
                        (additive_expression
                          (string_literal)
                          (additive_operator)
                          (identifier)))))))
              (expression_statement
                (postfix_expression
                  (assignable_expression
                    (identifier))
                  (postfix_operator
                    (increment_operator)))))))))))

==================================
try-with-resources statements
==================================


get a {
var a;
    try {
          int data = input.read();
    } on Exception catch (e) {
        a();
    }
}

---

(program
  (getter_signature
    name: (identifier))
  (function_body
    (block
      (local_variable_declaration
        (initialized_variable_definition
          (inferred_type)
          name: (identifier)))
      (try_statement
        body: (block
          (local_variable_declaration
            (initialized_variable_definition
              (type_identifier)
              name: (identifier)
              value: (identifier)
              value: (selector
                (unconditional_assignable_selector
                  (identifier)))
              value: (selector
                (argument_part
                  (arguments))))))
        (type_identifier)
        (catch_clause
          (catch_parameters
            (identifier)))
        (block
          (expression_statement
            (method_invocation
              function: (identifier)
              arguments: (argument_part
                (arguments)))))))))

==================================
return statement
==================================

main() {
  return x;
  return x * y;
  return x + 2;
  return fire(x);
}

---

(program
  (function_signature
    (identifier)
    (formal_parameter_list))
  (function_body
    (block
      (return_statement
        (identifier))
      (return_statement
        (multiplicative_expression
          (identifier)
          (multiplicative_operator)
          (identifier)))
      (return_statement
        (additive_expression
          (identifier)
          (additive_operator)
          (decimal_integer_literal)))
      (return_statement
        (method_invocation
          (identifier)
          (argument_part
            (arguments
              (argument
                (identifier)))))))))

==================================
annotation
==================================

@SuppressWarnings(value = "unchecked")
@GwtCompatible(emulated = true)
class Duck {

}

---

(program
  (class_definition
    (annotation
      (identifier)
      (arguments
        (argument
          (assignment_expression
            (assignable_expression
              (identifier))
            (string_literal)))))
    (annotation
      (identifier)
      (arguments
        (argument
          (assignment_expression
            (assignable_expression
              (identifier))
            (true)))))
    (identifier)
    (class_body)))

==================================
marker annotation
==================================

@Override
class Quack {
  @bar
  void foo() {

  }
}

---

(program
  (class_definition
    (annotation
      (identifier))
    (identifier)
    (class_body
      (annotation
        (identifier))
      (method_signature
        (function_signature
          (void_type)
          (identifier)
          (formal_parameter_list)))
      (function_body
        (block)))))

==================================
single element annotation
==================================

@Duck(waddle.swim)
@SuppressWarnings("unchecked")
class Quack {

}

---

(program
  (class_definition
    (annotation
      (identifier)
      (arguments
        (argument
          (identifier)
          (selector
            (unconditional_assignable_selector
              (identifier))))))
    (annotation
      (identifier)
      (arguments
        (argument
          (string_literal))))
    (identifier)
    (class_body)))

==================================
lambda expression
==================================

class LambdaTest {
  void singleton() {
    var b = (Str version) => create;
    var d = (Str a) {
     int destinysChild = 2;
     };
  }
}

---

(program
  (class_definition
    (identifier)
    (class_body
      (method_signature
        (function_signature
          (void_type)
          (identifier)
          (formal_parameter_list)))
      (function_body
        (block
          (local_variable_declaration
            (initialized_variable_definition
              (inferred_type)
              (identifier)
              (function_expression
                (formal_parameter_list
                  (formal_parameter
                    (type_identifier)
                    (identifier)))
                (function_expression_body
                  (identifier)))))
          (local_variable_declaration
            (initialized_variable_definition
              (inferred_type)
              (identifier)
              (function_expression
                (formal_parameter_list
                  (formal_parameter
                    (type_identifier)
                    (identifier)))
                (function_expression_body
                  (block
                    (local_variable_declaration
                      (initialized_variable_definition
                        (type_identifier)
                        (identifier)
                        (decimal_integer_literal)))))))))))))

==================================
switch statement
==================================

class SwitchDemo {
  static void main(String args) {
    int destinysChild = 2;
    String destinysChildString;
    switch (destinysChild) {
        case 1:  destinysChildString = "Beyonce";
                 break;
        case 2:  destinysChildString = "Kelly";
                 break;
        case 3:  destinysChildString = "Michelle";
                 break;
        default: destinysChildString = "Invalid";
                 break;
    }
    System.out.println(destinysChildString);
  }
}

---

(program
  (class_definition
    name: (identifier)
    body: (class_body
      (method_signature
        (function_signature
          (void_type)
          name: (identifier)
          (formal_parameter_list
            (formal_parameter
              (type_identifier)
              name: (identifier)))))
      (function_body
        (block
          (local_variable_declaration
            (initialized_variable_definition
              (type_identifier)
              name: (identifier)
              value: (decimal_integer_literal)))
          (local_variable_declaration
            (initialized_variable_definition
              (type_identifier)
              name: (identifier)))
          (switch_statement
            condition: (parenthesized_expression
              (identifier))
            body: (switch_block
              (switch_statement_case
                (case_builtin)
                (constant_pattern
                  (decimal_integer_literal))
                (expression_statement
                  (assignment_expression
                    left: (assignable_expression
                      (identifier))
                    right: (string_literal)))
                (break_statement
                  (break_builtin)))
              (switch_statement_case
                (case_builtin)
                (constant_pattern
                  (decimal_integer_literal))
                (expression_statement
                  (assignment_expression
                    left: (assignable_expression
                      (identifier))
                    right: (string_literal)))
                (break_statement
                  (break_builtin)))
              (switch_statement_case
                (case_builtin)
                (constant_pattern
                  (decimal_integer_literal))
                (expression_statement
                  (assignment_expression
                    left: (assignable_expression
                      (identifier))
                    right: (string_literal)))
                (break_statement
                  (break_builtin)))
              (switch_statement_default
                (expression_statement
                  (assignment_expression
                    left: (assignable_expression
                      (identifier))
                    right: (string_literal)))
                (break_statement
                  (break_builtin)))))
          (expression_statement
            (identifier)
            (selector
              (unconditional_assignable_selector
                (identifier)))
            (selector
              (unconditional_assignable_selector
                (identifier)))
            (selector
              (argument_part
                (arguments
                  (argument
                    (identifier)))))))))))

==================================
type arguments
==================================

class Box <T> {
  T theObject;
  Box( T arg) { theObject = arg; }
  // more code
}

---

(program
  (class_definition
    (identifier)
    (type_parameters
      (type_parameter
        (type_identifier)))
    (class_body
      (declaration
        (type_identifier)
        (initialized_identifier_list
          (initialized_identifier
            (identifier))))
      (method_signature
        (constructor_signature
          (identifier)
          (formal_parameter_list
            (formal_parameter
              (type_identifier)
              (identifier)))))
      (function_body
        (block
          (expression_statement
            (assignment_expression
              (assignable_expression
                (identifier))
              (identifier)))))
      (comment))))

==================================
wildcard
==================================

class WildcardDemo {
  List<B> a;
}

---

(program
  (class_definition
    (identifier)
    (class_body
      (declaration
        (type_identifier)
        (type_arguments
          (type_identifier))
        (initialized_identifier_list
          (initialized_identifier
            (identifier)))))))

==================================
type arguments with generic types
==================================

class someClass <T> {
  List<T> someMethod() {
     List< T > list = Collections.emptyList<S>();
     emptyList<S, H>(g);
     return list;
  }
  void anotherMethod<T>(S arg) {
     List< S > list = Collections.emptyList<S>();
  }
}

---

(program
  (class_definition
    (identifier)
    (type_parameters
      (type_parameter
        (type_identifier)))
    (class_body
      (method_signature
        (function_signature
          (type_identifier)
          (type_arguments
            (type_identifier))
          (identifier)
          (formal_parameter_list)))
      (function_body
        (block
          (local_variable_declaration
            (initialized_variable_definition
              (type_identifier)
              (type_arguments
                (type_identifier))
              (identifier)
              (identifier)
              (selector
                (unconditional_assignable_selector
                  (identifier)))
              (selector
                (argument_part
                  (type_arguments
                    (type_identifier))
                  (arguments)))))
          (expression_statement
            (method_invocation
              (identifier)
              (argument_part
                (type_arguments
                  (type_identifier)
                  (type_identifier))
                (arguments
                  (argument
                    (identifier))))))
          (return_statement
            (identifier))))
      (method_signature
        (function_signature
          (void_type)
          (identifier)
          (type_parameters
            (type_parameter
              (type_identifier)))
          (formal_parameter_list
            (formal_parameter
              (type_identifier)
              (identifier)))))
      (function_body
        (block
          (local_variable_declaration
            (initialized_variable_definition
              (type_identifier)
              (type_arguments
                (type_identifier))
              (identifier)
              (identifier)
              (selector
                (unconditional_assignable_selector
                  (identifier)))
              (selector
                (argument_part
                  (type_arguments
                    (type_identifier))
                  (arguments))))))))))

==================================
empty type arguments
==================================

Box<Integer> integerBox = new Box<>();

---

(program
  (type_identifier)
  (type_arguments
    (type_identifier))
  (initialized_identifier_list
    (initialized_identifier
      (identifier)
      (new_expression
        (type_identifier)
        (type_arguments)
        (arguments)))))
