 
 (declare message namespaces)
 
-(defn ast? [x]
+(defn ast?
+  #?(:cljs {:tag boolean})
+  [x]
   (and (map? x) (contains? x :op)))
 
 (defmulti error-message (fn [warning-type & _] warning-type))

          (or (nil? opts) (map? opts))]}
    (ensure
      (wrapping-errors env
        (reduce (fn [ast pass] (pass env ast))
          (binding [reader/*alias-map* (or reader/*alias-map* {})]
            (let [form (if (instance? LazySeq form)
                         (or (seq form) ())
                         form)]
              #?(:clj (load-core))
              (cond
                (symbol? form) (analyze-symbol env form)
                (and (seq? form) (seq form)) (analyze-seq env form name opts)
                (map? form) (analyze-map env form)
                (vector? form) (analyze-vector env form)
                (set? form) (analyze-set env form)
                (keyword? form) (analyze-keyword env form)
                #?@(:clj [(instance? JSValue form) (analyze-js-value env form)])
                (= form ()) (analyze-list env form)
                :else
                (let [tag (cond
                            (nil? form)    'clj-nil
                            (number? form) 'number
                            (string? form) 'string
                            (true? form)   'boolean
                            (false? form)  'boolean)]
                  (cond-> {:op :constant :env env :form form}
                    tag (assoc :tag tag))))))
          (or *passes* [infer-type]))))))

#?(:clj
   (defn- source-path

(defn macro-autoload-ns?
  "Given a spec form check whether the spec namespace requires a macro file
   of the same name. If so return true."
  #?(:cljs {:tag boolean})
  [form]
  (when *macro-infer*
    (let [ns (if (sequential? form) (first form) form)
