===
Let binding
===

let x = 1

---

source_file
  statement:
    property_declaration
      binding:
        value_binding_pattern
          mutability: let
      declarator:
        property_binding
          name:
            pattern
              bound_identifier: simple_identifier "x"
          value: integer_literal "1"

---

top_level
  body:
    block
      stmt:
        variable_declaration
          modifier: modifier "let"
          pattern:
            name_pattern
              identifier: identifier "x"
          value: int_literal "1"

===
Var binding
===

var x = 1

---

source_file
  statement:
    property_declaration
      binding:
        value_binding_pattern
          mutability: var
      declarator:
        property_binding
          name:
            pattern
              bound_identifier: simple_identifier "x"
          value: integer_literal "1"

---

top_level
  body:
    block
      stmt:
        variable_declaration
          modifier: modifier "var"
          pattern:
            name_pattern
              identifier: identifier "x"
          value: int_literal "1"

===
Let with type annotation
===

let x: Int = 1

---

source_file
  statement:
    property_declaration
      binding:
        value_binding_pattern
          mutability: let
      declarator:
        property_binding
          name:
            pattern
              bound_identifier: simple_identifier "x"
          type:
            type_annotation
              type:
                type
                  name:
                    user_type
                      part:
                        simple_user_type
                          name: type_identifier "Int"
          value: integer_literal "1"

---

top_level
  body:
    block
      stmt:
        variable_declaration
          modifier: modifier "let"
          pattern:
            name_pattern
              identifier: identifier "x"
          type:
            named_type_expr
              name: identifier "Int"
          value: int_literal "1"

===
Var without initialiser
===

var x: Int

---

source_file
  statement:
    property_declaration
      binding:
        value_binding_pattern
          mutability: var
      declarator:
        property_binding
          name:
            pattern
              bound_identifier: simple_identifier "x"
          type:
            type_annotation
              type:
                type
                  name:
                    user_type
                      part:
                        simple_user_type
                          name: type_identifier "Int"

---

top_level
  body:
    block
      stmt:
        variable_declaration
          modifier: modifier "var"
          pattern:
            name_pattern
              identifier: identifier "x"
          type:
            named_type_expr
              name: identifier "Int"

===
Tuple destructuring binding
===

let (a, b) = pair

---

source_file
  statement:
    property_declaration
      binding:
        value_binding_pattern
          mutability: let
      declarator:
        property_binding
          name:
            pattern
              kind:
                tuple_pattern
                  item:
                    tuple_pattern_item
                      pattern:
                        pattern
                          kind: simple_identifier "a"
                    tuple_pattern_item
                      pattern:
                        pattern
                          kind: simple_identifier "b"
          value: simple_identifier "pair"

---

top_level
  body:
    block
      stmt:
        variable_declaration
          modifier: modifier "let"
          pattern:
            tuple_pattern
              element:
                pattern_element
                  pattern:
                    expr_equality_pattern
                      expr:
                        name_expr
                          identifier: identifier "a"
                pattern_element
                  pattern:
                    expr_equality_pattern
                      expr:
                        name_expr
                          identifier: identifier "b"
          value:
            name_expr
              identifier: identifier "pair"

===
Multiple bindings on one line
===

let x = 1, y = 2

---

source_file
  statement:
    property_declaration
      binding:
        value_binding_pattern
          mutability: let
      declarator:
        property_binding
          name:
            pattern
              bound_identifier: simple_identifier "x"
          value: integer_literal "1"
        property_binding
          name:
            pattern
              bound_identifier: simple_identifier "y"
          value: integer_literal "2"

---

top_level
  body:
    block
      stmt:
        variable_declaration
          modifier: modifier "let"
          pattern:
            name_pattern
              identifier: identifier "x"
          value: int_literal "1"
        variable_declaration
          modifier:
            modifier "let"
            modifier "chained_declaration"
          pattern:
            name_pattern
              identifier: identifier "y"
          value: int_literal "2"

===
Assignment
===

x = 1

---

source_file
  statement:
    assignment
      operator: =
      result: integer_literal "1"
      target:
        directly_assignable_expression
          expr: simple_identifier "x"

---

top_level
  body:
    block
      stmt:
        assign_expr
          target:
            name_expr
              identifier: identifier "x"
          value: int_literal "1"

===
Compound assignment
===

x += 1

---

source_file
  statement:
    assignment
      operator: +=
      result: integer_literal "1"
      target:
        directly_assignable_expression
          expr: simple_identifier "x"

---

top_level
  body:
    block
      stmt:
        compound_assign_expr
          operator: infix_operator "+="
          target:
            name_expr
              identifier: identifier "x"
          value: int_literal "1"
