===============
Record Literals
===============

final y = (1, 2, await x);
final z = (a: 1, b: 4);
final a = (1,);
final b = (a: 1);
final c = (a: 1, b: 2,);
final d = (a, b, x: 4, c, d);
final e = (1, 2,);

---

(program
      (final_builtin)
      (static_final_declaration_list
        (static_final_declaration
          (identifier)
          (record_literal
            (record_field
              (decimal_integer_literal))
            (record_field
              (decimal_integer_literal))
            (record_field
              (unary_expression
                (await_expression
                  (identifier)))))))
      (final_builtin)
      (static_final_declaration_list
        (static_final_declaration
          (identifier)
          (record_literal
            (record_field
              (label
                (identifier))
              (decimal_integer_literal))
            (record_field
              (label
                (identifier))
              (decimal_integer_literal)))))
      (final_builtin)
      (static_final_declaration_list
        (static_final_declaration
          (identifier)
          (record_literal
            (decimal_integer_literal))))
      (final_builtin)
      (static_final_declaration_list
        (static_final_declaration
          (identifier)
          (record_literal
            (label
              (identifier))
            (decimal_integer_literal))))
      (final_builtin)
      (static_final_declaration_list
        (static_final_declaration
          (identifier)
          (record_literal
            (record_field
              (label
                (identifier))
              (decimal_integer_literal))
            (record_field
              (label
                (identifier))
              (decimal_integer_literal)))))
      (final_builtin)
      (static_final_declaration_list
        (static_final_declaration
          (identifier)
          (record_literal
            (record_field
              (identifier))
            (record_field
              (identifier))
            (record_field
              (label
                (identifier))
              (decimal_integer_literal))
            (record_field
              (identifier))
            (record_field
              (identifier)))))
      (final_builtin)
      (static_final_declaration_list
        (static_final_declaration
          (identifier)
          (record_literal
            (record_field
              (decimal_integer_literal))
            (record_field
              (decimal_integer_literal))))))

==================================
Empty record literal
==================================

final empty = ();

---

(program
  (final_builtin)
  (static_final_declaration_list
    (static_final_declaration
      (identifier)
      (record_literal))))

======================================================
Records in function and class bounds, and local types
======================================================
class C2<T extends (num, {Object o})> {
  T t;
  C2(this.t);
}
T bar<T extends (num, {Object o})>(T t) => t;

void main() {
  (num, String) a1 = (1.2, "s");
}

---

(program
      (class_definition
        (identifier)
        (type_parameters
          (type_parameter
            (type_identifier)
            (type_bound
              (record_type
                (record_type_field
                  (type_identifier))
                (record_type_named_field
                  (typed_identifier
                    (type_identifier)
                    (identifier)))))))
        (class_body
          (declaration
            (type_identifier)
            (initialized_identifier_list
              (initialized_identifier
                (identifier))))
          (declaration
            (constructor_signature
              (identifier)
              (formal_parameter_list
                (formal_parameter
                  (constructor_param
                    (this)
                    (identifier))))))))
      (function_signature
        (type_identifier)
        (identifier)
        (type_parameters
          (type_parameter
            (type_identifier)
            (type_bound
              (record_type
                (record_type_field
                  (type_identifier))
                (record_type_named_field
                  (typed_identifier
                    (type_identifier)
                    (identifier)))))))
        (formal_parameter_list
          (formal_parameter
            (type_identifier)
            (identifier))))
      (function_body
        (identifier))
      (function_signature
        (void_type)
        (identifier)
        (formal_parameter_list))
      (function_body
        (block
          (local_variable_declaration
            (initialized_variable_definition
              (record_type
                (record_type_field
                  (type_identifier))
                (record_type_field
                  (type_identifier)))
              (identifier)
              (record_literal
                (record_field
                  (decimal_floating_point_literal))
                (record_field
                  (string_literal))))))))

===============
Record Typedefs
===============

typedef R1 = (int $6, {String s});

typedef R2 = (int, {String $101});

typedef (int $1, {int i}) R3();

typedef (int, {int $2}) R4();

typedef void R5((String s, {String $2}) r);

(int, {int $2})? foo1() => null;

(int $3, {int x})? foo2() => null;

void bar1((int i, {bool $2}) r) {}

void bar2((int $4, {bool b}) r) {}

---

(program
      (type_alias
        (type_identifier)
        (record_type
          (record_type_field
            (type_identifier)
            (identifier))
          (record_type_named_field
            (typed_identifier
              (type_identifier)
              (identifier)))))
      (type_alias
        (type_identifier)
       (record_type
          (record_type_field
            (type_identifier))
          (record_type_named_field
            (typed_identifier
              (type_identifier)
              (identifier)))))
      (type_alias
        (record_type
          (record_type_field
            (type_identifier)
            (identifier))
          (record_type_named_field
            (typed_identifier
              (type_identifier)
              (identifier))))
        (type_identifier)
        (formal_parameter_list))
      (type_alias
        (record_type
          (record_type_field
            (type_identifier))
          (record_type_named_field
            (typed_identifier
              (type_identifier)
              (identifier))))
        (type_identifier)
        (formal_parameter_list))
      (type_alias
        (void_type)
        (type_identifier)
        (formal_parameter_list
          (formal_parameter
            (record_type
              (record_type_field
                (type_identifier)
                (identifier))
              (record_type_named_field
                (typed_identifier
                  (type_identifier)
                  (identifier))))
            (identifier))))
      (function_signature
        (record_type
          (record_type_field
            (type_identifier))
          (record_type_named_field
            (typed_identifier
              (type_identifier)
              (identifier))))
        (nullable_type)
        (identifier)
        (formal_parameter_list))
      (function_body
        (null_literal))
      (function_signature
        (record_type
          (record_type_field
            (type_identifier)
            (identifier))
          (record_type_named_field
            (typed_identifier
              (type_identifier)
              (identifier))))
        (nullable_type)
        (identifier)
        (formal_parameter_list))
      (function_body
        (null_literal))
      (function_signature
        (void_type)
        (identifier)
        (formal_parameter_list
          (formal_parameter
            (record_type
              (record_type_field
                (type_identifier)
                (identifier))
              (record_type_named_field
                (typed_identifier
                  (type_identifier)
                  (identifier))))
            (identifier))))
      (function_body
        (block))
      (function_signature
        (void_type)
        (identifier)
        (formal_parameter_list
          (formal_parameter
            (record_type
              (record_type_field
                (type_identifier)
                (identifier))
              (record_type_named_field
                (typed_identifier
                  (type_identifier)
                  (identifier))))
            (identifier))))
      (function_body
        (block)))

=================================================
Annotated record-return method (class)
=================================================

class Counter {
  @override
  (int, int) update(int msg) {}
}

---

(program
  (class_definition
    (identifier)
    (class_body
      (annotation
        (identifier))
      (method_signature
        (function_signature
          (record_type
            (record_type_field
              (type_identifier))
            (record_type_field
              (type_identifier)))
          (identifier)
          (formal_parameter_list
            (formal_parameter
              (type_identifier)
              (identifier)))))
      (function_body
        (block)))))

=================================================
Annotated record-return method variants (class)
=================================================

class M {
  @override
  ({int x, String y}) get pos => (x: 1, y: "a");

  @override
  static (int, double) tally() {}

  @override
  (List<int>, void Function())? doStuff() => null;
}

---

(program
  (class_definition
    (identifier)
    (class_body
      (annotation
        (identifier))
      (method_signature
        (getter_signature
          (record_type
            (record_type_named_field
              (typed_identifier
                (type_identifier)
                (identifier)))
            (record_type_named_field
              (typed_identifier
                (type_identifier)
                (identifier))))
          (identifier)))
      (function_body
        (record_literal
          (record_field
            (label
              (identifier))
            (decimal_integer_literal))
          (record_field
            (label
              (identifier))
            (string_literal))))
      (annotation
        (identifier))
      (method_signature
        (function_signature
          (record_type
            (record_type_field
              (type_identifier))
            (record_type_field
              (type_identifier)))
          (identifier)
          (formal_parameter_list)))
      (function_body
        (block))
      (annotation
        (identifier))
      (method_signature
        (function_signature
          (record_type
            (record_type_field
              (type_identifier)
              (type_arguments
                (type_identifier)))
            (record_type_field
              (function_type
                (void_type)
                (parameter_type_list))))
          (nullable_type)
          (identifier)
          (formal_parameter_list)))
      (function_body
        (null_literal)))))

=================================================
Annotated record-return method (extension)
=================================================

extension StringX on String {
  @override
  (String, int) parse() => (this, 0);
}

---

(program
  (extension_declaration
    (identifier)
    (type_identifier)
    (extension_body
      (annotation
        (identifier))
      (method_signature
        (function_signature
          (record_type
            (record_type_field
              (type_identifier))
            (record_type_field
              (type_identifier)))
          (identifier)
          (formal_parameter_list)))
      (function_body
        (record_literal
          (record_field
            (this))
          (record_field
            (decimal_integer_literal)))))))

=================================================
Annotated record-return method (enum)
=================================================

enum Op {
  add, sub;
  @override
  (int, int) pair() => (1, 2);
}

---

(program
  (enum_declaration
    (identifier)
    (enum_body
      (enum_constant
        (identifier))
      (enum_constant
        (identifier))
      (annotation
        (identifier))
      (method_signature
        (function_signature
          (record_type
            (record_type_field
              (type_identifier))
            (record_type_field
              (type_identifier)))
          (identifier)
          (formal_parameter_list)))
      (function_body
        (record_literal
          (record_field
            (decimal_integer_literal))
          (record_field
            (decimal_integer_literal)))))))

=================================================
Annotated record-return function (top-level)
=================================================

@deprecated
(int, String) parseNum(String s) => (0, s);

@experimental
(int x, {String? msg}) result() => (0,);

---

(program
  (annotation
    (identifier))
  (function_signature
    (record_type
      (record_type_field
        (type_identifier))
      (record_type_field
        (type_identifier)))
    (identifier)
    (formal_parameter_list
      (formal_parameter
        (type_identifier)
        (identifier))))
  (function_body
    (record_literal
      (record_field
        (decimal_integer_literal))
      (record_field
        (identifier))))
  (annotation
    (identifier))
  (function_signature
    (record_type
      (record_type_field
        (type_identifier)
        (identifier))
      (record_type_named_field
        (typed_identifier
          (type_identifier)
          (nullable_type)
          (identifier))))
    (identifier)
    (formal_parameter_list))
  (function_body
    (record_literal
      (decimal_integer_literal))))

=================================================
Empty annotation args don't trigger record-return path
=================================================

class A {
  @Foo()
  A();
}

@Foo()
myFunc() {}

---

(program
  (class_definition
    (identifier)
    (class_body
      (annotation
        (identifier)
        (arguments))
      (declaration
        (constructor_signature
          (identifier)
          (formal_parameter_list)))))
  (annotation
    (identifier)
    (arguments))
  (function_signature
    (identifier)
    (formal_parameter_list))
  (function_body
    (block)))
