====
cast
====

select (Foo) f

---
(ql (moduleMember (select (asExprs (asExpr (prefix_cast (typeExpr (className)) (variable (varName (simpleId)))))))))
========
dontcare
========

select foo(_)

---
(ql (moduleMember (select (asExprs (asExpr (call_or_unqual_agg_expr (aritylessPredicateExpr (literalId)) (call_body (underscore))))))))
====
unop
====

select - 5, + 5

---
 (ql (moduleMember (select (asExprs (asExpr (unary_expr (unop) (literal (integer)))) (asExpr (unary_expr (unop) (literal (integer))))))))
=====
binop
=====

select 5 + 5, 5 - 5, 5 * 5, 5 / 5, 5 % 5

---

(ql (moduleMember
  (select
    (asExprs
      (asExpr (add_expr (literal (integer)) (addop) (literal (integer))))
      (asExpr (add_expr (literal (integer)) (addop) (literal (integer))))
      (asExpr (mul_expr (literal (integer)) (mulop) (literal (integer))))
      (asExpr (mul_expr (literal (integer)) (mulop) (literal (integer))))
      (asExpr (mul_expr (literal (integer)) (mulop) (literal (integer))))))))

===========
set literal
===========

select [1,2,4]

---

(ql (moduleMember
  (select
    (asExprs
      (asExpr
        (set_literal
          (literal (integer))
          (literal (integer))
          (literal (integer))))))))

====================
uniqueness aggregate
====================

select unique(int x | x = 1 | x)

---

(ql (moduleMember
  (select
    (asExprs
      (asExpr
        (aggregate
          (aggId)
          (full_aggregate_body
            (varDecl (typeExpr (primitiveType)) (varName (simpleId)))
            (comp_term (variable (varName (simpleId))) (compop) (literal (integer)))
            (asExprs (asExpr (variable (varName (simpleId))))))))))))

================
binop precedence
================

select
  // left associative
  5 + 5 - 5,
  5 - 5 + 5,
  // mul binds tighter
  5 + 5 * 5,
  5 + 5 / 5,
  5 * 5 + 5,
  5 / 5 + 5,
  // left associative
  5 / 5 * 5,
  5 * 5 / 5,
  // mod tighter,
  5 * 5 % 5,
  5 % 5 * 5

---

(ql (moduleMember (select (line_comment)
  (asExprs
    (asExpr (add_expr (add_expr (literal (integer)) (addop) (literal (integer))) (addop) (literal (integer))))
    (asExpr (add_expr (add_expr (literal (integer)) (addop) (literal (integer))) (addop) (literal (integer))))
    (line_comment)
    (asExpr (add_expr (literal (integer)) (addop) (mul_expr (literal (integer)) (mulop) (literal (integer)))))
    (asExpr (add_expr (literal (integer)) (addop) (mul_expr (literal (integer)) (mulop) (literal (integer)))))
    (asExpr (add_expr (mul_expr (literal (integer)) (mulop) (literal (integer))) (addop) (literal (integer))))
    (asExpr (add_expr (mul_expr (literal (integer)) (mulop) (literal (integer))) (addop) (literal (integer))))
    (line_comment)
    (asExpr (mul_expr (mul_expr (literal (integer)) (mulop) (literal (integer))) (mulop) (literal (integer))))
    (asExpr (mul_expr (mul_expr (literal (integer)) (mulop) (literal (integer))) (mulop) (literal (integer))))
    (line_comment)
    (asExpr (mul_expr (mul_expr (literal (integer)) (mulop) (literal (integer))) (mulop) (literal (integer))))
    (asExpr (mul_expr (mul_expr (literal (integer)) (mulop) (literal (integer))) (mulop) (literal (integer))))))))

===========================
unary minus and prefix cast
===========================

where x = -(float) -7
select 0

---

(ql (moduleMember
  (select
    (comp_term
      (variable (varName (simpleId)))
      (compop)
      (unary_expr
        (unop)
        (prefix_cast
          (typeExpr (primitiveType))
          (unary_expr
            (unop)
            (literal (integer))))))
    (asExprs (asExpr (literal (integer)))))))

========================
unary minus and non-cast
========================

where x = -(foo) -7
select 0

---

(ql (moduleMember
  (select
    (comp_term
      (variable (varName (simpleId)))
      (compop)
      (add_expr
        (unary_expr
          (unop)
          (par_expr (variable (varName (simpleId)))))
        (addop)
        (literal (integer))))
    (asExprs (asExpr (literal (integer)))))))

==============================
unary minus and multiplication
==============================

where x = -a * b
select 0

---

(ql (moduleMember
  (select
    (comp_term
      (variable (varName (simpleId)))
      (compop)
      (mul_expr
        (unary_expr
        (unop)
          (variable (varName (simpleId))))
        (mulop)
        (variable (varName (simpleId)))))
    (asExprs (asExpr (literal (integer)))))))

========================
expression-level pragmas
========================

from int i
where i = pragma[only_bind_out](5)
select i

---

(ql (moduleMember (select
  (varDecl (typeExpr (primitiveType)) (varName (simpleId)))
  (comp_term
    (variable (varName (simpleId)))
    (compop)
    (expr_annotation
      (annotName)
      (annotName)
      (literal (integer))))
  (asExprs (asExpr (variable (varName (simpleId))))))))

===========================
unary minus and prefix cast
===========================

where x = -(float) -7
select 0

---

(ql (moduleMember
  (select
    (comp_term
      (variable (varName (simpleId)))
      (compop)
      (unary_expr
        (unop)
        (prefix_cast
          (typeExpr (primitiveType))
          (unary_expr
            (unop)
            (literal (integer))))))
    (asExprs (asExpr (literal (integer)))))))

========================
unary minus and non-cast
========================

where x = -(foo) -7
select 0

---

(ql (moduleMember
  (select
    (comp_term
      (variable (varName (simpleId)))
      (compop)
      (add_expr
        (unary_expr
          (unop)
          (par_expr (variable (varName (simpleId)))))
        (addop)
        (literal (integer))))
    (asExprs (asExpr (literal (integer)))))))


===============================
set literal with trailing comma
===============================

where x in [1,2,]
select x

---

(ql (moduleMember
  (select
    (in_expr
      (variable (varName (simpleId)))
      (set_literal
        (literal (integer))
        (literal (integer))))
    (asExprs (asExpr (variable (varName (simpleId))))))))
