===
Identifier pattern
===

fn a() {
  let x = 0;
  x
}
---

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


===
Integer pattern
===

fn a() {
  let 0 = 0;
  x
}
---

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


===
Tuple pattern
===

fn a() {
  let (a, 0) = 0;
  x
}
---

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


===
Path pattern
===

fn a() {
  let (a, 0) = 0;
  x
}
---

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


===
Named unpack
===

fn a() {
  let X$(a: x, b) = 0;
  x
}
---

(source_file
  (unit_definition
    (identifier)
    (parameter_list)
    (block
      (let_binding
        (named_unpack
          (identifier)
          (named_pattern_param
            (parameter (identifier))
            (identifier))
          (named_pattern_param
            (parameter (identifier))))
        (int_literal))
      (identifier))))


===
Positional unpack
===

fn a() {
  let X(x, (x, y)) = 0;
  x
}
---

(source_file
  (unit_definition
    (identifier)
    (parameter_list)
    (block
      (let_binding
        (positional_unpack
          (identifier)
          (identifier)
          (tuple_pattern (identifier) (identifier)))
        (int_literal))
      (identifier))))


===
Boolean pattern
===

fn a() {
  let true = 0;
  x
}
---
(source_file
  (unit_definition
    (identifier)
    (parameter_list)
    (block
      (let_binding
        (bool_literal)
        (int_literal))
      (identifier))))
