=================================
Tuple struct patterns
=================================

match x {
  Some(x) => "some",
  std::None() => "none"
}

---

(source_file
  (match_expression (identifier) (match_block
    (match_arm
      (match_pattern (tuple_struct_pattern (identifier) (identifier)))
      (string_literal))
    (match_arm
      (match_pattern (tuple_struct_pattern (scoped_identifier (identifier) (identifier))))
      (string_literal)))))

=================================
Reference patterns
=================================

match x {
  A(ref x) => x.0,
  ref mut y => y,
  & mut  z => z,
}

---

(source_file
  (match_expression (identifier) (match_block
    (match_arm
      (match_pattern (tuple_struct_pattern (identifier) (ref_pattern (identifier))))
      (field_expression (identifier) (integer_literal)))
    (match_arm
      (match_pattern (ref_pattern (mut_pattern (mutable_specifier) (identifier))))
      (identifier))
    (match_arm
      (match_pattern (reference_pattern (mutable_specifier) (identifier)))
      (identifier)))))

=================================
Struct patterns
=================================

match x {
  Person{name, age} if age < 5 => ("toddler", name),
  Person{name: adult_name, age: _} => ("adult", adult_name),
}

---

(source_file
  (match_expression (identifier) (match_block
    (match_arm
      (match_pattern (struct_pattern
        (type_identifier)
        (field_pattern (shorthand_field_identifier))
        (field_pattern (shorthand_field_identifier)))
        (binary_expression (identifier) (integer_literal)))
      (tuple_expression (string_literal) (identifier)))
    (match_arm
      (match_pattern
        (struct_pattern
          (type_identifier)
          (field_pattern (field_identifier) (identifier))
          (field_pattern (field_identifier))))
      (tuple_expression (string_literal) (identifier))))))

=================================
Ignored patterns
=================================

match x {
  (a, ..) => a,
  B(..) => c,
  D::E{f: g, ..} => g
}

---

(source_file
  (match_expression (identifier) (match_block
    (match_arm
      (match_pattern
        (tuple_pattern (identifier) (remaining_field_pattern)))
      (identifier))
    (match_arm
      (match_pattern
        (tuple_struct_pattern (identifier) (remaining_field_pattern)))
      (identifier))
    (match_arm
      (match_pattern
        (struct_pattern
          (scoped_type_identifier (identifier) (type_identifier))
          (field_pattern (field_identifier) (identifier))
          (remaining_field_pattern)))
      (identifier)))))

=================================
Captured patterns
=================================

match x {
  a @ A(_) | b @ B(..) => a,
  a @ 1 ... 5 => a,
  Some(1 ... 5) => a,
  a @ b...c => a,
  a @ b..=c => a,
}

---

(source_file
  (match_expression (identifier) (match_block
    (match_arm
      (match_pattern
        (captured_pattern (identifier) (tuple_struct_pattern (identifier)))
        (captured_pattern (identifier) (tuple_struct_pattern (identifier) (remaining_field_pattern))))
      (identifier))
    (match_arm
      (match_pattern
        (captured_pattern (identifier) (range_pattern (integer_literal) (integer_literal))))
      (identifier))
    (match_arm
      (match_pattern
        (tuple_struct_pattern (identifier) (range_pattern (integer_literal) (integer_literal))))
      (identifier))
    (match_arm
      (match_pattern (captured_pattern (identifier) (range_pattern (identifier) (identifier))))
      (identifier))
    (match_arm
      (match_pattern (captured_pattern (identifier) (range_pattern (identifier) (identifier))))
      (identifier)))))