================================================================================
Simple type initializer
================================================================================
Foo{}
--------------------------------------------------------------------------------

(source_file
  (simple_statement
    (type_initializer
      (plain_type
        (type_reference_expression
          (identifier)))
      (type_initializer_body))))

================================================================================
Array type initializer
================================================================================
[]int{}
--------------------------------------------------------------------------------

(source_file
  (simple_statement
    (type_initializer
      (plain_type
        (array_type
          (plain_type
            (type_reference_expression
              (identifier)))))
      (type_initializer_body))))

================================================================================
Array type initializer with field
================================================================================
[]int{cap: 100}
--------------------------------------------------------------------------------

(source_file
  (simple_statement
    (type_initializer
      (plain_type
        (array_type
          (plain_type
            (type_reference_expression
              (identifier)))))
      (type_initializer_body
        (element_list
          (keyed_element
            (field_name
              (reference_expression
                (identifier)))
            (literal
              (int_literal))))))))

================================================================================
Array type initializer with fields
================================================================================
[]int{len: 0, cap: 100}
--------------------------------------------------------------------------------

(source_file
  (simple_statement
    (type_initializer
      (plain_type
        (array_type
          (plain_type
            (type_reference_expression
              (identifier)))))
      (type_initializer_body
        (element_list
          (keyed_element
            (field_name
              (reference_expression
                (identifier)))
            (literal
              (int_literal)))
          (keyed_element
            (field_name
              (reference_expression
                (identifier)))
            (literal
              (int_literal))))))))

================================================================================
Array type initializer with all fields
================================================================================
[]int{len: 0, cap: 100, init: index * 100}
--------------------------------------------------------------------------------

(source_file
  (simple_statement
    (type_initializer
      (plain_type
        (array_type
          (plain_type
            (type_reference_expression
              (identifier)))))
      (type_initializer_body
        (element_list
          (keyed_element
            (field_name
              (reference_expression
                (identifier)))
            (literal
              (int_literal)))
          (keyed_element
            (field_name
              (reference_expression
                (identifier)))
            (literal
              (int_literal)))
          (keyed_element
            (field_name
              (reference_expression
                (identifier)))
            (binary_expression
              (reference_expression
                (identifier))
              (literal
                (int_literal)))))))))

================================================================================
Simple type initializer with field
================================================================================
Foo{
    age: 100
}
--------------------------------------------------------------------------------

(source_file
  (simple_statement
    (type_initializer
      (plain_type
        (type_reference_expression
          (identifier)))
      (type_initializer_body
        (element_list
          (keyed_element
            (field_name
              (reference_expression
                (identifier)))
            (literal
              (int_literal))))))))

================================================================================
Simple type initializer with fields
================================================================================
Foo{
    age: 100
    name: "John"
    weight: 100.0
}
--------------------------------------------------------------------------------

(source_file
  (simple_statement
    (type_initializer
      (plain_type
        (type_reference_expression
          (identifier)))
      (type_initializer_body
        (element_list
          (keyed_element
            (field_name
              (reference_expression
                (identifier)))
            (literal
              (int_literal)))
          (keyed_element
            (field_name
              (reference_expression
                (identifier)))
            (literal
              (interpreted_string_literal)))
          (keyed_element
            (field_name
              (reference_expression
                (identifier)))
            (literal
              (float_literal))))))))

================================================================================
Simple type initializer with unpacking
================================================================================
Foo{
    ...boo
}
--------------------------------------------------------------------------------

(source_file
  (simple_statement
    (type_initializer
      (plain_type
        (type_reference_expression
          (identifier)))
      (type_initializer_body
        (element_list
          (spread_expression
            (reference_expression
              (identifier))))))))

================================================================================
Simple type initializer with unpacking and other fields
================================================================================
Foo{
    ...boo
    age: 100
    name: "John"
}
--------------------------------------------------------------------------------

(source_file
  (simple_statement
    (type_initializer
      (plain_type
        (type_reference_expression
          (identifier)))
      (type_initializer_body
        (element_list
          (spread_expression
            (reference_expression
              (identifier)))
          (keyed_element
            (field_name
              (reference_expression
                (identifier)))
            (literal
              (int_literal)))
          (keyed_element
            (field_name
              (reference_expression
                (identifier)))
            (literal
              (interpreted_string_literal))))))))

================================================================================
Simple type initializer with just value
================================================================================
Foo{name}
--------------------------------------------------------------------------------

(source_file
  (simple_statement
    (type_initializer
      (plain_type
        (type_reference_expression
          (identifier)))
      (type_initializer_body
        (element_list
          (reference_expression
            (identifier)))))))

================================================================================
Simple type initializer with just values
================================================================================
Foo{name, other, 100}
--------------------------------------------------------------------------------

(source_file
  (simple_statement
    (type_initializer
      (plain_type
        (type_reference_expression
          (identifier)))
      (type_initializer_body
        (short_element_list
          (element
            (reference_expression
              (identifier)))
          (element
            (reference_expression
              (identifier)))
          (element
            (literal
              (int_literal))))))))

================================================================================
Type initializer for embedded struct
================================================================================
Foo{
    Bar: Bar{
        name: "John"
        age: 100
    }
}
--------------------------------------------------------------------------------

(source_file
  (simple_statement
    (type_initializer
      (plain_type
        (type_reference_expression
          (identifier)))
      (type_initializer_body
        (element_list
          (keyed_element
            (field_name
              (reference_expression
                (identifier)))
            (type_initializer
              (plain_type
                (type_reference_expression
                  (identifier)))
              (type_initializer_body
                (element_list
                  (keyed_element
                    (field_name
                      (reference_expression
                        (identifier)))
                    (literal
                      (interpreted_string_literal)))
                  (keyed_element
                    (field_name
                      (reference_expression
                        (identifier)))
                    (literal
                      (int_literal))))))))))))

================================================================================
Type initializer as field for type initializer
================================================================================
Foo{
    name: "John"
    age: 100
    other: Bar{
        name: "John"
        age: 100
    }
}
--------------------------------------------------------------------------------

(source_file
  (simple_statement
    (type_initializer
      (plain_type
        (type_reference_expression
          (identifier)))
      (type_initializer_body
        (element_list
          (keyed_element
            (field_name
              (reference_expression
                (identifier)))
            (literal
              (interpreted_string_literal)))
          (keyed_element
            (field_name
              (reference_expression
                (identifier)))
            (literal
              (int_literal)))
          (keyed_element
            (field_name
              (reference_expression
                (identifier)))
            (type_initializer
              (plain_type
                (type_reference_expression
                  (identifier)))
              (type_initializer_body
                (element_list
                  (keyed_element
                    (field_name
                      (reference_expression
                        (identifier)))
                    (literal
                      (interpreted_string_literal)))
                  (keyed_element
                    (field_name
                      (reference_expression
                        (identifier)))
                    (literal
                      (int_literal))))))))))))

================================================================================
Generic type initializer
================================================================================
Foo[int, string]{
    name: "John"
    age: 100
}
--------------------------------------------------------------------------------

(source_file
  (simple_statement
    (type_initializer
      (plain_type
        (generic_type
          (type_reference_expression
            (identifier))
          (type_parameters
            (plain_type
              (type_reference_expression
                (identifier)))
            (plain_type
              (type_reference_expression
                (identifier))))))
      (type_initializer_body
        (element_list
          (keyed_element
            (field_name
              (reference_expression
                (identifier)))
            (literal
              (interpreted_string_literal)))
          (keyed_element
            (field_name
              (reference_expression
                (identifier)))
            (literal
              (int_literal))))))))

================================================================================
Type initializer for C structs
================================================================================
C.Foo{
    name: "John"
    age: 100
}
--------------------------------------------------------------------------------

(source_file
  (simple_statement
    (type_initializer
      (plain_type
        (type_reference_expression
          (identifier)))
      (type_initializer_body
        (element_list
          (keyed_element
            (field_name
              (reference_expression
                (identifier)))
            (literal
              (interpreted_string_literal)))
          (keyed_element
            (field_name
              (reference_expression
                (identifier)))
            (literal
              (int_literal))))))))

================================================================================
Type initializer for Channel type
================================================================================
chan f64{}
--------------------------------------------------------------------------------

(source_file
  (simple_statement
    (type_initializer
      (plain_type
        (channel_type
          (plain_type
            (type_reference_expression
              (identifier)))))
      (type_initializer_body))))

================================================================================
Type initializer for Map type
================================================================================
map[string]int{}
--------------------------------------------------------------------------------

(source_file
  (simple_statement
    (type_initializer
      (plain_type
        (map_type
          (plain_type
            (type_reference_expression
              (identifier)))
          (plain_type
            (type_reference_expression
              (identifier)))))
      (type_initializer_body))))

================================================================================
Qualified type initializer
================================================================================
psi.StubIndexSink{}
--------------------------------------------------------------------------------

(source_file
  (simple_statement
    (type_initializer
      (plain_type
        (qualified_type
          (reference_expression
            (identifier))
          (type_reference_expression
            (identifier))))
      (type_initializer_body))))

================================================================================
Qualified type initializer for pointer
================================================================================
&psi.StubIndexSink{}
--------------------------------------------------------------------------------

(source_file
  (simple_statement
    (type_initializer
      (plain_type
        (pointer_type
          (plain_type
            (qualified_type
              (reference_expression
                (identifier))
              (type_reference_expression
                (identifier))))))
      (type_initializer_body))))

================================================================================
Deep array initialization (TODO)
================================================================================
[][]u8{len: 20, cap: 20}
--------------------------------------------------------------------------------

(source_file
  (simple_statement
    (index_expression
      (empty_array_creation)
      (reference_expression
        (MISSING identifier))))
  (simple_statement
    (reference_expression
      (identifier)))
  (simple_statement
    (map_init_expression
      (map_keyed_element
        (reference_expression
          (identifier))
        (literal
          (int_literal)))
      (map_keyed_element
        (reference_expression
          (identifier))
        (literal
          (int_literal))))))
