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

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

---

(program
  (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_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_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_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_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_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_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_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_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_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_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)))))))
