==================
Closure expression
==================

fn main() {
    let add = |a, b| a + b;
}

---

(source_file
  (function_item
    name: (identifier)
    parameters: (parameters)
    body: (block
      (let_declaration
        pattern: (identifier)
        value: (closure_expression
          parameters: (closure_parameters
            (identifier)
            (identifier))
          body: (binary_expression
            left: (identifier)
            right: (identifier)))))))

==================
Index expression
==================

fn main() {
    let first = items[0];
}

---

(source_file
  (function_item
    name: (identifier)
    parameters: (parameters)
    body: (block
      (let_declaration
        pattern: (identifier)
        value: (index_expression
          (identifier)
          (integer_literal))))))

==================
Macro invocation
==================

fn main() {
    println!("hello");
}

---

(source_file
  (function_item
    name: (identifier)
    parameters: (parameters)
    body: (block
      (expression_statement
        (macro_invocation
          macro: (identifier)
          arguments: (arguments
            (string_literal
              (string_content))))))))

==================
Method chain call
==================

pub fn refresh() {
    let items = [];
    items.push(Item::new("id", "name", "cmd")
        .description("desc")
        .icon("icon"));
    items
}

---

(source_file
  (function_item
    (visibility_modifier)
    name: (identifier)
    parameters: (parameters)
    body: (block
      (let_declaration
        pattern: (identifier)
        value: (array_expression))
      (expression_statement
        (call_expression
          function: (field_expression
            value: (identifier)
            field: (field_identifier))
          arguments: (arguments
            (call_expression
              function: (field_expression
                value: (call_expression
                  function: (field_expression
                    value: (call_expression
                      function: (scoped_identifier
                        path: (identifier)
                        name: (identifier))
                      arguments: (arguments
                        (string_literal
                          (string_content))
                        (string_literal
                          (string_content))
                        (string_literal
                          (string_content))))
                    field: (field_identifier))
                  arguments: (arguments
                    (string_literal
                      (string_content))))
                field: (field_identifier))
              arguments: (arguments
                (string_literal
                  (string_content)))))))
      (identifier))))

==================
Is expression
==================

fn check(value) {
    if value is String {
        true
    }
}

---

(source_file
  (function_item
    name: (identifier)
    parameters: (parameters
      (identifier))
    body: (block
      (expression_statement
        (if_expression
          condition: (is_expression
            left: (identifier)
            right: (identifier))
          consequence: (block
            (boolean_literal)))))))
