==================
primary prefix
==================

discard bind static var ref ptr distinct out type a
discard a- + /a

---

(module
  (stmt
    (discardStmt
      (keyw)
      (expr
        (primary
          (primaryPrefix
            (keyw))
          (primaryPrefix
            (keyw))
          (primaryPrefix
            (keyw))
          (primaryPrefix
            (keyw))
          (primaryPrefix
            (keyw))
          (primaryPrefix
            (keyw))
          (primaryPrefix
            (keyw))
          (primaryPrefix
            (keyw))
          (symbol
            (ident))))))
  (stmt
    (discardStmt
      (keyw)
      (expr
        (primary
          (symbol
            (ident)))
        (operator)
        (primary
          (primaryPrefix
            (prefixOperator
              (operator)))
          (primaryPrefix
            (prefixOperator
              (operator)))
          (symbol
            (ident)))))))

==================
functionCall
==================

discard a()
discard a(a)
discard a(a=9, b, c)

---

(module
  (stmt
    (discardStmt
      (keyw)
      (expr
        (primary
          (symbol
            (ident))
          (primarySuffix
            (functionCall))))))
  (stmt
    (discardStmt
      (keyw)
      (expr
        (primary
          (symbol
            (ident))
          (primarySuffix
            (functionCall
              (symbolEqExprList
                (symbolEqExpr
                  (expr
                    (primary
                      (symbol
                        (ident))))))))))))
  (stmt
    (discardStmt
      (keyw)
      (expr
        (primary
          (symbol
            (ident))
          (primarySuffix
            (functionCall
              (symbolEqExprList
                (symbolEqExpr
                  (symbol
                    (ident))
                  (expr
                    (primary
                      (literal
                        (int_lit)))))
                (symbolEqExpr
                  (expr
                    (primary
                      (symbol
                        (ident)))))
                (symbolEqExpr
                  (expr
                    (primary
                      (symbol
                        (ident)))))))))))))

==================
qualifiedSuffix
==================

discard a.a
discard a . a
discard a.:a

---

(module
  (stmt
    (discardStmt
      (keyw)
      (expr
        (primary
          (symbol
            (ident))
          (primarySuffix
            (qualifiedSuffix
              (symbol
                (ident))))))))
  (stmt
    (discardStmt
      (keyw)
      (expr
        (primary
          (symbol
            (ident))
          (primarySuffix
            (qualifiedSuffix
              (symbol
                (ident))))))))
  (stmt
    (discardStmt
      (keyw)
      (expr
        (primary
          (symbol
            (ident)))
        (operator)
        (primary
          (symbol
            (ident)))))))

==================
indexSuffix
==================

discard a[0]
discard a.a[:0]
discard a[int, int]()

---

(module
  (stmt
    (discardStmt
      (keyw)
      (expr
        (primary
          (symbol
            (ident))
          (primarySuffix
            (indexSuffix
              (exprColonEqExprList
                (exprColonEqExpr
                  (expr
                    (primary
                      (literal
                        (int_lit))))))))))))
  (stmt
    (discardStmt
      (keyw)
      (expr
        (primary
          (symbol
            (ident))
          (primarySuffix
            (qualifiedSuffix
              (symbol
                (ident))))
          (primarySuffix
            (indexSuffix
              (exprColonEqExprList
                (exprColonEqExpr
                  (expr
                    (primary
                      (literal
                        (int_lit))))))))))))
  (stmt
    (discardStmt
      (keyw)
      (expr
        (primary
          (symbol
            (ident))
          (primarySuffix
            (indexSuffix
              (exprColonEqExprList
                (exprColonEqExpr
                  (expr
                    (primary
                      (symbol
                        (ident)))))
                (exprColonEqExpr
                  (expr
                    (primary
                      (symbol
                        (ident))))))))
          (primarySuffix
            (functionCall)))))))

==================
primarySuffix combination
==================

a(b).c
a(b)[c]
a(b)(c)
a[b].c
a[b][c]
a[b](c)
a.b.c
a.b[c]
a.b(c)
d a.c
d a[c]
d a(c)
a.c d
a[c] d
a(c) d

---

(module
  (stmt
    (exprStmt
      (primary
        (symbol
          (ident))
        (primarySuffix
          (functionCall
            (symbolEqExprList
              (symbolEqExpr
                (expr
                  (primary
                    (symbol
                      (ident))))))))
        (primarySuffix
          (qualifiedSuffix
            (symbol
              (ident)))))))
  (stmt
    (exprStmt
      (primary
        (symbol
          (ident))
        (primarySuffix
          (functionCall
            (symbolEqExprList
              (symbolEqExpr
                (expr
                  (primary
                    (symbol
                      (ident))))))))
        (primarySuffix
          (indexSuffix
            (exprColonEqExprList
              (exprColonEqExpr
                (expr
                  (primary
                    (symbol
                      (ident)))))))))))
  (stmt
    (exprStmt
      (primary
        (symbol
          (ident))
        (primarySuffix
          (functionCall
            (symbolEqExprList
              (symbolEqExpr
                (expr
                  (primary
                    (symbol
                      (ident))))))))
        (primarySuffix
          (functionCall
            (symbolEqExprList
              (symbolEqExpr
                (expr
                  (primary
                    (symbol
                      (ident)))))))))))
  (stmt
    (exprStmt
      (primary
        (symbol
          (ident))
        (primarySuffix
          (indexSuffix
            (exprColonEqExprList
              (exprColonEqExpr
                (expr
                  (primary
                    (symbol
                      (ident))))))))
        (primarySuffix
          (qualifiedSuffix
            (symbol
              (ident)))))))
  (stmt
    (exprStmt
      (primary
        (symbol
          (ident))
        (primarySuffix
          (indexSuffix
            (exprColonEqExprList
              (exprColonEqExpr
                (expr
                  (primary
                    (symbol
                      (ident))))))))
        (primarySuffix
          (indexSuffix
            (exprColonEqExprList
              (exprColonEqExpr
                (expr
                  (primary
                    (symbol
                      (ident)))))))))))
  (stmt
    (exprStmt
      (primary
        (symbol
          (ident))
        (primarySuffix
          (indexSuffix
            (exprColonEqExprList
              (exprColonEqExpr
                (expr
                  (primary
                    (symbol
                      (ident))))))))
        (primarySuffix
          (functionCall
            (symbolEqExprList
              (symbolEqExpr
                (expr
                  (primary
                    (symbol
                      (ident)))))))))))
  (stmt
    (exprStmt
      (primary
        (symbol
          (ident))
        (primarySuffix
          (qualifiedSuffix
            (symbol
              (ident))))
        (primarySuffix
          (qualifiedSuffix
            (symbol
              (ident)))))))
  (stmt
    (exprStmt
      (primary
        (symbol
          (ident))
        (primarySuffix
          (qualifiedSuffix
            (symbol
              (ident))))
        (primarySuffix
          (indexSuffix
            (exprColonEqExprList
              (exprColonEqExpr
                (expr
                  (primary
                    (symbol
                      (ident)))))))))))
  (stmt
    (exprStmt
      (primary
        (symbol
          (ident))
        (primarySuffix
          (qualifiedSuffix
            (symbol
              (ident))))
        (primarySuffix
          (functionCall
            (symbolEqExprList
              (symbolEqExpr
                (expr
                  (primary
                    (symbol
                      (ident)))))))))))
  (stmt
    (exprStmt
      (primary
        (symbol
          (ident))
        (primarySuffix
          (cmdCall
            (expr
              (primary
                (symbol
                  (ident))
                (primarySuffix
                  (qualifiedSuffix
                    (symbol
                      (ident)))))))))))
  (stmt
    (exprStmt
      (primary
        (symbol
          (ident))
        (primarySuffix
          (cmdCall
            (expr
              (primary
                (symbol
                  (ident))
                (primarySuffix
                  (indexSuffix
                    (exprColonEqExprList
                      (exprColonEqExpr
                        (expr
                          (primary
                            (symbol
                              (ident)))))))))))))))
  (stmt
    (exprStmt
      (primary
        (symbol
          (ident))
        (primarySuffix
          (cmdCall
            (expr
              (primary
                (symbol
                  (ident))
                (primarySuffix
                  (functionCall
                    (symbolEqExprList
                      (symbolEqExpr
                        (expr
                          (primary
                            (symbol
                              (ident)))))))))))))))
  (stmt
    (exprStmt
      (primary
        (symbol
          (ident))
        (primarySuffix
          (qualifiedSuffix
            (symbol
              (ident))))
        (primarySuffix
          (cmdCall
            (expr
              (primary
                (symbol
                  (ident)))))))))
  (stmt
    (exprStmt
      (primary
        (symbol
          (ident))
        (primarySuffix
          (indexSuffix
            (exprColonEqExprList
              (exprColonEqExpr
                (expr
                  (primary
                    (symbol
                      (ident))))))))
        (primarySuffix
          (cmdCall
            (expr
              (primary
                (symbol
                  (ident)))))))))
  (stmt
    (exprStmt
      (primary
        (symbol
          (ident))
        (primarySuffix
          (functionCall
            (symbolEqExprList
              (symbolEqExpr
                (expr
                  (primary
                    (symbol
                      (ident))))))))
        (primarySuffix
          (cmdCall
            (expr
              (primary
                (symbol
                  (ident))))))))))

==================
patternBind
==================

discard a{x}

---

(module
  (stmt
    (discardStmt
      (keyw)
      (expr
        (primary
          (symbol
            (ident))
          (primarySuffix
            (patternBind
              (exprColonEqExprList
                (exprColonEqExpr
                  (expr
                    (primary
                      (symbol
                        (ident)))))))))))))

==================
castExpr
==================

discard cast[Foo](1)
discard cast[int](x)

---

(module
  (stmt
    (discardStmt
      (keyw)
      (expr
        (primary
          (castExpr
            (typeDesc
              (primaryTypeDesc
                (symbol
                  (ident))))
            (expr
              (primary
                (literal
                  (int_lit)))))))))
  (stmt
    (discardStmt
      (keyw)
      (expr
        (primary
          (castExpr
            (typeDesc
              (primaryTypeDesc
                (symbol
                  (ident))))
            (expr
              (primary
                (symbol
                  (ident))))))))))

==================
routineExpr
==================

discard proc (x: int, y, z: int) = discard
discard proc (x = 5, y: int = 6): int {.inline.} =
  discard true
  discard true
discard func = discard
discard iterator = discard

---

(module
  (stmt
    (discardStmt
      (keyw)
      (expr
        (primary
          (routineExpr
            (keyw)
            (paramList
              (paramColonEquals
                (symbol
                  (ident))
                (typeDesc
                  (primaryTypeDesc
                    (symbol
                      (ident)))))
              (paramColonEquals
                (symbol
                  (ident))
                (symbol
                  (ident))
                (typeDesc
                  (primaryTypeDesc
                    (symbol
                      (ident))))))
            (block
              (discardStmt
                (keyw))))))))
  (stmt
    (discardStmt
      (keyw)
      (expr
        (primary
          (routineExpr
            (keyw)
            (paramList
              (paramColonEquals
                (symbol
                  (ident))
                (expr
                  (primary
                    (literal
                      (int_lit)))))
              (paramColonEquals
                (symbol
                  (ident))
                (typeDesc
                  (primaryTypeDesc
                    (symbol
                      (ident))))
                (expr
                  (primary
                    (literal
                      (int_lit))))))
            (paramListColon
              (typeDesc
                (primaryTypeDesc
                  (symbol
                    (ident)))))
            (pragma
              (exprColonEqExpr
                (expr
                  (primary
                    (symbol
                      (ident))))))
            (block
              (stmt
                (discardStmt
                  (keyw)
                  (expr
                    (primary
                      (literal
                        (bool_lit))))))
              (stmt
                (discardStmt
                  (keyw)
                  (expr
                    (primary
                      (literal
                        (bool_lit))))))))))))
  (stmt
    (discardStmt
      (keyw)
      (expr
        (primary
          (routineExpr
            (keyw)
            (block
              (discardStmt
                (keyw))))))))
  (stmt
    (discardStmt
      (keyw)
      (expr
        (primary
          (routineExpr
            (keyw)
            (block
              (discardStmt
                (keyw)))))))))

==================
cmdCall
==================

echo "hi"
echo "hi", test "hi"
echo test "hi", "hi", test "hi", "hi"

---

(module
  (stmt
    (exprStmt
      (primary
        (symbol
          (ident))
        (primarySuffix
          (cmdCall
            (expr
              (primary
                (literal
                  (str_lit)))))))))
  (stmt
    (exprStmt
      (primary
        (symbol
          (ident))
        (primarySuffix
          (cmdCall
            (expr
              (primary
                (literal
                  (str_lit))))
            (expr
              (primary
                (symbol
                  (ident))
                (primarySuffix
                  (cmdCall
                    (expr
                      (primary
                        (literal
                          (str_lit)))))))))))))
  (stmt
    (exprStmt
      (primary
        (symbol
          (ident))
        (primarySuffix
          (cmdCall
            (expr
              (primary
                (symbol
                  (ident))
                (primarySuffix
                  (cmdCall
                    (expr
                      (primary
                        (literal
                          (str_lit))))))))
            (expr
              (primary
                (literal
                  (str_lit))))
            (expr
              (primary
                (symbol
                  (ident))
                (primarySuffix
                  (cmdCall
                    (expr
                      (primary
                        (literal
                          (str_lit))))))))
            (expr
              (primary
                (literal
                  (str_lit))))))))))

==================
cmdCall tupleConstr disambiguation
==================

echo()            # function call
echo ()            # tuple
echo(1, 2)            # function call
echo (1, 2)            # function call
echo (a: 1,b: 2)      # tuple
echo(1)               # function call
echo (1)              # function call
echo (1,)              # tuple
echo (a: 1)           # tuple, no trailing comma, still tuple
echo((1,2))           # tuple
echo ((1,2))           # tuple
echo(((1,2),),)           # double tuple
echo (((1,2),),)           # triple tuple

---

(module
  (stmt
    (exprStmt
      (primary
        (symbol
          (ident))
        (primarySuffix
          (functionCall))))
    (comment))
  (stmt
    (exprStmt
      (primary
        (symbol
          (ident))
        (primarySuffix
          (cmdCall
            (expr
              (primary
                (tupleConstr)))))))
    (comment))
  (stmt
    (exprStmt
      (primary
        (symbol
          (ident))
        (primarySuffix
          (functionCall
            (symbolEqExprList
              (symbolEqExpr
                (expr
                  (primary
                    (literal
                      (int_lit)))))
              (symbolEqExpr
                (expr
                  (primary
                    (literal
                      (int_lit))))))))))
    (comment))
  (stmt
    (exprStmt
      (primary
        (symbol
          (ident))
        (primarySuffix
          (cmdCall
            (expr
              (primary
                (tupleConstr
                  (symbolColonExpr
                    (expr
                      (primary
                        (literal
                          (int_lit)))))
                  (symbolColonExpr
                    (expr
                      (primary
                        (literal
                          (int_lit))))))))))))
    (comment))
  (stmt
    (exprStmt
      (primary
        (symbol
          (ident))
        (primarySuffix
          (cmdCall
            (expr
              (primary
                (tupleConstr
                  (symbolColonExpr
                    (symbol
                      (ident))
                    (expr
                      (primary
                        (literal
                          (int_lit)))))
                  (symbolColonExpr
                    (symbol
                      (ident))
                    (expr
                      (primary
                        (literal
                          (int_lit))))))))))))
    (comment))
  (stmt
    (exprStmt
      (primary
        (symbol
          (ident))
        (primarySuffix
          (functionCall
            (symbolEqExprList
              (symbolEqExpr
                (expr
                  (primary
                    (literal
                      (int_lit))))))))))
    (comment))
  (stmt
    (exprStmt
      (primary
        (symbol
          (ident))
        (primarySuffix
          (functionCall
            (symbolEqExprList
              (symbolEqExpr
                (expr
                  (primary
                    (literal
                      (int_lit))))))))))
    (comment))
  (stmt
    (exprStmt
      (primary
        (symbol
          (ident))
        (primarySuffix
          (cmdCall
            (expr
              (primary
                (tupleConstr
                  (symbolColonExpr
                    (expr
                      (primary
                        (literal
                          (int_lit))))))))))))
    (comment))
  (stmt
    (exprStmt
      (primary
        (symbol
          (ident))
        (primarySuffix
          (cmdCall
            (expr
              (primary
                (tupleConstr
                  (symbolColonExpr
                    (symbol
                      (ident))
                    (expr
                      (primary
                        (literal
                          (int_lit))))))))))))
    (comment))
  (stmt
    (exprStmt
      (primary
        (symbol
          (ident))
        (primarySuffix
          (functionCall
            (symbolEqExprList
              (symbolEqExpr
                (expr
                  (primary
                    (tupleConstr
                      (symbolColonExpr
                        (expr
                          (primary
                            (literal
                              (int_lit)))))
                      (symbolColonExpr
                        (expr
                          (primary
                            (literal
                              (int_lit))))))))))))))
    (comment))
  (stmt
    (exprStmt
      (primary
        (symbol
          (ident))
        (primarySuffix
          (functionCall
            (symbolEqExprList
              (symbolEqExpr
                (expr
                  (primary
                    (tupleConstr
                      (symbolColonExpr
                        (expr
                          (primary
                            (literal
                              (int_lit)))))
                      (symbolColonExpr
                        (expr
                          (primary
                            (literal
                              (int_lit))))))))))))))
    (comment))
  (stmt
    (exprStmt
      (primary
        (symbol
          (ident))
        (primarySuffix
          (functionCall
            (symbolEqExprList
              (symbolEqExpr
                (expr
                  (primary
                    (tupleConstr
                      (symbolColonExpr
                        (expr
                          (primary
                            (tupleConstr
                              (symbolColonExpr
                                (expr
                                  (primary
                                    (literal
                                      (int_lit)))))
                              (symbolColonExpr
                                (expr
                                  (primary
                                    (literal
                                      (int_lit))))))))))))))))))
    (comment))
  (stmt
    (exprStmt
      (primary
        (symbol
          (ident))
        (primarySuffix
          (cmdCall
            (expr
              (primary
                (tupleConstr
                  (symbolColonExpr
                    (expr
                      (primary
                        (tupleConstr
                          (symbolColonExpr
                            (expr
                              (primary
                                (tupleConstr
                                  (symbolColonExpr
                                    (expr
                                      (primary
                                        (literal
                                          (int_lit)))))
                                  (symbolColonExpr
                                    (expr
                                      (primary
                                        (literal
                                          (int_lit)))))))))))))))))))))
  (comment))

==================
objectConstr
==================

discard a(a: 9)
discard a(a: 9, b: 9)
discard a(
  a: 9,
  b: 9
  )

---

(module
  (stmt
    (discardStmt
      (keyw)
      (expr
        (primary
          (symbol
            (ident))
          (primarySuffix
            (objectConstr
              (symbolColonExpr
                (symbol
                  (ident))
                (expr
                  (primary
                    (literal
                      (int_lit)))))))))))
  (stmt
    (discardStmt
      (keyw)
      (expr
        (primary
          (symbol
            (ident))
          (primarySuffix
            (objectConstr
              (symbolColonExpr
                (symbol
                  (ident))
                (expr
                  (primary
                    (literal
                      (int_lit)))))
              (symbolColonExpr
                (symbol
                  (ident))
                (expr
                  (primary
                    (literal
                      (int_lit)))))))))))
  (stmt
    (discardStmt
      (keyw)
      (expr
        (primary
          (symbol
            (ident))
          (primarySuffix
            (objectConstr
              (symbolColonExpr
                (symbol
                  (ident))
                (expr
                  (primary
                    (literal
                      (int_lit)))))
              (symbolColonExpr
                (symbol
                  (ident))
                (expr
                  (primary
                    (literal
                      (int_lit))))))))))))

==================
objectConstr functionCall disambiguation
==================

discard a(a: 9)
discard a()
discard a(a)
discard a(a=9, b, c)

---

(module
  (stmt
    (discardStmt
      (keyw)
      (expr
        (primary
          (symbol
            (ident))
          (primarySuffix
            (objectConstr
              (symbolColonExpr
                (symbol
                  (ident))
                (expr
                  (primary
                    (literal
                      (int_lit)))))))))))
  (stmt
    (discardStmt
      (keyw)
      (expr
        (primary
          (symbol
            (ident))
          (primarySuffix
            (functionCall))))))
  (stmt
    (discardStmt
      (keyw)
      (expr
        (primary
          (symbol
            (ident))
          (primarySuffix
            (functionCall
              (symbolEqExprList
                (symbolEqExpr
                  (expr
                    (primary
                      (symbol
                        (ident))))))))))))
  (stmt
    (discardStmt
      (keyw)
      (expr
        (primary
          (symbol
            (ident))
          (primarySuffix
            (functionCall
              (symbolEqExprList
                (symbolEqExpr
                  (symbol
                    (ident))
                  (expr
                    (primary
                      (literal
                        (int_lit)))))
                (symbolEqExpr
                  (expr
                    (primary
                      (symbol
                        (ident)))))
                (symbolEqExpr
                  (expr
                    (primary
                      (symbol
                        (ident)))))))))))))

