From 7d6529f0212ea177000296c2032d0f3c86de6e16 Mon Sep 17 00:00:00 2001 From: David Nolen Date: Thu, 12 May 2022 10:04:35 -0400 Subject: [PATCH 1/4] * add cljs.vendor.bridge file to bridge tools.reader and vendorized tools.reader * update compile to exclude cljs.vendor.bridge from AOT --- pom.template.xml | 2 +- src/main/clojure/cljs/vendor/bridge.clj | 42 +++++++++++++++++++++++++ 2 files changed, 43 insertions(+), 1 deletion(-) create mode 100644 src/main/clojure/cljs/vendor/bridge.clj diff --git a/pom.template.xml b/pom.template.xml index 28fb75858..aaf6411d2 100644 --- a/pom.template.xml +++ b/pom.template.xml @@ -278,7 +278,7 @@ true - !clojure.tools.reader.* + !cljs.vendor.bridge diff --git a/src/main/clojure/cljs/vendor/bridge.clj b/src/main/clojure/cljs/vendor/bridge.clj new file mode 100644 index 000000000..4a2e24c09 --- /dev/null +++ b/src/main/clojure/cljs/vendor/bridge.clj @@ -0,0 +1,42 @@ +; Copyright (c) Rich Hickey. All rights reserved. +; The use and distribution terms for this software are covered by the +; Eclipse Public License 1.0 (http://opensource.org/licenses/eclipse-1.0.php) +; which can be found in the file epl-v10.html at the root of this distribution. +; By using this software in any fashion, you are agreeing to be bound by +; the terms of this license. +; You must not remove this notice, or any other, from this software. + +(ns cljs.vendor.bridge + (:require [cljs.vendor.clojure.tools.reader.reader-types :as vendor] + [clojure.tools.reader.reader-types :as readers])) + +(extend-protocol vendor/Reader + clojure.tools.reader.reader_types.Reader + (read-char [reader] + (readers/read-char reader)) + (peek-char [reader] + (readers/peek-char reader))) + +(extend-protocol vendor/IPushbackReader + clojure.tools.reader.reader_types.IPushbackReader + (unread [reader ch] + (readers/unread reader ch))) + +(extend-protocol vendor/IndexingReader + clojure.tools.reader.reader_types.IndexingReader + (get-line-number [reader] + (readers/get-line-number reader)) + (get-column-number [reader] + (readers/get-column-number reader)) + (get-file-name [reader] + (readers/get-file-name reader))) + +(extend-protocol vendor/ReaderCoercer + clojure.tools.reader.reader_types.ReaderCoercer + (to-rdr [reader] + (readers/to-rdr reader))) + +(extend-protocol vendor/PushbackReaderCoercer + clojure.tools.reader.reader_types.PushbackReaderCoercer + (to-pbr [reader buflen] + (readers/to-pbr reader buflen))) From 425d1220bc9bf889aee079ac53250598f205563b Mon Sep 17 00:00:00 2001 From: David Nolen Date: Thu, 12 May 2022 12:44:17 -0400 Subject: [PATCH 2/4] * bridge tools.reader, a dep so we do not need to conditionalize * return clojure.tools.reader/*alias-map* first --- src/main/clojure/cljs/analyzer.cljc | 16 ++++++++++++++-- src/main/clojure/cljs/compiler.cljc | 2 +- 2 files changed, 15 insertions(+), 3 deletions(-) diff --git a/src/main/clojure/cljs/analyzer.cljc b/src/main/clojure/cljs/analyzer.cljc index 5017d747e..bef0b4ab6 100644 --- a/src/main/clojure/cljs/analyzer.cljc +++ b/src/main/clojure/cljs/analyzer.cljc @@ -45,6 +45,10 @@ [java.net URL] [java.util.regex Pattern]))) +;; bridge clojure.tools.reader if on classpath +#?(:clj + (load "vendor/bridge")) + #?(:clj (set! *warn-on-reflection* true)) ;; User file-local compiler flags @@ -4395,6 +4399,14 @@ ((juxt :requires :require-macros :as-aliases) (get-namespace ns)))) +(defn get-bridged-alias-map + "Returns clojure.tools.reader/*alias-map* for bridging" + [] + (try + @(ns-resolve 'clojure.tools.reader '*alias-map*) + (catch Throwable t + nil))) + #?(:clj (defn forms-seq* "Seq of Clojure/ClojureScript forms from rdr, a java.io.Reader. Optionally @@ -4795,7 +4807,7 @@ *unchecked-arrays* false]) *cljs-ns* 'cljs.user *cljs-file* nil - reader/*alias-map* (or reader/*alias-map* {})] + reader/*alias-map* (or (get-bridged-alias-map) reader/*alias-map* {})] (loop [ns nil forms forms last-ast nil] (if (some? forms) (let [form (first forms) @@ -4853,7 +4865,7 @@ (if (or skip-cache (not cache) (requires-analysis? res cache output-dir opts)) (binding [*cljs-ns* 'cljs.user *cljs-file* path - reader/*alias-map* (or reader/*alias-map* {})] + reader/*alias-map* (or (get-bridged-alias-map) reader/*alias-map* {})] (when (or *verbose* (:verbose opts)) (util/debug-prn "Analyzing" (str res))) (let [env (assoc (empty-env) :build-options opts) diff --git a/src/main/clojure/cljs/compiler.cljc b/src/main/clojure/cljs/compiler.cljc index dfc37fb67..540bb6c92 100644 --- a/src/main/clojure/cljs/compiler.cljc +++ b/src/main/clojure/cljs/compiler.cljc @@ -1559,7 +1559,7 @@ (binding [*out* out ana/*cljs-ns* 'cljs.user ana/*cljs-file* (.getPath ^File src) - reader/*alias-map* (or reader/*alias-map* {}) + reader/*alias-map* (or (ana/get-bridged-alias-map) reader/*alias-map* {}) ana/*checked-arrays* (or ana/*checked-arrays* (:checked-arrays opts)) ana/*cljs-static-fns* (or ana/*cljs-static-fns* (:static-fns opts)) *source-map-data* (when (:source-map opts) From 54c97cfc2c5f32c381a5d89a67107817b0f51c5f Mon Sep 17 00:00:00 2001 From: David Nolen Date: Thu, 12 May 2022 12:47:55 -0400 Subject: [PATCH 3/4] * fix comment --- src/main/clojure/cljs/analyzer.cljc | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/clojure/cljs/analyzer.cljc b/src/main/clojure/cljs/analyzer.cljc index bef0b4ab6..cd8905db7 100644 --- a/src/main/clojure/cljs/analyzer.cljc +++ b/src/main/clojure/cljs/analyzer.cljc @@ -45,7 +45,8 @@ [java.net URL] [java.util.regex Pattern]))) -;; bridge clojure.tools.reader if on classpath +;; bridge clojure.tools.reader, tools.reader is a dep of ClojureScript for +;; bootstrapping anyway, so will always be on the classpath #?(:clj (load "vendor/bridge")) From 7e4a1479da558522cc7d3af7617d09d0e4e20630 Mon Sep 17 00:00:00 2001 From: David Nolen Date: Thu, 12 May 2022 13:05:29 -0400 Subject: [PATCH 4/4] * only bridge when invoking the REPL --- src/main/clojure/cljs/analyzer.cljc | 5 ----- src/main/clojure/cljs/repl.cljc | 4 ++++ 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/src/main/clojure/cljs/analyzer.cljc b/src/main/clojure/cljs/analyzer.cljc index cd8905db7..153bc2332 100644 --- a/src/main/clojure/cljs/analyzer.cljc +++ b/src/main/clojure/cljs/analyzer.cljc @@ -45,11 +45,6 @@ [java.net URL] [java.util.regex Pattern]))) -;; bridge clojure.tools.reader, tools.reader is a dep of ClojureScript for -;; bootstrapping anyway, so will always be on the classpath -#?(:clj - (load "vendor/bridge")) - #?(:clj (set! *warn-on-reflection* true)) ;; User file-local compiler flags diff --git a/src/main/clojure/cljs/repl.cljc b/src/main/clojure/cljs/repl.cljc index 511750696..8aad46308 100644 --- a/src/main/clojure/cljs/repl.cljc +++ b/src/main/clojure/cljs/repl.cljc @@ -1054,6 +1054,10 @@ [cljs.pprint :refer [pprint] :refer-macros [pp]]] bind-err true} :as opts}] + ;; bridge clojure.tools.reader to satisfy the old contract + (when (and (find-ns 'clojure.tools.reader) + (not (find-ns 'cljs.vendor.bridge))) + (clojure.core/load "vendor/bridge")) (doseq [[unknown-opt suggested-opt] (util/unknown-opts (set (keys opts)) (set/union known-repl-opts cljsc/known-opts))] (when suggested-opt (println (str "WARNING: Unknown option '" unknown-opt "'. Did you mean '" suggested-opt "'?"))))