===============
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_declaration
    (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_declaration
    (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_declaration
    (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_declaration
    (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_declaration
    (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_declaration
    (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_declaration
        (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_declaration
        (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_declaration
        (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_declaration
        (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_declaration
        (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_declaration
        (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_declaration
    (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_declaration
    (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_declaration
    (function_signature
      (identifier)
      (formal_parameter_list))
    (function_body
      (block))))
