===========
expressions
===========

void Test() {
    i = 2;
    i += 5;
    i -= size;
    i *= -1;
    i /= 2 + 10;
    a[1] ^= 2;
    i |= 2;
    i &= 1001;
    i ~= 0110;
    i <<= 2;
    i >>= 2;
}

---

(source_file
  (function_definition
    returnType: (type
      (builtin_type)
    )
    name: (identifier)
    parameters: (parameter_declarations)
    body: (block
      (expression_statement
        (assignment_expression
          left: (identifier)
          right: (int_literal)
        )
      )
      (expression_statement
        (assignment_expression
          left: (identifier)
          right: (int_literal)
        )
      )
      (expression_statement
        (assignment_expression
          left: (identifier)
          right: (identifier)
        )
      )
      (expression_statement
        (assignment_expression
          left: (identifier)
          right: (unary_expression
            argument: (int_literal)
          )
        )
      )
      (expression_statement
        (assignment_expression
          left: (identifier)
          right: (binary_expression
            left: (int_literal)
            right: (int_literal)
          )
        )
      )
      (expression_statement
        (assignment_expression
          left: (array_indexed_access
            array: (identifier)
            index: (int_literal)
          )
          right: (int_literal)
        )
      )
      (expression_statement
        (assignment_expression
          left: (identifier)
          right: (int_literal)
        )
      )
      (expression_statement
        (assignment_expression
          left: (identifier)
          right: (int_literal)
        )
      )
      (expression_statement
        (assignment_expression
          left: (identifier)
          right: (int_literal)
        )
      )
      (expression_statement
        (assignment_expression
          left: (identifier)
          right: (int_literal)
        )
      )
      (expression_statement
        (assignment_expression
          left: (identifier)
          right: (int_literal)
        )
      )
    )
  )
)


============
new operator
============

void Test() {
    a = new char[size];
    b = new MethodMap();

    (new HTTPRequest(szUrl)).Get(HTTPRequest_CheckServer);
}

---

(source_file
  (function_definition
    returnType: (type
      (builtin_type)
    )
    name: (identifier)
    parameters: (parameter_declarations)
    body: (block
      (expression_statement
        (assignment_expression
          left: (identifier)
          right: (dynamic_array
            type: (builtin_type)
            (fixed_dimension
              (identifier)
            )
          )
        )
      )
      (expression_statement
        (assignment_expression
          left: (identifier)
          right: (new_expression
            class: (identifier)
            arguments: (call_arguments)
          )
        )
      )
      (expression_statement
        (call_expression
          function: (field_access
            target: (parenthesized_expression
              expression: (new_expression
                class: (identifier)
                arguments: (call_arguments
                  (identifier)
                )
              )
            )
            field: (identifier)
          )
          arguments: (call_arguments
            (identifier)
          )
        )
      )
    )
  )
)


====================
indexed array access
====================

void Test() {
    clients[2] = 14;
    clients[client] = Math_GetRandomInt(100, 300);
}

---

(source_file
  (function_definition
    returnType: (type
      (builtin_type)
    )
    name: (identifier)
    parameters: (parameter_declarations)
    body: (block
      (expression_statement
        (assignment_expression
          left: (array_indexed_access
            array: (identifier)
            index: (int_literal)
          )
          right: (int_literal)
        )
      )
      (expression_statement
        (assignment_expression
          left: (array_indexed_access
            array: (identifier)
            index: (identifier)
          )
          right: (call_expression
            function: (identifier)
            arguments: (call_arguments
              (int_literal)
              (int_literal)
            )
          )
        )
      )
    )
  )
)


========================
assignment as expression
========================

void Test() {
    if ((a = Test()) != 0) return;
    a = b = 2;
}

---

(source_file
  (function_definition
    returnType: (type
      (builtin_type)
    )
    name: (identifier)
    parameters: (parameter_declarations)
    body: (block
      (condition_statement
        condition: (binary_expression
          left: (parenthesized_expression
            expression: (assignment_expression
              left: (identifier)
              right: (call_expression
                function: (identifier)
                arguments: (call_arguments)
              )
            )
          )
          right: (int_literal)
        )
        truePath: (return_statement)
      )
      (expression_statement
        (assignment_expression
          left: (identifier)
          right: (assignment_expression
            left: (identifier)
            right: (int_literal)
          )
        )
      )
    )
  )
)
