==========================================
multiple statements
==========================================

var x = {}, z, i = 0;
firstFunction(x)
secondFunction(x);

---

(program
  (var_declaration
    (var_assignment (identifier) (object))
    (identifier)
    (var_assignment (identifier) (number)))
  (expression_statement (function_call (identifier) (arguments (identifier))))
  (expression_statement (function_call (identifier) (arguments (identifier)))))

==========================================
if statements
==========================================

if (isReady()) {
  console.log(theData)
}

---

(program (if_statement (function_call (identifier) (arguments))
  (statement_block (expression_statement
    (function_call (member_access (identifier) (identifier)) (arguments (identifier)))))))

==========================================
if-else statements
==========================================

if (theCondition) {
  firstFunction();
} else {
  secondFunction();
}

---

(program (if_statement
  (identifier)
  (statement_block (expression_statement (function_call (identifier) (arguments))))
  (statement_block (expression_statement (function_call (identifier) (arguments))))))

==================================================
if-else statements with multiple conditions
==================================================

if (firstValue) {
  firstFunction();
} else if (secondValue)
  secondFunction();
else {
  thirdFunction();
}

---

(program (if_statement (identifier)
  (statement_block (expression_statement (function_call (identifier) (arguments))))
  (if_statement (identifier)
    (expression_statement (function_call (identifier) (arguments)))
    (statement_block (expression_statement (function_call (identifier) (arguments)))))))

==========================================
for loops
==========================================

for (var i = 1; someCondition(i); i = next()) {
  doSomething();
}

---

(program (for_statement
  (var_declaration (var_assignment (identifier) (number)))
  (function_call (identifier) (arguments (identifier)))
  (assignment (identifier) (function_call (identifier) (arguments)))
  (statement_block (expression_statement (function_call (identifier) (arguments))))))

==========================================
for-in loops
==========================================

for (var key in someObject)
  doSomething();
for (key in someObject)
  doSomethingElse();

---

(program
  (for_in_statement
    (identifier) (identifier)
    (expression_statement (function_call (identifier) (arguments))))
  (for_in_statement
    (identifier) (identifier)
    (expression_statement (function_call (identifier) (arguments)))))

==========================================
while loops
==========================================

while (someCondition(i)) {
  doSomething();
}

---

(program (while_statement
  (function_call (identifier) (arguments (identifier)))
  (statement_block (expression_statement (function_call (identifier) (arguments))))))

==========================================
try/catch statements
==========================================

try {
  doSomething();
} catch (e) {
  logError(e);
}

try {
  doSomething();
} finally {
  logError();
}

---

(program
  (try_statement
    (statement_block (expression_statement (function_call (identifier) (arguments))))
    (catch (identifier)
      (statement_block (expression_statement (function_call (identifier) (arguments (identifier)))))))
  (try_statement
    (statement_block (expression_statement (function_call (identifier) (arguments))))
    (finally
      (statement_block (expression_statement (function_call (identifier) (arguments)))))))

===========================================
throw statements
===========================================

throw new Error("wtf");

---

(program
  (throw_statement (constructor_call (identifier) (arguments (string)))))

===========================================
indented code after blocks
===========================================

  function x() {}
  return z;

---

(program
  (expression_statement
    (function_expression (identifier) (statement_block)))
  (return_statement (identifier)))

===========================================
switch statements
===========================================

switch(x) {
  case "hello":
    print("one");
    break;
  case z():
    print("two");
    break;
  default:
    print("three");
}

---

(program (switch_statement (identifier)
  (case
    (string)
    (expression_statement (function_call (identifier) (arguments (string))))
    (break_statement))
  (case
    (function_call (identifier) (arguments))
    (expression_statement (function_call (identifier) (arguments (string))))
    (break_statement))
  (default
    (expression_statement (function_call (identifier) (arguments (string)))))))
