Skip to content

Commit d197bcb

Browse files
author
dnolen
committed
refactor macro inference passes
1 parent a064803 commit d197bcb

File tree

1 file changed

+58
-41
lines changed

1 file changed

+58
-41
lines changed

src/main/clojure/cljs/analyzer.cljc

+58-41
Original file line numberDiff line numberDiff line change
@@ -1757,22 +1757,28 @@
17571757
the-ns #?(:clj (find-ns lib) :cljs (find-macros-ns lib))]
17581758
(or (nil? the-ns) (nil? (.findInternedVar ^clojure.lang.Namespace the-ns sym)))))
17591759

1760-
(defn missing-uses [uses env]
1760+
;; returns (s/map-of symbol? symbol?)
1761+
(defn missing-uses
1762+
[uses env]
17611763
(let [cenv @env/*compiler*]
17621764
(into {} (filter (fn [[sym lib]] (missing-use? lib sym cenv)) uses))))
17631765

1764-
(defn missing-renames [renames]
1766+
;; returns (s/map-of symbol? qualified-symbol?)
1767+
(defn missing-renames [renames env]
17651768
(let [cenv @env/*compiler*]
17661769
(into {} (filter (fn [[_ qualified-sym]] (missing-rename? qualified-sym cenv)) renames))))
17671770

1771+
;; returns (s/map-of symbol? symbol?)
17681772
(defn missing-use-macros [use-macros env]
17691773
(let [cenv @env/*compiler*]
17701774
(into {} (filter (fn [[sym lib]] (missing-use-macro? lib sym)) use-macros))))
17711775

1776+
;; returns (s/map-of symbol? symbol?)
17721777
(defn inferred-use-macros [use-macros env]
17731778
(let [cenv @env/*compiler*]
17741779
(into {} (filter (fn [[sym lib]] (not (missing-use-macro? lib sym))) use-macros))))
17751780

1781+
;; returns (s/map-of symbol? symbol?)
17761782
(defn inferred-rename-macros [rename-macros env]
17771783
(into {} (filter (fn [[_ qualified-sym]] (not (missing-rename-macro? qualified-sym))) rename-macros)))
17781784

@@ -1798,23 +1804,31 @@
17981804
(inferred-use-macros missing-uses env))))
17991805

18001806
(defn check-use-macros-inferring-missing
1801-
[ast name use-macros missing-uses env]
1802-
(let [remove-missing-uses #(apply dissoc % (keys missing-uses))
1803-
missing-renames (missing-renames (:renames ast))
1804-
missing-rename-macros (inferred-rename-macros missing-renames env)
1805-
remove-missing-renames #(apply dissoc % (keys missing-renames))
1807+
[{:keys [name uses use-macros] :as ast} env]
1808+
(let [missing-uses (when (and *analyze-deps* (seq uses))
1809+
(missing-uses uses env))
1810+
remove-missing-uses #(apply dissoc % (keys missing-uses))
18061811
ast' (-> ast
18071812
(update-in [:use-macros] merge
18081813
(check-use-macros use-macros missing-uses env))
1809-
(update-in [:uses] remove-missing-uses)
1814+
(update-in [:uses] remove-missing-uses))]
1815+
(swap! env/*compiler*
1816+
#(-> %
1817+
(update-in [::namespaces name :use-macros] merge (:use-macros ast'))
1818+
(update-in [::namespaces name :uses] remove-missing-uses)))
1819+
ast'))
1820+
1821+
(defn check-rename-macros-inferring-missing
1822+
[{:keys [name renames] :as ast} env]
1823+
(let [missing-renames (when (and *analyze-deps* (seq renames))
1824+
(missing-renames (:renames ast) env))
1825+
missing-rename-macros (inferred-rename-macros missing-renames env)
1826+
remove-missing-renames #(apply dissoc % (keys missing-renames))
1827+
ast' (-> ast
18101828
(update-in [:rename-macros] merge missing-rename-macros)
18111829
(update-in [:renames] remove-missing-renames))]
1812-
;; we also need to side-effect the compilation environment
1813-
;; the returned AST isn't actually used directly
18141830
(swap! env/*compiler*
18151831
#(-> %
1816-
(update-in [::namespaces name :use-macros] merge (:use-macros ast'))
1817-
(update-in [::namespaces name :uses] remove-missing-uses)
18181832
(update-in [::namespaces name :rename-macros] merge (:rename-macros ast'))
18191833
(update-in [::namespaces name :renames] remove-missing-renames)))
18201834
ast'))
@@ -2773,35 +2787,38 @@
27732787
(let [{:keys [name deps uses require-macros use-macros reload reloads]} ast]
27742788
(when (and *analyze-deps* (seq deps))
27752789
(analyze-deps name deps env (dissoc opts :macros-ns)))
2776-
(let [missing (when (and *analyze-deps* (seq uses))
2777-
(missing-uses uses env))]
2778-
(if *load-macros*
2779-
(do
2780-
(load-core)
2781-
(doseq [nsym (vals use-macros)]
2782-
(let [k (or (:use-macros reload)
2783-
(get-in reloads [:use-macros nsym])
2784-
(and (= nsym name) *reload-macros* :reload))]
2785-
(if k
2786-
(locking load-mutex
2787-
(clojure.core/require nsym k))
2788-
(locking load-mutex
2789-
(clojure.core/require nsym)))
2790-
(intern-macros nsym k)))
2791-
(doseq [nsym (vals require-macros)]
2792-
(let [k (or (:require-macros reload)
2793-
(get-in reloads [:require-macros nsym])
2794-
(and (= nsym name) *reload-macros* :reload))]
2795-
(if k
2796-
(locking load-mutex
2797-
(clojure.core/require nsym k))
2798-
(locking load-mutex
2799-
(clojure.core/require nsym)))
2800-
(intern-macros nsym k)))
2801-
(check-use-macros-inferring-missing ast name use-macros missing env))
2802-
(do
2803-
(check-uses missing env)
2804-
ast))))
2790+
(if *load-macros*
2791+
(do
2792+
(load-core)
2793+
(doseq [nsym (vals use-macros)]
2794+
(let [k (or (:use-macros reload)
2795+
(get-in reloads [:use-macros nsym])
2796+
(and (= nsym name) *reload-macros* :reload))]
2797+
(if k
2798+
(locking load-mutex
2799+
(clojure.core/require nsym k))
2800+
(locking load-mutex
2801+
(clojure.core/require nsym)))
2802+
(intern-macros nsym k)))
2803+
(doseq [nsym (vals require-macros)]
2804+
(let [k (or (:require-macros reload)
2805+
(get-in reloads [:require-macros nsym])
2806+
(and (= nsym name) *reload-macros* :reload))]
2807+
(if k
2808+
(locking load-mutex
2809+
(clojure.core/require nsym k))
2810+
(locking load-mutex
2811+
(clojure.core/require nsym)))
2812+
(intern-macros nsym k)))
2813+
(-> ast
2814+
(check-use-macros-inferring-missing env)
2815+
(check-rename-macros-inferring-missing env)))
2816+
(do
2817+
(check-uses
2818+
(when (and *analyze-deps* (seq uses))
2819+
(missing-uses uses env))
2820+
env)
2821+
ast)))
28052822
ast)))
28062823

28072824
(def ^:dynamic *passes* nil)

0 commit comments

Comments
 (0)