===
Array literals
===

fn a() {
  [1, 2]
}

---

(source_file
  (unit_definition
    (identifier)
    (parameter_list)
    (block
      (array_literal
        (int_literal)
        (int_literal)))))

===
Tuple literals
===

fn a() {
  (1, 2)
}

---

(source_file
  (unit_definition
    (identifier)
    (parameter_list)
    (block
      (tuple_literal
        (int_literal)
        (int_literal)))))

===
Function calls
===

fn a() {
  test(a)
}

---

(source_file
  (unit_definition
    (identifier)
    (parameter_list)
    (block
      (function_call
        (identifier)
        (argument_list (identifier))))))

===
Function calls with turbofish
===

fn a() {
  test::<bool>(a)
}

---

(source_file
  (unit_definition
    (identifier)
    (parameter_list)
    (block
      (function_call
        (identifier)
        (turbofish
          (type (builtin_type)))
        (argument_list (identifier))))))




===
Function with named arguments
===

fn a() {
  test$(a: a)
}

---

(source_file
  (unit_definition
    (identifier)
    (parameter_list)
    (block
      (function_call
        (identifier)
        (argument_list (parameter (identifier)) (identifier))))))


===
Function with named shorthand arguments
===

fn a() {
  test$(a)
}

---

(source_file
  (unit_definition
    (identifier)
    (parameter_list)
    (block
      (function_call
        (identifier)
        (argument_list (parameter (identifier)))))))


===
Entity calls
===

fn a() {
  inst test(a)
}

---

(source_file
  (unit_definition
    (identifier)
    (parameter_list)
    (block
      (entity_instance
        (identifier)
        (argument_list (identifier))))))



===
Entity with named arguments
===

fn a() {
  inst test$(a: a)
}

---

(source_file
  (unit_definition
    (identifier)
    (parameter_list)
    (block
      (entity_instance
        (identifier)
        (argument_list (parameter (identifier)) (identifier))))))


===
Pipeline instance instance
===

fn a() {
  inst(10) test$(a: a)
}

---

(source_file
  (unit_definition
    (identifier)
    (parameter_list)
    (block
      (pipeline_instance
        (type (int_literal))
        (identifier)
        (argument_list (parameter (identifier)) (identifier))))))


===
Parenthesized expression
===

fn a() {
  (a)
}

---

(source_file
  (unit_definition
    (identifier)
    (parameter_list)
    (block
      (paren_expression (identifier)))))


===
Dereference operator
===

fn a() {
  *a
}

---

(source_file
  (unit_definition
    (identifier)
    (parameter_list)
    (block
      (unary_expression (identifier)))))


===
Field access
===

fn a() {
  a.b
}

---

(source_file
  (unit_definition
    (identifier)
    (parameter_list)
    (block
      (field_access (identifier) (identifier)))))


===
Method call (positional)
===

fn a() {
  a.b(x)
}

---

(source_file
  (unit_definition
    (identifier)
    (parameter_list)
    (block
      (method_call
        (identifier)
        (identifier)
        (argument_list (identifier))))))


===
Method call with turbofish
===

fn a() {
  a.b::<T>(x)
}

---

(source_file
  (unit_definition
    (identifier)
    (parameter_list)
    (block
      (method_call
        base: (identifier)
        name: (identifier)
        (turbofish (type (identifier)))
        (argument_list (identifier))))))

        
===
Method call with named turbofish
===

fn a() {
  a.b::$<T, T2: X>(x)
}

---

(source_file
  (unit_definition
    (identifier)
    (parameter_list)
    (block
      (method_call
        base: (identifier)
        name: (identifier)
        (turbofish
          (named_turbofish_arg (identifier))
          (named_turbofish_arg (identifier) (type (identifier))))
        (argument_list (identifier))))))

===
Method call (named)
===

fn a() {
  a.b$(x: y)
}

---

(source_file
  (unit_definition
    (identifier)
    (parameter_list)
    (block
      (method_call
        (identifier)
        (identifier)
        (argument_list
          (parameter (identifier))
          (identifier))))))

===
Entity method call (positional)
===

fn a() {
  a.inst b(x)
}

---

(source_file
  (unit_definition
    (identifier)
    (parameter_list)
    (block
      (method_call
        (identifier)
        (identifier)
        (argument_list (identifier))))))

===
Self
===

fn a() {
  self
}

---

(source_file
  (unit_definition
    (identifier)
    (parameter_list)
    (block
      (self))))


===
Index
===

fn a() {
  x[1]
}

---

(source_file
  (unit_definition
    (identifier)
    (parameter_list)
    (block
      (index (identifier) (int_literal)))))

===
Sized uint literals
===

fn a() {
  1u111
}

---

(source_file
  (unit_definition
    (identifier)
    (parameter_list)
    (block
      (int_literal))))

===
Sized int literals
===

fn a() {
  1i111
}

---

(source_file
  (unit_definition
    (identifier)
    (parameter_list)
    (block
      (int_literal))))



===
Sized hex literals
===

fn a() {
  0x1i111
}

---

(source_file
  (unit_definition
    (identifier)
    (parameter_list)
    (block
      (int_literal))))


===
Sized bin literals
===

fn a() {
  0b1i111
}

---

(source_file
  (unit_definition
    (identifier)
    (parameter_list)
    (block
      (int_literal))))

===
Division operator
===

fn a() {
  1 / 2
}

---

(source_file
  (unit_definition
    (identifier)
    (parameter_list)
    (block
      (binary_expression
        (int_literal) (op_div) (int_literal)))))


===
Mod operator
===

fn a() {
  1 % 2
}

---

(source_file
  (unit_definition
    (identifier)
    (parameter_list)
    (block
      (binary_expression
        (int_literal) (op_mod) (int_literal)))))


===
neq operator
===

fn a() {
  1 != 2
}

---

(source_file
  (unit_definition
    (identifier)
    (parameter_list)
    (block
      (binary_expression
        (int_literal) (op_ne) (int_literal)))))

===
reference operator
===

fn a() {
  &x
}

---

(source_file
  (unit_definition
    (identifier)
    (parameter_list)
    (block
      (unary_expression (identifier)))))


===
bitwise negate operator
===

fn a() {
  ~x
}

---

(source_file
  (unit_definition
    (identifier)
    (parameter_list)
    (block
      (unary_expression (identifier)))))

===
Field access regression
===

fn a() {
  (*self.headers.data).is_some()
}

---

(source_file
      (unit_definition
        (identifier)
        (parameter_list)
        (block
          (method_call
            (paren_expression
              (unary_expression
                (field_access
                  (field_access
                    (self)
                    (identifier))
                  (identifier))))
            (identifier)
            (argument_list)))))
