==================
Required positional parameters
==================

void positional(int a, int b) {}

---

(program
  (function_declaration
    (function_signature
      (void_type)
      (identifier)
      (formal_parameter_list
        (formal_parameter
          (type_identifier)
          (identifier))
        (formal_parameter
          (type_identifier)
          (identifier))))
    (function_body
      (block))))

==================
Optional positional parameters with defaults
==================

void optionalPositional(int a, [int b = 0, int c = 0]) {}

---

(program
  (function_declaration
    (function_signature
      (void_type)
      (identifier)
      (formal_parameter_list
        (formal_parameter
          (type_identifier)
          (identifier))
        (optional_formal_parameters
          (formal_parameter
            (type_identifier)
            (identifier))
          (decimal_integer_literal)
          (formal_parameter
            (type_identifier)
            (identifier))
          (decimal_integer_literal))))
    (function_body
      (block))))

==================
Named parameters with defaults
==================

void named({int a = 0, int b = 0}) {}

---

(program
  (function_declaration
    (function_signature
      (void_type)
      (identifier)
      (formal_parameter_list
        (optional_formal_parameters
          (formal_parameter
            (type_identifier)
            (identifier))
          (decimal_integer_literal)
          (formal_parameter
            (type_identifier)
            (identifier))
          (decimal_integer_literal))))
    (function_body
      (block))))

==================
Required named parameter
==================

void requiredNamed({required int a, int b = 0}) {}

---

(program
  (function_declaration
    (function_signature
      (void_type)
      (identifier)
      (formal_parameter_list
        (optional_formal_parameters
          (formal_parameter
            (type_identifier)
            (identifier))
          (formal_parameter
            (type_identifier)
            (identifier))
          (decimal_integer_literal))))
    (function_body
      (block))))

==================
Simple positional call
==================

void main() {
  positional(1, 2);
}

---

(program
  (function_declaration
    (function_signature
      (void_type)
      (identifier)
      (formal_parameter_list))
    (function_body
      (block
        (expression_statement
          (method_invocation
            (identifier)
            (argument_part
              (arguments
                (argument
                  (decimal_integer_literal))
                (argument
                  (decimal_integer_literal))))))))))

==================
Single positional argument
==================

void main() {
  optionalPositional(1);
}

---

(program
  (function_declaration
    (function_signature
      (void_type)
      (identifier)
      (formal_parameter_list))
    (function_body
      (block
        (expression_statement
          (method_invocation
            (identifier)
            (argument_part
              (arguments
                (argument
                  (decimal_integer_literal))))))))))

==================
Multiple positional arguments
==================

void main() {
  optionalPositional(1, 2, 3);
}

---

(program
  (function_declaration
    (function_signature
      (void_type)
      (identifier)
      (formal_parameter_list))
    (function_body
      (block
        (expression_statement
          (method_invocation
            (identifier)
            (argument_part
              (arguments
                (argument
                  (decimal_integer_literal))
                (argument
                  (decimal_integer_literal))
                (argument
                  (decimal_integer_literal))))))))))

==================
Named arguments
==================

void main() {
  named(a: 1, b: 2);
}

---

(program
  (function_declaration
    (function_signature
      (void_type)
      (identifier)
      (formal_parameter_list))
    (function_body
      (block
        (expression_statement
          (method_invocation
            (identifier)
            (argument_part
              (arguments
                (named_argument
                  (label
                    (identifier))
                  (decimal_integer_literal))
                (named_argument
                  (label
                    (identifier))
                  (decimal_integer_literal))))))))))

==================
Single named argument
==================

void main() {
  requiredNamed(a: 1);
}

---

(program
  (function_declaration
    (function_signature
      (void_type)
      (identifier)
      (formal_parameter_list))
    (function_body
      (block
        (expression_statement
          (method_invocation
            (identifier)
            (argument_part
              (arguments
                (named_argument
                  (label
                    (identifier))
                  (decimal_integer_literal))))))))))

==================
Call with no arguments
==================

void main() {
  noArgs();
}

---

(program
  (function_declaration
    (function_signature
      (void_type)
      (identifier)
      (formal_parameter_list))
    (function_body
      (block
        (expression_statement
          (method_invocation
            (identifier)
            (argument_part
              (arguments))))))))

==================
Nested call as argument
==================

void main() {
  outer(1, inner(2));
}

---

(program
  (function_declaration
    (function_signature
      (void_type)
      (identifier)
      (formal_parameter_list))
    (function_body
      (block
        (expression_statement
          (method_invocation
            (identifier)
            (argument_part
              (arguments
                (argument
                  (decimal_integer_literal))
                (argument
                  (method_invocation
                    (identifier)
                    (argument_part
                      (arguments
                        (argument
                          (decimal_integer_literal))))))))))))))

==================
Trailing comma in arguments
==================

void main() {
  positional(1, 2,);
}

---

(program
  (function_declaration
    (function_signature
      (void_type)
      (identifier)
      (formal_parameter_list))
    (function_body
      (block
        (expression_statement
          (method_invocation
            (identifier)
            (argument_part
              (arguments
                (argument
                  (decimal_integer_literal))
                (argument
                  (decimal_integer_literal))))))))))

==================
Method call on identifier
==================

void main() {
  hello.greet();
}

---

(program
  (function_declaration
    (function_signature
      (void_type)
      (identifier)
      (formal_parameter_list))
    (function_body
      (block
        (expression_statement
          (method_invocation
            (unconditional_assignable_selector
              (identifier)
              (assignable_operator)
              (identifier))
            (argument_part
              (arguments))))))))

==================
Null-aware method call
==================

void main() {
  obj?.method();
}

---

(program
  (function_declaration
    (function_signature
      (void_type)
      (identifier)
      (formal_parameter_list))
    (function_body
      (block
        (expression_statement
          (method_invocation
            (conditional_assignable_selector
              (identifier)
              (assignable_operator)
              (identifier))
            (argument_part
              (arguments))))))))

==================
Method call on a call expression
==================

void main() {
  person().hi();
}

---

(program
  (function_declaration
    (function_signature
      (void_type)
      (identifier)
      (formal_parameter_list))
    (function_body
      (block
        (expression_statement
          (method_invocation
            (unconditional_assignable_selector
              (method_invocation
                (identifier)
                (argument_part
                  (arguments)))
              (assignable_operator)
              (identifier))
            (argument_part
              (arguments))))))))

==================
Chained method calls nest left-associatively
==================

void main() {
  obj.a().b();
}

---

(program
  (function_declaration
    (function_signature
      (void_type)
      (identifier)
      (formal_parameter_list))
    (function_body
      (block
        (expression_statement
          (method_invocation
            (unconditional_assignable_selector
              (method_invocation
                (unconditional_assignable_selector
                  (identifier)
                  (assignable_operator)
                  (identifier))
                (argument_part
                  (arguments)))
              (assignable_operator)
              (identifier))
            (argument_part
              (arguments))))))))

==================
Chained call after an unnamed constructor
==================

void main() {
  Random.new().nextInt(256);
}

---

(program
  (function_declaration
    (function_signature
      (void_type)
      (identifier)
      (formal_parameter_list))
    (function_body
      (block
        (expression_statement
          (method_invocation
            (unconditional_assignable_selector
              (method_invocation
                (unconditional_assignable_selector
                  (identifier)
                  (assignable_operator)
                  (identifier))
                (argument_part
                  (arguments)))
              (assignable_operator)
              (identifier))
            (argument_part
              (arguments
                (argument
                  (decimal_integer_literal))))))))))

==================
Mixed positional and named arguments
==================

void main() {
  mixed(1, name: 2);
}

---

(program
  (function_declaration
    (function_signature
      (void_type)
      (identifier)
      (formal_parameter_list))
    (function_body
      (block
        (expression_statement
          (method_invocation
            (identifier)
            (argument_part
              (arguments
                (argument
                  (decimal_integer_literal))
                (named_argument
                  (label
                    (identifier))
                  (decimal_integer_literal))))))))))

==================
Method call on super
==================

void main() {
  super.turnOn();
}

---

(program
  (function_declaration
    (function_signature
      (void_type)
      (identifier)
      (formal_parameter_list))
    (function_body
      (block
        (expression_statement
          (method_invocation
            (unconditional_assignable_selector
              (super)
              (assignable_operator)
              (identifier))
            (argument_part
              (arguments))))))))

==================
Method call on index expression
==================

void main() {
  items[0].clear();
}

---

(program
  (function_declaration
    (function_signature
      (void_type)
      (identifier)
      (formal_parameter_list))
    (function_body
      (block
        (expression_statement
          (method_invocation
            (unconditional_assignable_selector
              (unconditional_assignable_selector
                (identifier)
                (index_selector
                  (decimal_integer_literal)))
              (assignable_operator)
              (identifier))
            (argument_part
              (arguments))))))))

==================
Method call on multi-segment field access
==================

void main() {
  a.b.c();
}

---

(program
  (function_declaration
    (function_signature
      (void_type)
      (identifier)
      (formal_parameter_list))
    (function_body
      (block
        (expression_statement
          (method_invocation
            (unconditional_assignable_selector
              (unconditional_assignable_selector
                (identifier)
                (assignable_operator)
                (identifier))
              (assignable_operator)
              (identifier))
            (argument_part
              (arguments))))))))

==================
Call on an index expression
==================

void main() {
  a[0]();
}

---

(program
  (function_declaration
    (function_signature
      (void_type)
      (identifier)
      (formal_parameter_list))
    (function_body
      (block
        (expression_statement
          (method_invocation
            (unconditional_assignable_selector
              (identifier)
              (index_selector
                (decimal_integer_literal)))
            (argument_part
              (arguments))))))))
