(ns ^:typed.clojure com.tailrecursion.blacktide.compiler.passes.effects
"Identify local writes and transfers that prevent native subtree emission."
(:require [com.tailrecursion.nanopass :as np]
[com.tailrecursion.blacktide.compiler.languages :as l]
[typed.clojure :as-alias t]))
(np/defpasses
(effect-node {:from [l/Bound Node] :to t/Bool}
[node]
:literal false :local false :global false :var false
:setq (boolean (seq (:pairs node)))
:psetq (boolean (seq (:pairs node)))
:label true :goto true
:if (or (effects (:test node)) (effects (:then node)) (effects (:else node)))
:case (or (effects (:selector node)) (boolean (some effects (:arms node))))
:dispatch (effects (:value node))
:throw (effects (:value node))
:host (boolean (some effects (:args node)))
:invoke (or (effects (:function node)) (boolean (some effects (:args node))))
:collection (or (boolean (some effects (:items node))) (boolean (some-> (:metadata node) effects)))
:do (boolean (some effects (:forms node)))
:let (or (boolean (some #(effects (:init %)) (:bindings node))) (effects (:body node)))
:loop (or (boolean (some #(effects (:init %)) (:bindings node))) (effects (:body node)))
:recur (boolean (some effects (:args node))))
(effects {:from [l/Bound Expr] :to t/Bool :body true}
[expr] (effect-node (:node expr))))