==================
Bare field access folds into an assignable selector
==================

void main() {
  hello.hi;
}

---

(program
  (function_signature
    (void_type)
    (identifier)
    (formal_parameter_list))
  (function_body
    (block
      (expression_statement
        (unconditional_assignable_selector
          (identifier)
          (assignable_operator)
          (identifier))))))

==================
Multi-segment field access nests left-associatively
==================

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

---

(program
  (function_signature
    (void_type)
    (identifier)
    (formal_parameter_list))
  (function_body
    (block
      (expression_statement
        (unconditional_assignable_selector
          (unconditional_assignable_selector
            (identifier)
            (assignable_operator)
            (identifier))
          (assignable_operator)
          (identifier))))))

==================
Field access after a call folds
==================

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

---

(program
  (function_signature
    (void_type)
    (identifier)
    (formal_parameter_list))
  (function_body
    (block
      (expression_statement
        (unconditional_assignable_selector
          (method_invocation
            (unconditional_assignable_selector
              (identifier)
              (assignable_operator)
              (identifier))
            (argument_part
              (arguments)))
          (assignable_operator)
          (identifier))))))

==================
Non-null assertion field access folds
==================

void main() {
  directory!.path;
}

---

(program
  (function_signature
    (void_type)
    (identifier)
    (formal_parameter_list))
  (function_body
    (block
      (expression_statement
        (unconditional_assignable_selector
          (identifier)
          (null_assertion_operator)
          (assignable_operator)
          (identifier))))))

==================
Bare index access folds into an assignable selector
==================

void main() {
  a[0];
}

---

(program
  (function_signature
    (void_type)
    (identifier)
    (formal_parameter_list))
  (function_body
    (block
      (expression_statement
        (unconditional_assignable_selector
          (identifier)
          (index_selector
            (decimal_integer_literal)))))))

==================
Chained index access nests left-associatively
==================

void main() {
  a[0][1];
}

---

(program
  (function_signature
    (void_type)
    (identifier)
    (formal_parameter_list))
  (function_body
    (block
      (expression_statement
        (unconditional_assignable_selector
          (unconditional_assignable_selector
            (identifier)
            (index_selector
              (decimal_integer_literal)))
          (index_selector
            (decimal_integer_literal)))))))

==================
Null-aware index access stays a flat selector chain
==================

void main() {
  list?[0];
}

---

(program
  (function_signature
    (void_type)
    (identifier)
    (formal_parameter_list))
  (function_body
    (block
      (expression_statement
        (identifier)
        (selector
          (conditional_assignable_selector
            (index_selector
              (decimal_integer_literal))))))))

==================
Parenthesized-cast receiver on an assignment LHS folds into the selector
==================

void main() {
  (employee as Person).firstName = 'Bob';
}

---

(program
  (function_signature
    (void_type)
    (identifier)
    (formal_parameter_list))
  (function_body
    (block
      (expression_statement
        (assignment_expression
          (assignable_expression
            (unconditional_assignable_selector
              (parenthesized_expression
                (type_cast_expression
                  (identifier)
                  (type_cast
                    (as_operator)
                    (type_identifier))))
              (assignable_operator)
              (identifier)))
          (string_literal))))))

==================
Index target with a member-access receiver folds on the assignment LHS
==================

void main() {
  req.body['password'] = x;
}

---

(program
  (function_signature
    (void_type)
    (identifier)
    (formal_parameter_list))
  (function_body
    (block
      (expression_statement
        (assignment_expression
          (assignable_expression
            (unconditional_assignable_selector
              (unconditional_assignable_selector
                (identifier)
                (assignable_operator)
                (identifier))
              (index_selector
                (string_literal))))
          (identifier))))))

==================
Conditional member target folds on the assignment LHS
==================

void main() {
  obj?.field = value;
}

---

(program
  (function_signature
    (void_type)
    (identifier)
    (formal_parameter_list))
  (function_body
    (block
      (expression_statement
        (assignment_expression
          (assignable_expression
            (conditional_assignable_selector
              (identifier)
              (assignable_operator)
              (identifier)))
          (identifier))))))

==================
Simple index target folds on the assignment LHS
==================

void main() {
  list[0] = value;
}

---

(program
  (function_signature
    (void_type)
    (identifier)
    (formal_parameter_list))
  (function_body
    (block
      (expression_statement
        (assignment_expression
          (assignable_expression
            (unconditional_assignable_selector
              (identifier)
              (index_selector
                (decimal_integer_literal))))
          (identifier))))))

==================
Index-then-member target folds the index decoration into the selector
==================

void main() {
  items[0].label = value;
}

---

(program
  (function_signature
    (void_type)
    (identifier)
    (formal_parameter_list))
  (function_body
    (block
      (expression_statement
        (assignment_expression
          (assignable_expression
            (unconditional_assignable_selector
              (identifier)
              (index_selector
                (decimal_integer_literal))
              (assignable_operator)
              (identifier)))
          (identifier))))))

==================
Chained index target nests left-associatively on the assignment LHS
==================

void main() {
  grid[0][1] = value;
}

---

(program
  (function_signature
    (void_type)
    (identifier)
    (formal_parameter_list))
  (function_body
    (block
      (expression_statement
        (assignment_expression
          (assignable_expression
            (unconditional_assignable_selector
              (unconditional_assignable_selector
                (identifier)
                (index_selector
                  (decimal_integer_literal)))
              (index_selector
                (decimal_integer_literal))))
          (identifier))))))

==================
Super-qualified member target folds on the assignment LHS
==================

class A {
  void m() {
    super.value = x;
  }
}

---

(program
  (class_definition
    (identifier)
    (class_body
      (method_signature
        (function_signature
          (void_type)
          (identifier)
          (formal_parameter_list)))
      (function_body
        (block
          (expression_statement
            (assignment_expression
              (assignable_expression
                (unconditional_assignable_selector
                  (super)
                  (assignable_operator)
                  (identifier)))
              (identifier))))))))

==================
Conditional index target stays unfolded on the assignment LHS
==================

void main() {
  list?[0] = value;
}

---

(program
  (function_signature
    (void_type)
    (identifier)
    (formal_parameter_list))
  (function_body
    (block
      (expression_statement
        (assignment_expression
          (assignable_expression
            (identifier)
            (conditional_assignable_selector
              (index_selector
                (decimal_integer_literal))))
          (identifier))))))
