================================================================================
Simple call expression
================================================================================
foo()
--------------------------------------------------------------------------------

(source_file
  (simple_statement
    (call_expression
      (reference_expression
        (identifier))
      (argument_list))))

================================================================================
Simple call expression with argument
================================================================================
foo(100)
--------------------------------------------------------------------------------

(source_file
  (simple_statement
    (call_expression
      (reference_expression
        (identifier))
      (argument_list
        (argument
          (literal
            (int_literal)))))))

================================================================================
Simple call expression with Option propagation
================================================================================
foo(100)?
--------------------------------------------------------------------------------

(source_file
  (simple_statement
    (option_propagation_expression
      (call_expression
        (reference_expression
          (identifier))
        (argument_list
          (argument
            (literal
              (int_literal))))))))

================================================================================
Simple call expression with Result propagation
================================================================================
foo(100)!
--------------------------------------------------------------------------------

(source_file
  (simple_statement
    (result_propagation_expression
      (call_expression
        (reference_expression
          (identifier))
        (argument_list
          (argument
            (literal
              (int_literal))))))))

================================================================================
Simple call expression with or block
================================================================================
foo(100) or { 100 }
--------------------------------------------------------------------------------

(source_file
  (simple_statement
    (or_block_expression
      (call_expression
        (reference_expression
          (identifier))
        (argument_list
          (argument
            (literal
              (int_literal)))))
      (or_block
        (block
          (simple_statement
            (literal
              (int_literal))))))))

================================================================================
Simple call expression with mutable argument
================================================================================
foo(mut name)
--------------------------------------------------------------------------------

(source_file
  (simple_statement
    (call_expression
      (reference_expression
        (identifier))
      (argument_list
        (argument
          (mutable_expression
            (mutability_modifiers)
            (reference_expression
              (identifier))))))))

================================================================================
Simple call expression with arguments
================================================================================
foo(100, 100, 200)
--------------------------------------------------------------------------------

(source_file
  (simple_statement
    (call_expression
      (reference_expression
        (identifier))
      (argument_list
        (argument
          (literal
            (int_literal)))
        (argument
          (literal
            (int_literal)))
        (argument
          (literal
            (int_literal)))))))

================================================================================
Simple call expression with arguments and trailing comma
================================================================================
foo(100, 100, 200, )
--------------------------------------------------------------------------------

(source_file
  (simple_statement
    (call_expression
      (reference_expression
        (identifier))
      (argument_list
        (argument
          (literal
            (int_literal)))
        (argument
          (literal
            (int_literal)))
        (argument
          (literal
            (int_literal)))))))

================================================================================
Simple call expression with arguments on multiple lines
================================================================================
foo(
    100,
    100,
    200
)
--------------------------------------------------------------------------------

(source_file
  (simple_statement
    (call_expression
      (reference_expression
        (identifier))
      (argument_list
        (argument
          (literal
            (int_literal)))
        (argument
          (literal
            (int_literal)))
        (argument
          (literal
            (int_literal)))))))

================================================================================
Simple call expression with arguments on multiple lines and trailing comma
================================================================================
foo(
    100,
    100,
    200,
)
--------------------------------------------------------------------------------

(source_file
  (simple_statement
    (call_expression
      (reference_expression
        (identifier))
      (argument_list
        (argument
          (literal
            (int_literal)))
        (argument
          (literal
            (int_literal)))
        (argument
          (literal
            (int_literal)))))))

================================================================================
Simple call expression with last unpacking parameter
================================================================================
foo(100, 100, ...[1, 2, 3])
--------------------------------------------------------------------------------

(source_file
  (simple_statement
    (call_expression
      (reference_expression
        (identifier))
      (argument_list
        (argument
          (literal
            (int_literal)))
        (argument
          (literal
            (int_literal)))
        (argument
          (spread_expression
            (array_creation
              (literal
                (int_literal))
              (literal
                (int_literal))
              (literal
                (int_literal)))))))))

================================================================================
Simple call expression with key value argument
================================================================================
foo(name: value)
--------------------------------------------------------------------------------

(source_file
  (simple_statement
    (call_expression
      (reference_expression
        (identifier))
      (argument_list
        (argument
          (keyed_element
            (field_name
              (reference_expression
                (identifier)))
            (reference_expression
              (identifier))))))))

================================================================================
Simple call expression with key value arguments
================================================================================
foo(name: value, name2: value2, name3: value3)
--------------------------------------------------------------------------------

(source_file
  (simple_statement
    (call_expression
      (reference_expression
        (identifier))
      (argument_list
        (argument
          (keyed_element
            (field_name
              (reference_expression
                (identifier)))
            (reference_expression
              (identifier))))
        (argument
          (keyed_element
            (field_name
              (reference_expression
                (identifier)))
            (reference_expression
              (identifier))))
        (argument
          (keyed_element
            (field_name
              (reference_expression
                (identifier)))
            (reference_expression
              (identifier))))))))

================================================================================
Simple call expression with plain and key value arguments
================================================================================
foo(plain, plain2, name: value, name2: value2, name3: value3)
--------------------------------------------------------------------------------

(source_file
  (simple_statement
    (call_expression
      (reference_expression
        (identifier))
      (argument_list
        (argument
          (reference_expression
            (identifier)))
        (argument
          (reference_expression
            (identifier)))
        (argument
          (keyed_element
            (field_name
              (reference_expression
                (identifier)))
            (reference_expression
              (identifier))))
        (argument
          (keyed_element
            (field_name
              (reference_expression
                (identifier)))
            (reference_expression
              (identifier))))
        (argument
          (keyed_element
            (field_name
              (reference_expression
                (identifier)))
            (reference_expression
              (identifier))))))))

================================================================================
Simple call expression with key value arguments on multiple lines
================================================================================
foo(
    name: value,
    name2: value2,
    name3: value3
)
--------------------------------------------------------------------------------

(source_file
  (simple_statement
    (call_expression
      (reference_expression
        (identifier))
      (argument_list
        (argument
          (keyed_element
            (field_name
              (reference_expression
                (identifier)))
            (reference_expression
              (identifier))))
        (argument
          (keyed_element
            (field_name
              (reference_expression
                (identifier)))
            (reference_expression
              (identifier))))
        (argument
          (keyed_element
            (field_name
              (reference_expression
                (identifier)))
            (reference_expression
              (identifier))))))))

================================================================================
Simple call expression with key value arguments on multiple lines without commas
================================================================================
foo(
    name: value
    name2: value2
    name3: value3
)
--------------------------------------------------------------------------------

(source_file
  (simple_statement
    (call_expression
      (reference_expression
        (identifier))
      (argument_list
        (argument
          (keyed_element
            (field_name
              (reference_expression
                (identifier)))
            (reference_expression
              (identifier))))
        (argument
          (keyed_element
            (field_name
              (reference_expression
                (identifier)))
            (reference_expression
              (identifier))))
        (argument
          (keyed_element
            (field_name
              (reference_expression
                (identifier)))
            (reference_expression
              (identifier))))))))

================================================================================
Simple call expression with key value arguments on multiple lines without commas with plain arg
================================================================================
foo(
    plain,
    name: value
    name2: value2
    name3: value3
)
--------------------------------------------------------------------------------

(source_file
  (simple_statement
    (call_expression
      (reference_expression
        (identifier))
      (argument_list
        (argument
          (reference_expression
            (identifier)))
        (argument
          (keyed_element
            (field_name
              (reference_expression
                (identifier)))
            (reference_expression
              (identifier))))
        (argument
          (keyed_element
            (field_name
              (reference_expression
                (identifier)))
            (reference_expression
              (identifier))))
        (argument
          (keyed_element
            (field_name
              (reference_expression
                (identifier)))
            (reference_expression
              (identifier))))))))

================================================================================
Generic function call with type parameter
================================================================================
foo[int]()
--------------------------------------------------------------------------------

(source_file
  (simple_statement
    (call_expression
      (reference_expression
        (identifier))
      (type_parameters
        (plain_type
          (type_reference_expression
            (identifier))))
      (argument_list))))

================================================================================
Generic function call with several type parameters
================================================================================
foo[int, string]()
--------------------------------------------------------------------------------

(source_file
  (simple_statement
    (call_expression
      (reference_expression
        (identifier))
      (type_parameters
        (plain_type
          (type_reference_expression
            (identifier)))
        (plain_type
          (type_reference_expression
            (identifier))))
      (argument_list))))

================================================================================
Qualified call expression
================================================================================
bar.foo()
--------------------------------------------------------------------------------

(source_file
  (simple_statement
    (call_expression
      (selector_expression
        (reference_expression
          (identifier))
        (reference_expression
          (identifier)))
      (argument_list))))

================================================================================
Qualified call expression with two selectors
================================================================================
bar.name.foo()
--------------------------------------------------------------------------------

(source_file
  (simple_statement
    (call_expression
      (selector_expression
        (selector_expression
          (reference_expression
            (identifier))
          (reference_expression
            (identifier)))
        (reference_expression
          (identifier)))
      (argument_list))))

================================================================================
Qualified call expression with index expression
================================================================================
bar.name[0].foo()
--------------------------------------------------------------------------------

(source_file
  (simple_statement
    (call_expression
      (selector_expression
        (index_expression
          (selector_expression
            (reference_expression
              (identifier))
            (reference_expression
              (identifier)))
          (literal
            (int_literal)))
        (reference_expression
          (identifier)))
      (argument_list))))

================================================================================
Qualified call expression with call expression
================================================================================
bar.name().foo()
--------------------------------------------------------------------------------

(source_file
  (simple_statement
    (call_expression
      (selector_expression
        (call_expression
          (selector_expression
            (reference_expression
              (identifier))
            (reference_expression
              (identifier)))
          (argument_list))
        (reference_expression
          (identifier)))
      (argument_list))))

================================================================================
Call expression with ...
================================================================================
foo(...name)
--------------------------------------------------------------------------------

(source_file
  (simple_statement
    (call_expression
      (reference_expression
        (identifier))
      (argument_list
        (argument
          (spread_expression
            (reference_expression
              (identifier))))))))
