|
618 | 618 | #?(:clj |
619 | 619 | (def load-mutex (Object.))) |
620 | 620 |
|
| 621 | +#?(:clj |
| 622 | + (defn- load-data-reader-file [mappings ^java.net.URL url] |
| 623 | + (with-open [rdr (readers/input-stream-push-back-reader (.openStream url))] |
| 624 | + (binding [*file* (.getFile url)] |
| 625 | + (let [new-mappings (reader/read {:eof nil :read-cond :allow :features #{:cljs}} rdr)] |
| 626 | + (when (not (map? new-mappings)) |
| 627 | + (throw (ex-info (str "Not a valid data-reader map") |
| 628 | + {:url url |
| 629 | + :clojure.error/phase :compilation}))) |
| 630 | + (reduce |
| 631 | + (fn [m [k v]] |
| 632 | + (when (not (symbol? k)) |
| 633 | + (throw (ex-info (str "Invalid form in data-reader file") |
| 634 | + {:url url |
| 635 | + :form k |
| 636 | + :clojure.error/phase :compilation}))) |
| 637 | + (when (and (contains? mappings k) |
| 638 | + (not= (mappings k) v)) |
| 639 | + (throw (ex-info "Conflicting data-reader mapping" |
| 640 | + {:url url |
| 641 | + :conflict k |
| 642 | + :mappings m |
| 643 | + :clojure.error/phase :compilation}))) |
| 644 | + (assoc m k v)) |
| 645 | + mappings |
| 646 | + new-mappings)))))) |
| 647 | + |
| 648 | +#?(:clj |
| 649 | + (defn get-data-readers* |
| 650 | + "returns a merged map containing all data readers defined by libraries |
| 651 | + on the classpath." |
| 652 | + ([] |
| 653 | + (get-data-readers* (. (Thread/currentThread) (getContextClassLoader)))) |
| 654 | + ([^ClassLoader classloader] |
| 655 | + (let [data-reader-urls (enumeration-seq (. classloader (getResources "data_readers.cljc")))] |
| 656 | + (reduce load-data-reader-file {} data-reader-urls))))) |
| 657 | + |
| 658 | +#?(:clj |
| 659 | + (def get-data-readers (memoize get-data-readers*))) |
| 660 | + |
| 661 | +#?(:clj |
| 662 | + (defn load-data-readers* [] |
| 663 | + (let [data-readers (get-data-readers) |
| 664 | + nses (map (comp symbol namespace) (vals data-readers))] |
| 665 | + (doseq [ns nses] |
| 666 | + (try |
| 667 | + (locking load-mutex |
| 668 | + (require ns)) |
| 669 | + (catch Throwable _))) |
| 670 | + (->> data-readers |
| 671 | + (map (fn [[tag reader-fn]] |
| 672 | + [tag |
| 673 | + (-> reader-fn find-var var-get |
| 674 | + (with-meta {:sym reader-fn}))])) |
| 675 | + (into {}))))) |
| 676 | + |
| 677 | +#?(:clj |
| 678 | + (def load-data-readers (memoize load-data-readers*))) |
| 679 | + |
621 | 680 | #?(:clj |
622 | 681 | (defn load-core [] |
623 | 682 | (when (not @-cljs-macros-loaded) |
|
4310 | 4369 | (resolve-var (assoc @env/*compiler* :ns (get-namespace *cljs-ns*)) |
4311 | 4370 | sym))))) |
4312 | 4371 |
|
| 4372 | + |
4313 | 4373 | #?(:clj |
4314 | 4374 | (defn forms-seq* |
4315 | 4375 | "Seq of Clojure/ClojureScript forms from rdr, a java.io.Reader. Optionally |
|
4324 | 4384 | {:read-cond :allow :features #{:cljs}})) |
4325 | 4385 | pbr (readers/indexing-push-back-reader |
4326 | 4386 | (PushbackReader. rdr) 1 filename) |
4327 | | - data-readers tags/*cljs-data-readers* |
| 4387 | + data-readers (merge tags/*cljs-data-readers* |
| 4388 | + (load-data-readers)) |
4328 | 4389 | forms-seq_ |
4329 | 4390 | (fn forms-seq_ [] |
4330 | 4391 | (lazy-seq |
|
4352 | 4413 | (let [rdr (io/reader f) |
4353 | 4414 | pbr (readers/indexing-push-back-reader |
4354 | 4415 | (PushbackReader. rdr) 1 filename) |
4355 | | - data-readers tags/*cljs-data-readers* |
| 4416 | + data-readers (merge tags/*cljs-data-readers* |
| 4417 | + (load-data-readers)) |
4356 | 4418 | forms-seq* |
4357 | 4419 | (fn forms-seq* [] |
4358 | 4420 | (lazy-seq |
|
0 commit comments