Skip to content

Commit 3cf142c

Browse files
committed
CLJS-1197: load-file does not reload associated macro namespace
cljs.analyzer.api: - add remove-ns cljs.analyzer: - add *reload-macros* dynamic var - when associated macro ns & *reload-macros* true, reload the macro ns. cljs.repl: - in load-file remove the namespace so we get a fresh analysis bind *reload-macros* to true when analyzing the file
1 parent 5197e48 commit 3cf142c

File tree

3 files changed

+16
-4
lines changed

3 files changed

+16
-4
lines changed

src/clj/cljs/analyzer.clj

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@
3535
(def ^:dynamic *analyze-deps* true)
3636
(def ^:dynamic *load-tests* true)
3737
(def ^:dynamic *load-macros* true)
38+
(def ^:dynamic *reload-macros* false)
3839
(def ^:dynamic *macro-infer* true)
3940

4041
(def ^:dynamic *file-defs* nil)
@@ -1520,14 +1521,16 @@
15201521
(load-core)
15211522
(doseq [nsym (vals use-macros)]
15221523
(let [k (or (:use-macros @reload)
1523-
(get-in @reloads [:use-macros nsym]))]
1524+
(get-in @reloads [:use-macros nsym])
1525+
(and (= nsym name) *reload-macros* :reload))]
15241526
(if k
15251527
(clojure.core/require nsym k)
15261528
(clojure.core/require nsym))
15271529
(intern-macros nsym k)))
15281530
(doseq [nsym (vals require-macros)]
15291531
(let [k (or (:require-macros @reload)
1530-
(get-in @reloads [:require-macros nsym]))]
1532+
(get-in @reloads [:require-macros nsym])
1533+
(and (= nsym name) *reload-macros* :reload))]
15311534
(if k
15321535
(clojure.core/require nsym k)
15331536
(clojure.core/require nsym))

src/clj/cljs/analyzer/api.clj

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88

99
(ns cljs.analyzer.api
1010
(:refer-clojure :exclude [all-ns ns-interns ns-resolve resolve find-ns
11-
ns-publics])
11+
ns-publics remove-ns])
1212
(:require [cljs.env :as env]
1313
[cljs.analyzer :as ana]))
1414

@@ -63,6 +63,12 @@
6363
{:pre [(symbol? ns) (symbol? sym)]}
6464
(get-in @env/*compiler* [::ana/namespaces ns :defs sym]))
6565

66+
(defn remove-ns
67+
"Removes the namespace named by the symbol."
68+
[ns]
69+
{:pre [(symbol? ns)]}
70+
(swap! env/*compiler* update-in [::ana/namespaces] dissoc ns))
71+
6672
(defmacro in-cljs-user
6773
"Binds cljs.analyzer/*cljs-ns* to 'cljs.user and uses the given compilation
6874
environment atom and runs body."

src/clj/cljs/repl.clj

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -503,10 +503,13 @@
503503
(slurp src)))
504504
;; need to load dependencies first
505505
(load-dependencies repl-env (:requires compiled) opts)
506+
;; remove the ns to get :reload semantics
507+
(ana-api/remove-ns (:ns (ana/parse-ns src)))
506508
;; make sure it's been analyzed, this is because if it's already compiled
507509
;; cljs.compiler/compile-file won't do anything, good for builds,
508510
;; but a bit annoying here
509-
(ana/analyze-file src opts)
511+
(binding [ana/*reload-macros* true]
512+
(ana/analyze-file src opts))
510513
(-evaluate repl-env f 1 (cljsc/add-dep-string opts compiled))
511514
(-evaluate repl-env f 1
512515
(cljsc/src-file->goog-require src {:wrap true :reload true})))

0 commit comments

Comments
 (0)