===========
comparisons
===========

from File f
where (f = f)
  or f != f
  and f < f
  and (f > f or f <= f)
  and f >= f
select f

---

(ql (moduleMember 
  (select 
    (varDecl (typeExpr (className)) (varName (simpleId))) 
    (disjunction 
      (par_expr (comp_term (variable (varName (simpleId))) (compop (eq)) (variable (varName (simpleId)))))
      (conjunction
        (conjunction 
          (conjunction 
            (comp_term (variable (varName (simpleId))) (compop (ne)) (variable (varName (simpleId)))) 
            (comp_term (variable (varName (simpleId))) (compop (lt)) (variable (varName (simpleId))))) 
          (par_expr (disjunction 
            (comp_term (variable (varName (simpleId))) (compop (gt)) (variable (varName (simpleId))))
            (comp_term (variable (varName (simpleId))) (compop (le)) (variable (varName (simpleId))))))) 
        (comp_term (variable (varName (simpleId))) (compop (ge)) (variable (varName (simpleId)))))) 
    (asExprs (asExpr (variable (varName (simpleId)))))))) 

==========
instanceof
==========

from Foo f
where f instanceof Foo
select f

---

(ql (moduleMember 
  (select 
    (varDecl (typeExpr (className)) (varName (simpleId))) 
    (instance_of (variable (varName (simpleId))) (instanceof) (typeExpr (className))) 
    (asExprs (asExpr (variable (varName (simpleId))))))))

=====
range
=====

from int i
where i in [0..10]
select i

---

(ql (moduleMember 
  (select 
   (varDecl (typeExpr (typeLiteral)) (varName (simpleId))) 
   (in_expr (variable (varName (simpleId))) (in) (range (literal (integer)) (literal (integer)))) 
   (asExprs (asExpr (variable (varName (simpleId))))))))

=================
predicateRef call
=================

from int i
where bar(i) and module::baz+()
select i

---

(ql (moduleMember 
  (select 
    (varDecl (typeExpr (typeLiteral)) (varName (simpleId))) 
    (conjunction 
      (classless_predicate_call (aritylessPredicateExpr (literalId)) (variable (varName (simpleId)))) 
      (classless_predicate_call (aritylessPredicateExpr (moduleExpr (simpleId)) (literalId)) (closure (plus)))) 
    (asExprs (asExpr (variable (varName (simpleId))))))))
=================================
calls with results & method calls
=================================

from int i
select i.foo+(), 1.foo(), 1.1.foo()

---
(ql (moduleMember 
  (select 
    (varDecl (typeExpr (typeLiteral)) (varName (simpleId))) 
    (asExprs 
      (asExpr (qualified_expr (variable (varName (simpleId))) (qualifiedRhs (predicateName) (closure (plus))))) 
      (asExpr (qualified_expr (literal (integer)) (qualifiedRhs (predicateName)))) 
      (asExpr (qualified_expr (literal (float)) (qualifiedRhs (predicateName))))))))

==============
quantification
==============


from Foo f
where exists(f.aThing())
   or exists(Foo f | f.aThing())
   or exists(Foo f | f.aThing() | f.aThing())
   or forall(Foo f | f.aThing() | f.aThing())
   or forex(Foo f | f.aThing() | f.aThing())
select f

---

(ql (moduleMember 
  (select 
    (varDecl (typeExpr (className)) (varName (simpleId))) 
    (disjunction 
      (disjunction 
        (disjunction 
          (disjunction 
            (quantified (quantifier (exists)) (qualified_expr (variable (varName (simpleId))) (qualifiedRhs (predicateName)))) 
            (quantified (quantifier (exists)) (varDecl (typeExpr (className)) (varName (simpleId))) 
          (qualified_expr (variable (varName (simpleId))) (qualifiedRhs (predicateName))))) 
        (quantified (quantifier (exists)) (varDecl (typeExpr (className)) (varName (simpleId))) 
          (qualified_expr (variable (varName (simpleId))) (qualifiedRhs (predicateName)))
          (qualified_expr (variable (varName (simpleId))) (qualifiedRhs (predicateName))))) 
      (quantified (quantifier (forall)) (varDecl (typeExpr (className)) (varName (simpleId))) 
        (qualified_expr (variable (varName (simpleId))) (qualifiedRhs (predicateName))) 
        (qualified_expr (variable (varName (simpleId))) (qualifiedRhs (predicateName))))) 
    (quantified (quantifier (forex)) (varDecl (typeExpr (className)) (varName (simpleId)))
      (qualified_expr (variable (varName (simpleId))) (qualifiedRhs (predicateName)))
      (qualified_expr (variable (varName (simpleId))) (qualifiedRhs (predicateName))))) 
  (asExprs (asExpr (variable (varName (simpleId))))))))