==================
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
        (identifier)
        (cascade_section
          (cascade_selector
            (identifier))
          (argument_part
            (arguments
              (argument
                (string_literal)))))
        (cascade_section
          (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
        (identifier)
        (cascade_section
          (cascade_selector
            (identifier))
          (argument_part
            (arguments)))
        (cascade_section
          (cascade_selector
            (identifier))
          (argument_part
            (arguments)))))))

==================
Cascade assignment sections stay cascade sections
==================

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

---

(program
  (function_signature
    (void_type)
    (identifier)
    (formal_parameter_list))
  (function_body
    (block
      (expression_statement
        (identifier)
        (cascade_section
          (cascade_selector
            (identifier))
          (identifier))
        (cascade_section
          (cascade_selector
            (identifier))
          (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
        (identifier)
        (cascade_section
          (cascade_selector
            (index_selector
              (decimal_integer_literal)))
          (decimal_integer_literal))))))

==================
Trailing chained call inside a cascade section stays flat
==================

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

---

(program
  (function_signature
    (void_type)
    (identifier)
    (formal_parameter_list))
  (function_body
    (block
      (expression_statement
        (identifier)
        (cascade_section
          (cascade_selector
            (identifier))
          (argument_part
            (arguments)))
        (cascade_section
          (cascade_selector
            (identifier))
          (argument_part
            (arguments))
          (unconditional_assignable_selector
            (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
        (identifier)
        (cascade_section
          (cascade_selector
            (identifier))
          (argument_part
            (arguments))
          (unconditional_assignable_selector
            (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
        (method_invocation
          (identifier)
          (argument_part
            (arguments)))
        (cascade_section
          (cascade_selector
            (identifier))
          (identifier))))))
