|
3039 | 3039 | ret
|
3040 | 3040 | (recur fs ret true)))))
|
3041 | 3041 |
|
3042 |
| -;; this case is like :refer-clojure it cannot be used as a spec parser |
3043 | 3042 | (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)})))) |
3055 | 3062 |
|
3056 | 3063 | #_(defn parse-global-require-spec
|
3057 | 3064 | [env deps aliases spec]
|
|
0 commit comments