==================
Malformed async targets preserve following code
==================
flow first:
  async run
  run after
  let job = async run worker extra
  let async run -> Text:
  run finish

flow second:
  run complete

---

(program
  (flow
    (runnable_name)
    (newline)
    (flow_body
      (run_statement
        (invalid_run_target
          (newline)))
      (run_statement
        (runnable_name)
        (newline))
      (let_statement
        (local_name)
        (run_statement
          (invalid_run_target
            (runnable_name)
            (text)
            (newline))))
      (let_statement
        (run_statement
          (inline_agic
            (type
              (builtin_type))
            (newline)
            (content
              (invalid_missing_content)))))
      (run_statement
        (runnable_name)
        (newline))
      (blank_line)))
  (flow
    (runnable_name)
    (newline)
    (flow_body
      (run_statement
        (runnable_name)
        (newline)))))

==================
Async run targets and binding wrappers
==================
flow launch:
  let async_note = A launch description.
  let await_note = A waiting description.
  run worker
  async run worker
  let job = async run worker
  let async run worker
  async run: Research {{_}}.
  let job = async run -> Text: Research {{_}}.
  let async run:
    async and await remain literal.

---

(program
  (flow
    (runnable_name)
    (newline)
    (flow_body
      (let_statement
        (local_name)
        (content
          (text))
        (newline))
      (let_statement
        (local_name)
        (content
          (text))
        (newline))
      (run_statement
        (runnable_name)
        (newline))
      (run_statement
        (runnable_name)
        (newline))
      (let_statement
        (local_name)
        (run_statement
          (runnable_name)
          (newline)))
      (let_statement
        (run_statement
          (runnable_name)
          (newline)))
      (run_statement
        (inline_agic
          (content
            (text))
          (newline)))
      (let_statement
        (local_name)
        (run_statement
          (inline_agic
            (type
              (builtin_type))
            (content
              (text))
            (newline))))
      (let_statement
        (run_statement
          (inline_agic
            (newline)
            (content
              (text)
              (newline))))))))

==================
Await handles and result binding wrappers
==================
flow launch:
  await h
  let x = await h
  let await h
  let h = await h
  let await_note = await async_job

---

(program
  (flow
    (runnable_name)
    (newline)
    (flow_body
      (await_statement
        (handle_name)
        (newline))
      (let_statement
        (local_name)
        (await_statement
          (handle_name)
          (newline)))
      (let_statement
        (await_statement
          (handle_name)
          (newline)))
      (let_statement
        (local_name)
        (await_statement
          (handle_name)
          (newline)))
      (let_statement
        (local_name)
        (await_statement
          (handle_name)
          (newline))))))

==================
Async inline text and await preserve repeat boundaries
==================
flow launch:
  repeat 2 times:
    let job = async run -> Finding[]:
      Research {{_}}.
      await job remains literal.
    await job # Write the result to the current value.
    until: Ready.
  run finish

---

(program
  (flow
    (runnable_name)
    (newline)
    (flow_body
      (repeat_statement
        (integer_literal)
        (newline)
        (repeat_body
          (let_statement
            (local_name)
            (run_statement
              (inline_agic
                (type
                  (type_name))
                (newline)
                (content
                  (text)
                  (newline)
                  (text)
                  (newline)))))
          (await_statement
            (handle_name)
            (plain_comment)
            (newline))
          (until_clause
            (inline_agic
              (content
                (text))
              (newline)))))
      (run_statement
        (runnable_name)
        (newline)))))

==================
Spawn handles use ordinary await binding wrappers
==================
flow launch:
  let job = spawn research
  await job
  let result = await job
  let await job
  let job = await job

---

(program
  (flow
    (runnable_name)
    (newline)
    (flow_body
      (let_statement
        (local_name)
        (spawn_statement
          (runnable_name)
          (newline)))
      (await_statement
        (handle_name)
        (newline))
      (let_statement
        (local_name)
        (await_statement
          (handle_name)
          (newline)))
      (let_statement
        (await_statement
          (handle_name)
          (newline)))
      (let_statement
        (local_name)
        (await_statement
          (handle_name)
          (newline))))))

==================
Primary input cannot be an operation or await handle
==================
flow launch:
  _
  let value = _
  await _
  let result = await _
  run after

---

(program
  (flow
    (runnable_name)
    (newline)
    (flow_body
      (invalid_flow_statement
        (newline))
      (invalid_flow_statement
        (local_name)
        (newline))
      (invalid_flow_statement
        (text)
        (newline))
      (let_statement
        (local_name)
        (invalid_flow_statement
          (text)
          (newline)))
      (run_statement
        (runnable_name)
        (newline)))))
