==================
Cascade call sections fold into method invocations
==================

void main() {
  buffer..writeln('a')..writeln('b');
}

---

(program
  (function_declaration
    (function_signature
      (void_type)
      (identifier)
      (formal_parameter_list))
    (function_body
      (block
        (expression_statement
          (cascade_expression
            (identifier)
            (unconditional_cascade_section
              (assignable_operator)
              (method_invocation
                (cascade_selector
                  (identifier))
                (argument_part
                  (arguments
                    (argument
                      (string_literal))))))
            (unconditional_cascade_section
              (assignable_operator)
              (method_invocation
                (cascade_selector
                  (identifier))
                (argument_part
                  (arguments
                    (argument
                      (string_literal))))))))))))

==================
Null-aware cascade marks its section conditional
==================

void main() {
  controller?..clear()..dispose();
}

---

(program
  (function_declaration
    (function_signature
      (void_type)
      (identifier)
      (formal_parameter_list))
    (function_body
      (block
        (expression_statement
          (cascade_expression
            (identifier)
            (conditional_cascade_section
              (assignable_operator)
              (method_invocation
                (cascade_selector
                  (identifier))
                (argument_part
                  (arguments))))
            (unconditional_cascade_section
              (assignable_operator)
              (method_invocation
                (cascade_selector
                  (identifier))
                (argument_part
                  (arguments))))))))))

==================
Cascade assignment sections reuse assignment_expression_without_cascade
==================

void main() {
  paint..color = color..strokeWidth = 2;
}

---

(program
  (function_declaration
    (function_signature
      (void_type)
      (identifier)
      (formal_parameter_list))
    (function_body
      (block
        (expression_statement
          (cascade_expression
            (identifier)
            (unconditional_cascade_section
              (assignable_operator)
              (assignment_expression_without_cascade
                (cascade_selector
                  (identifier))
                (assignment_operator)
                (identifier)))
            (unconditional_cascade_section
              (assignable_operator)
              (assignment_expression_without_cascade
                (cascade_selector
                  (identifier))
                (assignment_operator)
                (decimal_integer_literal)))))))))

==================
Cascade index assignment section
==================

void main() {
  matrix..[0] = 1;
}

---

(program
  (function_declaration
    (function_signature
      (void_type)
      (identifier)
      (formal_parameter_list))
    (function_body
      (block
        (expression_statement
          (cascade_expression
            (identifier)
            (unconditional_cascade_section
              (assignable_operator)
              (assignment_expression_without_cascade
                (cascade_selector
                  (index_selector
                    (decimal_integer_literal)))
                (assignment_operator)
                (decimal_integer_literal)))))))))

==================
Cascade section index access on a named operand
==================

void main() {
  grid..cells[0] = 2;
}

---

(program
  (function_declaration
    (function_signature
      (void_type)
      (identifier)
      (formal_parameter_list))
    (function_body
      (block
        (expression_statement
          (cascade_expression
            (identifier)
            (unconditional_cascade_section
              (assignable_operator)
              (assignment_expression_without_cascade
                (unconditional_assignable_selector
                  (cascade_selector
                    (identifier))
                  (index_selector
                    (decimal_integer_literal)))
                (assignment_operator)
                (decimal_integer_literal)))))))))

==================
Null-aware cascade section index access
==================

void main() {
  grid..cells?[0] = 3;
}

---

(program
  (function_declaration
    (function_signature
      (void_type)
      (identifier)
      (formal_parameter_list))
    (function_body
      (block
        (expression_statement
          (cascade_expression
            (identifier)
            (unconditional_cascade_section
              (assignable_operator)
              (assignment_expression_without_cascade
                (conditional_assignable_selector
                  (cascade_selector
                    (identifier))
                  (assignable_operator)
                  (index_selector
                    (decimal_integer_literal)))
                (assignment_operator)
                (decimal_integer_literal)))))))))

==================
Chained call on a cascade section index access nests
==================

void main() {
  grid..cells[0].mark();
}

---

(program
  (function_declaration
    (function_signature
      (void_type)
      (identifier)
      (formal_parameter_list))
    (function_body
      (block
        (expression_statement
          (cascade_expression
            (identifier)
            (unconditional_cascade_section
              (assignable_operator)
              (method_invocation
                (unconditional_assignable_selector
                  (unconditional_assignable_selector
                    (cascade_selector
                      (identifier))
                    (index_selector
                      (decimal_integer_literal)))
                  (assignable_operator)
                  (identifier))
                (argument_part
                  (arguments))))))))))

==================
Trailing chained call inside a cascade section nests
==================

void main() {
  buffer..writeln()..toString().trim();
}

---

(program
  (function_declaration
    (function_signature
      (void_type)
      (identifier)
      (formal_parameter_list))
    (function_body
      (block
        (expression_statement
          (cascade_expression
            (identifier)
            (unconditional_cascade_section
              (assignable_operator)
              (method_invocation
                (cascade_selector
                  (identifier))
                (argument_part
                  (arguments))))
            (unconditional_cascade_section
              (assignable_operator)
              (method_invocation
                (unconditional_assignable_selector
                  (method_invocation
                    (cascade_selector
                      (identifier))
                    (argument_part
                      (arguments)))
                  (assignable_operator)
                  (identifier))
                (argument_part
                  (arguments))))))))))

==================
Cascade section with a call then a bare field access
==================

void main() {
  obj..a().b;
}

---

(program
  (function_declaration
    (function_signature
      (void_type)
      (identifier)
      (formal_parameter_list))
    (function_body
      (block
        (expression_statement
          (cascade_expression
            (identifier)
            (unconditional_cascade_section
              (assignable_operator)
              (unconditional_assignable_selector
                (method_invocation
                  (cascade_selector
                    (identifier))
                  (argument_part
                    (arguments)))
                (assignable_operator)
                (identifier)))))))))

==================
Cascade on a call expression
==================

void main() {
  createPaint()..color = color;
}

---

(program
  (function_declaration
    (function_signature
      (void_type)
      (identifier)
      (formal_parameter_list))
    (function_body
      (block
        (expression_statement
          (cascade_expression
            (method_invocation
              (identifier)
              (argument_part
                (arguments)))
            (unconditional_cascade_section
              (assignable_operator)
              (assignment_expression_without_cascade
                (cascade_selector
                  (identifier))
                (assignment_operator)
                (identifier)))))))))

==================
Trailing null assertion in a cascade section is preserved
==================

void main() {
  obj..a!;
}

---

(program
  (function_declaration
    (function_signature
      (void_type)
      (identifier)
      (formal_parameter_list))
    (function_body
      (block
        (expression_statement
          (cascade_expression
            (identifier)
            (unconditional_cascade_section
              (assignable_operator)
              (cascade_selector
                (identifier))
              (null_assertion_operator))))))))
