Skip to content

Commit

Permalink
CLJS-1023: macro-autoload-ns? and ns-dependents need to throw on cycl…
Browse files Browse the repository at this point in the history
…ic dependencies

Add *macro-infer* dynamic var. Use this to prevent needless recursion, we only want to look
one level deep anyway.

Move *dependents* updating in compiler after compile-file* call. This way analyzer parsing of
ns will catch circular deps.
  • Loading branch information
dnolen committed Feb 10, 2015
1 parent 3c3cae6 commit 014524d
Show file tree
Hide file tree
Showing 2 changed files with 21 additions and 13 deletions.
20 changes: 13 additions & 7 deletions src/clj/cljs/analyzer.clj
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,7 @@
(def ^:dynamic *analyze-deps* true)
(def ^:dynamic *load-tests* true)
(def ^:dynamic *load-macros* true)
(def ^:dynamic *macro-infer* true)

;; log compiler activities
(def ^:dynamic *verbose* false)
Expand Down Expand Up @@ -1235,13 +1236,14 @@
"Given a spec form check whether the spec namespace requires a macro file
of the same name. If so return true."
[form]
(let [ns (if (sequential? form) (first form) form)
{:keys [use-macros require-macros]}
(or (get-in @env/*compiler* [::namespaces ns])
(when-let [res (io/resource (util/ns->relpath ns))]
(:ast (parse-ns res))))]
(or (some #{ns} (vals use-macros))
(some #{ns} (vals require-macros)))))
(when *macro-infer*
(let [ns (if (sequential? form) (first form) form)
{:keys [use-macros require-macros]}
(or (get-in @env/*compiler* [::namespaces ns])
(when-let [res (io/resource (util/ns->relpath ns))]
(:ast (parse-ns res))))]
(or (some #{ns} (vals use-macros))
(some #{ns} (vals require-macros))))))

(defn desugar-ns-specs
"Given an original set of ns specs desugar :include-macros and :refer-macros
Expand Down Expand Up @@ -1811,6 +1813,10 @@ argument, which the reader will use in any emitted errors."
(let [namespaces' (::namespaces @env/*compiler*)
ret
(binding [*cljs-ns* 'cljs.user
*macro-infer*
(or (when (contains? opts :macro-infer)
(:macro-infer opts))
false)
*analyze-deps*
(or (when (contains? opts :analyze-deps)
(:analyze-deps opts))
Expand Down
14 changes: 8 additions & 6 deletions src/clj/cljs/compiler.clj
Original file line number Diff line number Diff line change
Expand Up @@ -1024,6 +1024,7 @@
([src dest]
(compile-file src dest nil))
([src dest opts]
{:post [map?]}
(let [src-file (io/file src)
dest-file (io/file dest)
opts (merge {:optimizations :none} opts)]
Expand All @@ -1033,15 +1034,16 @@
opts (if (= ns 'cljs.core) (assoc opts :static-fns true) opts)]
(if (requires-compilation? src-file dest-file opts)
(do
(when *dependents*
(swap! *dependents*
(fn [{:keys [recompile visited]}]
{:recompile (into recompile (ana/ns-dependents ns))
:visited (conj visited ns)})))
(util/mkdirs dest-file)
(when (contains? (::ana/namespaces @env/*compiler*) ns)
(swap! env/*compiler* update-in [::ana/namespaces] dissoc ns))
(compile-file* src-file dest-file opts))
(let [ret (compile-file* src-file dest-file opts)]
(when *dependents*
(swap! *dependents*
(fn [{:keys [recompile visited]}]
{:recompile (into recompile (ana/ns-dependents ns))
:visited (conj visited ns)})))
ret))
(do
(when-not (contains? (::ana/namespaces @env/*compiler*) ns)
(with-core-cljs opts (fn [] (ana/analyze-file src-file opts))))
Expand Down

0 comments on commit 014524d

Please sign in to comment.