From 4e10a1e7ecea6ba24328381e4e63f884fbd16315 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ant=C3=B3nio=20Nuno=20Monteiro?= Date: Sat, 3 Nov 2018 11:09:23 +0000 Subject: [PATCH] Revert "Revert "Enable `refer`ing goog namespaces (#442)" (#444)" This reverts commit 4ce59425235a75b20d5451d0b118bbd5955e3b77. --- src/cljs/snapshot/lumo/js_deps.cljs | 9 +- src/cljs/snapshot/lumo/repl.cljs | 124 +++++++++++++++----------- src/js/cljs.js | 2 +- src/test/lumo/lumo/js_deps_tests.cljs | 15 ++-- 4 files changed, 88 insertions(+), 62 deletions(-) diff --git a/src/cljs/snapshot/lumo/js_deps.cljs b/src/cljs/snapshot/lumo/js_deps.cljs index cf26e929..e66cb3e0 100644 --- a/src/cljs/snapshot/lumo/js_deps.cljs +++ b/src/cljs/snapshot/lumo/js_deps.cljs @@ -8,10 +8,11 @@ (defn add-js-lib "Adds a js lib to the index." [index {:keys [provides] :as js-lib}] - (reduce (fn [index provided-lib] - (assoc index (symbol provided-lib) js-lib)) - index - provides)) + (into index + (mapcat (fn [provided-lib] + [[(symbol provided-lib) js-lib] + [provided-lib js-lib]])) + provides)) (defn add-js-libs "Adds multiple js libs to the index." diff --git a/src/cljs/snapshot/lumo/repl.cljs b/src/cljs/snapshot/lumo/repl.cljs index d6d24072..80eff3c3 100644 --- a/src/cljs/snapshot/lumo/repl.cljs +++ b/src/cljs/snapshot/lumo/repl.cljs @@ -13,6 +13,7 @@ [cljs.tagged-literals :as tags] [cljs.tools.reader :as r] [cljs.tools.reader.reader-types :as rt] + [clojure.set :as set] [clojure.string :as string] [cljs.spec.alpha :as spec] [cognitect.transit :as transit] @@ -88,12 +89,20 @@ (map second (re-seq #"'(.*?)'" requires))]) (re-seq #"\ngoog\.addDependency\('(.*)', \[(.*?)\], \[(.*?)\].*" - (js/$$LUMO_GLOBALS.load "goog/deps.js")))] - (into {} - (for [[path provides requires] paths-to-deps - provide provides] - [(symbol provide) {:path (str "goog/" (second (re-find #"(.*)\.js$" path))) - :requires requires}])))) + (js/$$LUMO_GLOBALS.load "goog/deps.js"))) + index (into {} + cat + (for [[path provides requires] paths-to-deps + provide provides] + (let [info {:path (str "goog/" (second (re-find #"(.*)\.js$" path))) + :requires requires + :group :goog}] + + [[provide info] + [(symbol provide) info]])))] + ;; this is fine because we only use the memoized version + (swap! st update-in [:js-dependency-index] merge index) + index)) (def ^:private closure-index (memoize closure-index*)) @@ -103,16 +112,18 @@ goog.string.StringBuffer goog.array goog.crypt.base64 - goog.math.Long})) - -(defn- goog-dep-source [name] - (let [index (closure-index)] - (when-let [{:keys [path]} (get index name)] - (let [sorted-deps (remove @goog-loaded (deps/topo-sort index name))] - (vswap! goog-loaded into sorted-deps) + goog.math.Long + goog.Uri})) + +(defn- goog-dep-source [dep-name] + (let [index (closure-index) + name (name dep-name)] + (when-let [{:keys [path] :as f} (get index name)] + (let [sorted-deps (remove (comp @goog-loaded symbol) (deps/topo-sort index name))] + (vswap! goog-loaded into (map symbol) sorted-deps) (reduce str (map (fn [dep-name] - (let [{:keys [path]} (get index dep-name)] + (let [{:keys [path]} (get index (cljs.core/name dep-name))] (js/$$LUMO_GLOBALS.load (str path JS_EXT)))) sorted-deps)))))) (defn- load-goog @@ -182,24 +193,20 @@ name) (or (contains? - '#{goog - goog.object - goog.string - goog.string.StringBuffer - goog.array - goog.crypt.base64 - goog.math.Long - cljs.core - com.cognitect.transit - com.cognitect.transit.delimiters - com.cognitect.transit.handlers - com.cognitect.transit.util - com.cognitect.transit.caching - com.cognitect.transit.types - com.cognitect.transit.eq - com.cognitect.transit.impl.decoder - com.cognitect.transit.impl.reader - com.cognitect.transit.impl.writer} + (set/union + @goog-loaded + '#{goog + cljs.core + com.cognitect.transit + com.cognitect.transit.delimiters + com.cognitect.transit.handlers + com.cognitect.transit.util + com.cognitect.transit.caching + com.cognitect.transit.types + com.cognitect.transit.eq + com.cognitect.transit.impl.decoder + com.cognitect.transit.impl.reader + com.cognitect.transit.impl.writer}) name) (ana/node-module-dep? name)))) @@ -323,19 +330,31 @@ (when-not (load-and-cb! nil path filename false cb) (cb nil)))) -(defn- load [{:keys [name macros path file] :as m} cb] - (cond - file +(defn- load [{:keys [name macros path file dump-index?] + :as m + :or {dump-index? true}} cb] + (if-not (nil? file) (load-file* file cb) - - (skip-load? name macros) - (cb {:source "" - :lang :js}) - - (re-matches #"^goog/.*" path) - (load-goog name cb) - - :else (load-other m cb))) + (let [goog-lib? (re-matches #"^goog/.*" path)] + (cond + (skip-load? name macros) + (let [cenv @env/*compiler*] + (when (and goog-lib? dump-index? + ;; `goog.string` is part of the Google Closure Library + ;; set of namespaces. This way we avoid searching the + ;; JS dependency index for a library with :group :goog + (nil? (get-in cenv [:js-dependency-index "goog.string"]))) + (swap! env/*compiler* update-in [:js-dependency-index] merge (closure-index))) + (cb {:source "" + :lang :js})) + + goog-lib? + (load-goog name cb) + + :else (load-other m cb))))) + +(defn- load-no-dump-index [m cb] + (load (assoc m :dump-index? false) cb)) (defn- macros-cache? [cache] (.endsWith (str (:name cache)) MACROS_SUFFIX)) @@ -1085,7 +1104,7 @@ [warning-handler] [ana/default-warning-handler]) cljs/*eval-fn* caching-node-eval - cljs/*load-fn* load + cljs/*load-fn* (if print-nil-result? load load-no-dump-index) ana/*cljs-ns* @current-ns *ns* (create-ns @current-ns) env/*compiler* st @@ -1111,6 +1130,10 @@ :else "source") eval-opts (fn [{:keys [ns value error] :as ret}] + (let [cenv @st] + ;; TODO: change name later, `print-nil-result?` is only for initialization + (when-not print-nil-result? + (swap! cljs/*loaded* set/difference @goog-loaded))) (if-not error (when expression? (when (or (true? print-nil-result?) @@ -1136,13 +1159,14 @@ (execute-text source-or-path opts))) (defn- ^:export execute - [type source-or-path expression? print-nil-result? setNS session-id] + [type source-or-path expression? print-nil-result? setNS session-id dump-js-index?] (when setNS (vreset! current-ns (symbol setNS))) (execute-source source-or-path {:type type :expression? expression? :print-nil-result? print-nil-result? - :session-id session-id})) + :session-id session-id + :dump-js-index? dump-js-index?})) (defn- ^:export is-readable? ([form] (is-readable? form false)) @@ -1211,11 +1235,7 @@ (setup-assert! elide-asserts) (setup-print-namespace-maps! repl?) (common/load-core-analysis-caches st repl?) - (deps/index-js-libs) - (let [index @deps/js-lib-index] - (swap! st assoc :js-dependency-index (into index - (map (fn [[k v]] [(str k) v])) - index)))) + (swap! st assoc :js-dependency-index (deps/index-js-libs))) ;; -------------------- ;; Introspection diff --git a/src/js/cljs.js b/src/js/cljs.js index 6504c126..0f52a4ba 100644 --- a/src/js/cljs.js +++ b/src/js/cljs.js @@ -551,7 +551,7 @@ async function startClojureScriptEngine(opts: CLIOptsType): Promise { } execute( - "(require '[lumo.repl :refer [apropos find-doc] :refer-macros [dir doc source]])", + "(require '[lumo.repl :refer [apropos find-doc dir doc source]])", 'text', true, false, diff --git a/src/test/lumo/lumo/js_deps_tests.cljs b/src/test/lumo/lumo/js_deps_tests.cljs index 2973e921..c751ae23 100644 --- a/src/test/lumo/lumo/js_deps_tests.cljs +++ b/src/test/lumo/lumo/js_deps_tests.cljs @@ -28,11 +28,16 @@ {:provides ["react.dom.server"] :requires ["react" "react.dom"]}]] (is (= (deps/add-js-libs {} js-libs) - '{react {:provides ["react"]} - react.dom {:provides ["react.dom"] - :requires ["react"]} - react.dom.server {:provides ["react.dom.server"] - :requires ["react" "react.dom"]}})))) + '{react {:provides ["react"]} + "react" {:provides ["react"]} + react.dom {:provides ["react.dom"] + :requires ["react"]} + "react.dom" {:provides ["react.dom"] + :requires ["react"]} + react.dom.server {:provides ["react.dom.server"] + :requires ["react" "react.dom"]} + "react.dom.server" {:provides ["react.dom.server"] + :requires ["react" "react.dom"]}})))) (deftest js-libs-to-load-test (with-redefs [deps/js-lib-index