   {:op :constant :env env :form sym :tag 'cljs.core/Keyword})
 
 (defn get-tag [e]
-  (or (-> e :tag)
-      (-> e :info :tag)
-      (-> e :form meta :tag)))
+  (let [tag (-> e :tag)]
+    (if-not (nil? tag)
+      tag
+      (let [tag (-> e :info :tag)]
+        (if-not (nil? tag)
+          tag
+          (-> e :form meta :tag))))))
 
 (defn find-matching-method [f params]
   ;; if local fn, need to look in :info

        ret-tag (when-not (nil? (:fn-var info)) (:ret-tag info))]
    (if-not (nil? ret-tag)
      ret-tag
      (let [ret-tag (infer-tag env (assoc (find-matching-method f (:args e)) :op :method))]
        (if-not (nil? ret-tag)
          ret-tag
          ANY_SYM)))))

      expr)))

(defn infer-type [env ast]
  (let [tag (:tag ast)]
    (if (nil? tag)
      (let [tag (infer-tag env ast)]
        (if-not (nil? tag)
          (assoc ast :tag tag)
          ast))
      ast)))

(def ^:dynamic *passes* nil)

