Skip to content

Commit ca80f0c

Browse files
anmonteiroswannodette
authored andcommitted
CLJS-1802: Generated namespaces should be of the form cljs.user.fileXXXX
1 parent c9c1229 commit ca80f0c

File tree

4 files changed

+45
-28
lines changed

4 files changed

+45
-28
lines changed

src/main/clojure/cljs/analyzer.cljc

Lines changed: 14 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -36,8 +36,6 @@
3636
[java.util.regex Pattern]
3737
[java.net URL]
3838
[java.lang Throwable]
39-
[java.security MessageDigest]
40-
[javax.xml.bind DatatypeConverter]
4139
[clojure.lang Namespace Var LazySeq ArityException]
4240
[cljs.tagged_literals JSValue])))
4341

@@ -3144,17 +3142,14 @@
31443142

31453143
#?(:clj
31463144
(defn gen-user-ns [src]
3147-
(let [name (str src)
3148-
name (.substring name (inc (.lastIndexOf name "/")) (.lastIndexOf name "."))
3149-
digest (MessageDigest/getInstance "SHA-1")]
3150-
(.reset digest)
3151-
(.update digest (.getBytes ^String name "utf8"))
3145+
(let [full-name (str src)
3146+
name (.substring full-name
3147+
(inc (.lastIndexOf full-name "/"))
3148+
(.lastIndexOf full-name "."))]
31523149
(symbol
3153-
(str
3154-
"cljs.user$$gen_ns$$_" name
3155-
(->> (DatatypeConverter/printHexBinary (.digest digest))
3156-
(take 7)
3157-
(apply str)))))))
3150+
(apply str
3151+
"cljs.user." name
3152+
(take 7 (util/content-sha full-name)))))))
31583153

31593154
#?(:clj
31603155
(defn parse-ns
@@ -3198,9 +3193,7 @@
31983193
(forms-seq* rdr (source-path src))
31993194
src)
32003195
ret (merge
3201-
{:ns (gen-user-ns src)
3202-
:provides [(gen-user-ns src)]
3203-
:file dest
3196+
{:file dest
32043197
:source-file (when rdr src)
32053198
:source-forms (when-not rdr src)
32063199
:macros-ns (:macros-ns opts)
@@ -3242,7 +3235,12 @@
32423235
(= :ns* (:op ast))
32433236
(let [deps (merge (:uses ast) (:requires ast))]
32443237
(recur (rest forms)
3245-
(update-in ret [:requires] into (set (vals deps)))))
3238+
(cond-> (update-in ret [:requires] into (set (vals deps)))
3239+
;; we need to defer generating the user namespace
3240+
;; until we actually need or it will break when
3241+
;; `src` is a sequence of forms - António Monteiro
3242+
(not (:ns ret))
3243+
(assoc :ns (gen-user-ns src) :provides [(gen-user-ns src)]))))
32463244

32473245
:else ret))
32483246
ret))

src/main/clojure/cljs/closure.clj

Lines changed: 5 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -60,8 +60,6 @@
6060
ES6ModuleLoader AbstractCompiler TransformAMDToCJSModule
6161
ProcessEs6Modules CompilerInput]
6262
[com.google.javascript.rhino Node]
63-
[java.security MessageDigest]
64-
[javax.xml.bind DatatypeConverter]
6563
[java.nio.file Path Paths Files StandardWatchEventKinds WatchKey
6664
WatchEvent FileVisitor FileVisitResult]
6765
[java.nio.charset Charset StandardCharsets]
@@ -1506,14 +1504,11 @@
15061504
:else (path-from-jarfile url))
15071505

15081506
(string? js)
1509-
(let [digest (MessageDigest/getInstance "SHA-1")]
1510-
(.reset digest)
1511-
(.update digest (.getBytes ^String js "utf8"))
1512-
(str
1513-
(->> (DatatypeConverter/printHexBinary (.digest digest))
1514-
(take 7)
1515-
(apply str))
1516-
".js"))
1507+
(str
1508+
(->> (util/content-sha js)
1509+
(take 7)
1510+
(apply str))
1511+
".js")
15171512

15181513
:else (str (random-string 5) ".js")))))
15191514

src/main/clojure/cljs/util.cljc

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,9 @@
1313
[clojure.set :as set]
1414
[clojure.edn :as edn])
1515
(:import [java.io File]
16-
[java.net URL]))
16+
[java.net URL]
17+
[java.security MessageDigest]
18+
[javax.xml.bind DatatypeConverter]))
1719

1820
;; next line is auto-generated by the build-script - Do not edit!
1921
(def ^:dynamic *clojurescript-version*)
@@ -261,3 +263,9 @@
261263
(cons x (step (rest s) (conj seen v)))))))
262264
xs seen)))]
263265
(step coll #{}))))
266+
267+
(defn content-sha [^String s]
268+
(let [digest (MessageDigest/getInstance "SHA-1")]
269+
(.reset digest)
270+
(.update digest (.getBytes s "utf8"))
271+
(DatatypeConverter/printHexBinary (.digest digest))))

src/test/clojure/cljs/analyzer_tests.clj

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,8 @@
33
[cljs.analyzer :as a]
44
[cljs.env :as e]
55
[cljs.env :as env]
6-
[cljs.analyzer.api :as ana-api])
6+
[cljs.analyzer.api :as ana-api]
7+
[cljs.util :as util])
78
(:use clojure.test))
89

910
(defn collecting-warning-handler [state]
@@ -567,3 +568,18 @@
567568
(:require [clojure.set :as set])) [1 2]))
568569
(a/analyze test-env
569570
'(map #(require '[clojure.set :as set]) [1 2]))))))
571+
572+
(deftest test-gen-user-ns
573+
;; note: can't use `with-redefs` because direct-linking is enabled
574+
(let [s "src/cljs/foo.cljs"
575+
sha (util/content-sha s)]
576+
(is (= (a/gen-user-ns s) (symbol (str "cljs.user.foo" (apply str (take 7 sha)))))))
577+
(let [a "src/cljs/foo.cljs"
578+
b "src/cljs/foo.cljc"]
579+
;; namespaces should have different names because the filename hash will be different
580+
(is (not= (a/gen-user-ns a) (a/gen-user-ns b)))
581+
;; specifically, only the hashes should differ
582+
(let [nsa (str (a/gen-user-ns a))
583+
nsb (str (a/gen-user-ns b))]
584+
(is (not= (.substring nsa (- (count nsa) 7)) (.substring nsb (- (count nsb) 7))))
585+
(is (= (.substring nsa 0 (- (count nsa) 7)) (.substring nsb 0 (- (count nsb) 7)))))))

0 commit comments

Comments
 (0)