Skip to content

Commit dfe9c65

Browse files
committed
- parse-global-refer-spec is more like parse-ns-excludes
- basic impl test
1 parent a0c3c41 commit dfe9c65

File tree

2 files changed

+26
-12
lines changed

2 files changed

+26
-12
lines changed

src/main/clojure/cljs/analyzer.cljc

Lines changed: 19 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -3039,19 +3039,26 @@
30393039
ret
30403040
(recur fs ret true)))))
30413041

3042-
;; this case is like :refer-clojure it cannot be used as a spec parser
30433042
(defn parse-global-refer-spec
3044-
[env spec]
3045-
(let [{referred :refer-global
3046-
renamed :rename} (apply hash-map (concat [:refer-global] [spec]))
3047-
referred-without-renamed (remove (set (keys renamed)) referred)]
3048-
;; TODO: refer validation, this can be lifted easily into common helper from parse-require-spec
3049-
;; TODO: rename validation, harder to lift
3050-
{:use (zipmap referred-without-renamed (repeat 'js))
3051-
:rename (into {}
3052-
(map (fn [[orig new-name]]
3053-
[new-name (symbol "js" (str orig))]))
3054-
renamed)}))
3043+
[env args]
3044+
(let [xs (filter #(-> % first (= :refer-global)) args)]
3045+
(if-not (= 1 (count xs))
3046+
(throw (error env "Only one :refer-global form is allowed per namespace definition"))
3047+
(let [[_ refers & {:keys [rename] :as renames-only}] (first xs)
3048+
err-str "Only [:refer-global (names)] and optionally `:rename {from to}` specs supported"]
3049+
(when-not (and (vector? refers) (every? symbol refers))
3050+
(throw (error env err-str)))
3051+
(when-not (or (empty? renames-only)
3052+
(and (= 1 (count renames-only))
3053+
(contains? renames-only :rename)
3054+
(map? rename)
3055+
(every? symbol (mapcat identity rename))))
3056+
(throw (error env (str err-str (pr-str renames-only)))))
3057+
{:use (zipmap refers (repeat 'js))
3058+
:rename (into {}
3059+
(map (fn [[orig new-name]]
3060+
[new-name (symbol "js" (str orig))]))
3061+
rename)}))))
30553062

30563063
#_(defn parse-global-require-spec
30573064
[env deps aliases spec]

src/test/clojure/cljs/analyzer_tests.clj

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -387,6 +387,13 @@
387387
:renames {map clj-map}}))
388388
(is (set? (:excludes parsed)))))
389389

390+
(deftest test-parse-global-refer
391+
(let [parsed (ana/parse-global-refer-spec {}
392+
'((:refer-global [Date] :rename {Symbol JSSymbol})))]
393+
(is (= parsed
394+
'{:use {Date js}
395+
:rename {JSSymbol js/Symbol}}))))
396+
390397
(deftest test-cljs-1785-js-shadowed-by-local
391398
(let [ws (atom [])]
392399
(ana/with-warning-handlers [(collecting-warning-handler ws)]

0 commit comments

Comments
 (0)