=====================
Variable declaration
=====================

void record() {
  var (i as int, String s) = record; 
}

---

(program
  (function_declaration
    (function_signature
      (void_type)
      (identifier)
      (formal_parameter_list))
    (function_body
      (block
        (local_variable_declaration
          (pattern_variable_declaration
            (inferred_type)
            (record_pattern
              (cast_pattern
                (constant_pattern
                  (identifier))
                (type_identifier))
              (variable_pattern
                (type_identifier)
                (identifier)))
            (identifier)))))))

============================
Switch statement relational
============================
void main(){
  switch (obj) {
    case >= first && <= last:
      print('in range');
    default:
  }
}
---

(program
  (function_declaration
    (function_signature
      (void_type)
      (identifier)
      (formal_parameter_list))
    (function_body
      (block
        (switch_statement
          (parenthesized_expression
            (identifier))
          (switch_block
            (switch_statement_case
              (case_builtin)
              (relational_operator)
              (identifier)
              (logical_and_operator)
              (relational_operator)
              (identifier)
              (expression_statement
                (method_invocation
                  (identifier)
                  (argument_part
                    (arguments
                      (argument
                        (string_literal)))))))
            (switch_statement_default)))))))

============================
For loop pattern
============================
void main() {
  // ERROR
  for (var MapEntry(key: key, value: count) in hist.entries) {
    print('$key occurred $count times');
  }
}

---

(program
  (function_declaration
    (function_signature
      (void_type)
      (identifier)
      (formal_parameter_list))
    (function_body
      (block
        (comment)
        (for_statement
          (for_loop_parts
            (inferred_type)
            (object_pattern
              (type_identifier)
              (identifier)
              (constant_pattern
                (identifier))
              (identifier)
              (constant_pattern
                (identifier)))
            (unconditional_assignable_selector
              (identifier)
              (assignable_operator)
              (identifier)))
          (block
            (expression_statement
              (method_invocation
                (identifier)
                (argument_part
                  (arguments
                    (argument
                      (string_literal
                        (template_substitution
                          (identifier_dollar_escaped))
                        (template_substitution
                          (identifier_dollar_escaped))))))))))))))

============================
Guarded pattern
============================

String classify(Object o, int limit) {
  switch (o) {
    case int n when n > limit:
      return 'big';
    case String s:
      return s;
  }
  if (o case int n when n.isEven) return 'even';
  return switch (o) { int n when n < 0 => 'neg', _ => 'other' };
}

---

(program
  (function_declaration
    signature: (function_signature
      (type_identifier)
      name: (identifier)
      (formal_parameter_list
        (formal_parameter
          (type_identifier)
          name: (identifier))
        (formal_parameter
          (type_identifier)
          name: (identifier))))
    body: (function_body
      (block
        (switch_statement
          condition: (parenthesized_expression
            (identifier))
          body: (switch_block
            (switch_statement_case
              (case_builtin)
              pattern: (variable_pattern
                (type_identifier)
                (identifier))
              guard: (relational_expression
                (identifier)
                (relational_operator)
                (identifier))
              (return_statement
                (string_literal)))
            (switch_statement_case
              (case_builtin)
              pattern: (variable_pattern
                (type_identifier)
                (identifier))
              (return_statement
                (identifier)))))
        (if_statement
          (identifier)
          pattern: (variable_pattern
            (type_identifier)
            (identifier))
          guard: (unconditional_assignable_selector
            (identifier)
            (assignable_operator)
            (identifier))
          consequence: (return_statement
            (string_literal)))
        (return_statement
          (switch_expression
            condition: (parenthesized_expression
              (identifier))
            body: (switch_expression_case
              pattern: (variable_pattern
                (type_identifier)
                (identifier))
              guard: (relational_expression
                (identifier)
                (relational_operator)
                (decimal_integer_literal))
              (string_literal))
            body: (switch_expression_case
              pattern: (constant_pattern
                (identifier))
              (string_literal))))))))
