===
For-in over array literal
===

for x in [1, 2, 3] {
  print(x)
}

---

source_file
  statement:
    for_statement
      body:
        block
          statement:
            call_expression
              function: simple_identifier "print"
              suffix:
                call_suffix
                  arguments:
                    value_arguments
                      argument:
                        value_argument
                          value: simple_identifier "x"
      collection:
        array_literal
          element:
            integer_literal "1"
            integer_literal "2"
            integer_literal "3"
      item:
        pattern
          bound_identifier: simple_identifier "x"

---

top_level
  body:
    block
      stmt:
        for_each_stmt
          body:
            block
              stmt:
                call_expr
                  argument:
                    argument
                      value:
                        name_expr
                          identifier: identifier "x"
                  callee:
                    name_expr
                      identifier: identifier "print"
          pattern:
            name_pattern
              identifier: identifier "x"
          iterable:
            array_literal
              element:
                int_literal "1"
                int_literal "2"
                int_literal "3"

===
For-in over range
===

for i in 0..<10 {
  print(i)
}

---

source_file
  statement:
    for_statement
      body:
        block
          statement:
            call_expression
              function: simple_identifier "print"
              suffix:
                call_suffix
                  arguments:
                    value_arguments
                      argument:
                        value_argument
                          value: simple_identifier "i"
      collection:
        range_expression
          end: integer_literal "10"
          op: ..<
          start: integer_literal "0"
      item:
        pattern
          bound_identifier: simple_identifier "i"

---

top_level
  body:
    block
      stmt:
        for_each_stmt
          body:
            block
              stmt:
                call_expr
                  argument:
                    argument
                      value:
                        name_expr
                          identifier: identifier "i"
                  callee:
                    name_expr
                      identifier: identifier "print"
          pattern:
            name_pattern
              identifier: identifier "i"
          iterable:
            binary_expr
              operator: infix_operator "..<"
              left: int_literal "0"
              right: int_literal "10"

===
For-in with where clause
===

for x in xs where x > 0 {
  print(x)
}

---

source_file
  statement:
    for_statement
      body:
        block
          statement:
            call_expression
              function: simple_identifier "print"
              suffix:
                call_suffix
                  arguments:
                    value_arguments
                      argument:
                        value_argument
                          value: simple_identifier "x"
      collection: simple_identifier "xs"
      item:
        pattern
          bound_identifier: simple_identifier "x"
      where:
        where_clause
          expr:
            comparison_expression
              lhs: simple_identifier "x"
              op: >
              rhs: integer_literal "0"
          keyword: where_keyword "where"

---

top_level
  body:
    block
      stmt:
        for_each_stmt
          body:
            block
              stmt:
                call_expr
                  argument:
                    argument
                      value:
                        name_expr
                          identifier: identifier "x"
                  callee:
                    name_expr
                      identifier: identifier "print"
          pattern:
            name_pattern
              identifier: identifier "x"
          guard:
            binary_expr
              operator: infix_operator ">"
              left:
                name_expr
                  identifier: identifier "x"
              right: int_literal "0"
          iterable:
            name_expr
              identifier: identifier "xs"

===
While loop
===

while x > 0 {
  x -= 1
}

---

source_file
  statement:
    while_statement
      body:
        block
          statement:
            assignment
              operator: -=
              result: integer_literal "1"
              target:
                directly_assignable_expression
                  expr: simple_identifier "x"
      condition:
        if_condition
          kind:
            comparison_expression
              lhs: simple_identifier "x"
              op: >
              rhs: integer_literal "0"

---

top_level
  body:
    block
      stmt:
        while_stmt
          body:
            block
              stmt:
                compound_assign_expr
                  operator: infix_operator "-="
                  target:
                    name_expr
                      identifier: identifier "x"
                  value: int_literal "1"
          condition:
            binary_expr
              operator: infix_operator ">"
              left:
                name_expr
                  identifier: identifier "x"
              right: int_literal "0"

===
Repeat-while loop
===

repeat {
  x -= 1
} while x > 0

---

source_file
  statement:
    repeat_while_statement
      body:
        block
          statement:
            assignment
              operator: -=
              result: integer_literal "1"
              target:
                directly_assignable_expression
                  expr: simple_identifier "x"
      condition:
        if_condition
          kind:
            comparison_expression
              lhs: simple_identifier "x"
              op: >
              rhs: integer_literal "0"

---

top_level
  body:
    block
      stmt:
        do_while_stmt
          body:
            block
              stmt:
                compound_assign_expr
                  operator: infix_operator "-="
                  target:
                    name_expr
                      identifier: identifier "x"
                  value: int_literal "1"
          condition:
            binary_expr
              operator: infix_operator ">"
              left:
                name_expr
                  identifier: identifier "x"
              right: int_literal "0"

===
Break and continue
===

for x in xs {
  if x < 0 { continue }
  if x > 100 { break }
  print(x)
}

---

source_file
  statement:
    for_statement
      body:
        block
          statement:
            if_statement
              body:
                block
                  statement:
                    control_transfer_statement
                      kind: continue
              condition:
                if_condition
                  kind:
                    comparison_expression
                      lhs: simple_identifier "x"
                      op: <
                      rhs: integer_literal "0"
            if_statement
              body:
                block
                  statement:
                    control_transfer_statement
                      kind: break
              condition:
                if_condition
                  kind:
                    comparison_expression
                      lhs: simple_identifier "x"
                      op: >
                      rhs: integer_literal "100"
            call_expression
              function: simple_identifier "print"
              suffix:
                call_suffix
                  arguments:
                    value_arguments
                      argument:
                        value_argument
                          value: simple_identifier "x"
      collection: simple_identifier "xs"
      item:
        pattern
          bound_identifier: simple_identifier "x"

---

top_level
  body:
    block
      stmt:
        for_each_stmt
          body:
            block
              stmt:
                if_expr
                  condition:
                    binary_expr
                      operator: infix_operator "<"
                      left:
                        name_expr
                          identifier: identifier "x"
                      right: int_literal "0"
                  then:
                    block
                      stmt: continue_expr "continue"
                if_expr
                  condition:
                    binary_expr
                      operator: infix_operator ">"
                      left:
                        name_expr
                          identifier: identifier "x"
                      right: int_literal "100"
                  then:
                    block
                      stmt: break_expr "break"
                call_expr
                  argument:
                    argument
                      value:
                        name_expr
                          identifier: identifier "x"
                  callee:
                    name_expr
                      identifier: identifier "print"
          pattern:
            name_pattern
              identifier: identifier "x"
          iterable:
            name_expr
              identifier: identifier "xs"
