(ns ^:typed.clojure com.tailrecursion.blacktide.compiler.passes.lexical
"Expose loop bindings and simultaneous recur arguments for expression lowering."
(:require [com.tailrecursion.nanopass :as np]
[com.tailrecursion.blacktide.compiler.languages :as l]))
(np/defpass introduce {:from [l/Represented Expr] :to [l/Lexical Expr]}
[node]
:bind (assoc node :body (introduce (:body node)))
:join (assoc node :value (introduce (:value node)) :body (introduce (:body node)))
:branch (assoc node :yes (introduce (:yes node)) :no (introduce (:no node)))
:switch (assoc node :arms (mapv introduce (:arms node)))
:loop {:op :loop :bindings (mapv (fn [id] {:target id :value {:op :local :id id}}) (:slots node))
:body (introduce (:body node))}
:recur {:op :recur :args (mapv (fn [id] {:op :local :id id}) (:slots node))}
:return node :throw node)
(np/defpass program {:from [l/Represented Program] :to [l/Lexical Program] :body true}
[program] (assoc program :body (introduce (:body program))))