Skip to content

Commit aff39ca

Browse files
anmonteirodnolen
authored andcommitted
CLJS-1620: In JavaScript ES2015 modules default export name is munged to default$
1 parent 1a21fd2 commit aff39ca

File tree

12 files changed

+155
-46
lines changed

12 files changed

+155
-46
lines changed

.travis.yml

Lines changed: 24 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,30 @@ before_install:
1515
before_script:
1616
- script/bootstrap
1717
- mkdir -p builds/out-adv
18-
- bin/cljsc src/test/cljs "{:optimizations :advanced :output-wrapper true :verbose true :compiler-stats true :parallel-build true :output-dir \"builds/out-adv\" :npm-deps {:lodash \"4.17.4\"} :closure-warnings {:non-standard-jsdoc :off :global-this :off} :install-deps true :foreign-libs [{:file \"src/test/cljs/calculator_global.js\" :provides [\"calculator\"] :global-exports {calculator Calculator}} {:file \"src/test/cljs/es6_dep.js\" :module-type :es6 :provides [\"es6_calc\"]} {:file \"src/test/cljs/calculator_amd.js\" :module-type :amd :provides [\"calculator_amd\"] :requires [\"es6_calc\"]}]}" > builds/out-adv/core-advanced-test.js
18+
- bin/cljsc src/test/cljs "{:optimizations :advanced
19+
:output-wrapper true
20+
:verbose true
21+
:compiler-stats true
22+
:parallel-build true
23+
:output-dir \"builds/out-adv\"
24+
:npm-deps {:lodash \"4.17.4\"}
25+
:closure-warnings {:non-standard-jsdoc :off :global-this :off}
26+
:language-in :es6
27+
:language-out :es5
28+
:install-deps true
29+
:foreign-libs [{:file \"src/test/cljs/calculator_global.js\"
30+
:provides [\"calculator\"]
31+
:global-exports {calculator Calculator}}
32+
{:file \"src/test/cljs/es6_dep.js\"
33+
:module-type :es6
34+
:provides [\"es6_calc\"]}
35+
{:file \"src/test/cljs/calculator_amd.js\"
36+
:module-type :amd
37+
:provides [\"calculator_amd\"]
38+
:requires [\"es6_calc\"]}
39+
{:file \"src/test/cljs/es6_default_hello.js\"
40+
:provides [\"es6_default_hello\"]
41+
:module-type :es6}]}" > builds/out-adv/core-advanced-test.js
1942

2043
script:
2144
- lein test

script/test

Lines changed: 24 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,30 @@ mkdir -p builds/out-adv
1212
possible=5
1313
ran=0
1414

15-
if ! bin/cljsc src/test/cljs "{:optimizations :advanced :output-wrapper true :verbose true :compiler-stats true :parallel-build true :output-dir \"builds/out-adv\" :npm-deps {:lodash \"4.17.4\"} :closure-warnings {:non-standard-jsdoc :off :global-this :off} :install-deps true :foreign-libs [{:file \"src/test/cljs/calculator_global.js\" :provides [\"calculator\"] :global-exports {calculator Calculator}} {:file \"src/test/cljs/es6_dep.js\" :module-type :es6 :provides [\"es6_calc\"]} {:file \"src/test/cljs/calculator_amd.js\" :module-type :amd :provides [\"calculator_amd\"] :requires [\"es6_calc\"]}]}" > builds/out-adv/core-advanced-test.js; then
15+
if ! bin/cljsc src/test/cljs "{:optimizations :advanced
16+
:output-wrapper true
17+
:verbose true
18+
:compiler-stats true
19+
:parallel-build true
20+
:output-dir \"builds/out-adv\"
21+
:npm-deps {:lodash \"4.17.4\"}
22+
:closure-warnings {:non-standard-jsdoc :off :global-this :off}
23+
:install-deps true
24+
:language-in :es6
25+
:language-out :es5
26+
:foreign-libs [{:file \"src/test/cljs/calculator_global.js\"
27+
:provides [\"calculator\"]
28+
:global-exports {calculator Calculator}}
29+
{:file \"src/test/cljs/es6_dep.js\"
30+
:module-type :es6
31+
:provides [\"es6_calc\"]}
32+
{:file \"src/test/cljs/calculator_amd.js\"
33+
:module-type :amd
34+
:provides [\"calculator_amd\"]
35+
:requires [\"es6_calc\"]}
36+
{:file \"src/test/cljs/es6_default_hello.js\"
37+
:provides [\"es6_default_hello\"]
38+
:module-type :es6}]}" > builds/out-adv/core-advanced-test.js; then
1639
>&2 echo ClojureScript compilation failed
1740
exit 1
1841
fi;

script/test-simple

Lines changed: 25 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,31 @@ possible=5
1212
ran=0
1313

1414
#bin/cljsc test >out/core-test.js
15-
if ! bin/cljsc src/test/cljs "{:optimizations :simple :static-fns true :output-dir \"builds/out-simp\" :cache-analysis true :output-wrapper true :verbose true :compiler-stats true :npm-deps {:lodash \"4.17.4\"} :closure-warnings {:non-standard-jsdoc :off :global-this :off} :install-deps true :foreign-libs [{:file \"src/test/cljs/calculator_global.js\" :provides [\"calculator\"] :global-exports {calculator Calculator}} {:file \"src/test/cljs/es6_dep.js\" :module-type :es6 :provides [\"es6_calc\"]} {:file \"src/test/cljs/calculator_amd.js\" :module-type :amd :provides [\"calculator_amd\"] :requires [\"es6_calc\"]}]}" > builds/out-simp/core-simple-test.js; then
15+
if ! bin/cljsc src/test/cljs "{:optimizations :simple
16+
:static-fns true
17+
:output-dir \"builds/out-simp\"
18+
:cache-analysis true
19+
:output-wrapper true
20+
:verbose true
21+
:compiler-stats true
22+
:npm-deps {:lodash \"4.17.4\"}
23+
:closure-warnings {:non-standard-jsdoc :off :global-this :off}
24+
:install-deps true
25+
:language-in :es6
26+
:language-out :es5
27+
:foreign-libs [{:file \"src/test/cljs/calculator_global.js\"
28+
:provides [\"calculator\"]
29+
:global-exports {calculator Calculator}}
30+
{:file \"src/test/cljs/es6_dep.js\"
31+
:module-type :es6
32+
:provides [\"es6_calc\"]}
33+
{:file \"src/test/cljs/calculator_amd.js\"
34+
:module-type :amd
35+
:provides [\"calculator_amd\"]
36+
:requires [\"es6_calc\"]}
37+
{:file \"src/test/cljs/es6_default_hello.js\"
38+
:provides [\"es6_default_hello\"]
39+
:module-type :es6}]}" > builds/out-simp/core-simple-test.js; then
1640
>&2 echo ClojureScript compilation failed
1741
exit 1
1842
fi;

src/main/cljs/cljs/pprint.cljs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2537,7 +2537,7 @@ of parameters as well."
25372537

25382538
(merge ; create the result map
25392539
(into (array-map) ; start with the default values, make sure the order is right
2540-
(reverse (for [[name [default]] (:params def)] [name [default offset]])))
2540+
(reverse (for [[name [default-def]] (:params def)] [name [default-def offset]])))
25412541
(reduce #(apply assoc %1 %2) {} (filter #(first (nth % 1)) (zipmap (keys (:params def)) params))) ; add the specified parameters, filtering out nils
25422542
flags)); and finally add the flags
25432543

src/main/cljs/cljs/stacktrace.cljc

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -576,11 +576,11 @@ goog.events.getProxy/f<@http://localhost:9000/out/goog/events/events.js:276:16"
576576
(second (first columns)))))
577577
(adjust [mapped]
578578
(vec (map #(%1 %2) [inc inc identity] mapped)))]
579-
(let [default [line column nil]]
579+
(let [default-ret [line column nil]]
580580
;; source maps are 0 indexed for lines
581581
(if-let [columns (get source-map (dec line))]
582582
(adjust (map (get-best-column columns column) [:line :col :name]))
583-
default)))))
583+
default-ret)))))
584584

585585
(defn mapped-frame
586586
"Given opts and a canonicalized JavaScript stacktrace frame, return the

src/main/cljs/cljs/test.cljs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -386,7 +386,7 @@
386386
first)))
387387

388388
(defn mapped-line-and-column [filename line column]
389-
(let [default [filename line column]]
389+
(let [default-ret [filename line column]]
390390
(if-let [source-map (:source-map (get-current-env))]
391391
;; source maps are 0 indexed for lines
392392
(if-let [columns (get-in source-map [filename (dec line)])]
@@ -400,8 +400,8 @@
400400
mapping
401401
(second (first columns))))
402402
[:source :line :col]))
403-
default)
404-
default)))
403+
default-ret)
404+
default-ret)))
405405

406406
(defn file-and-line [exception depth]
407407
;; TODO: flesh out

src/main/clojure/cljs/analyzer.cljc

Lines changed: 28 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -182,6 +182,9 @@
182182
"volatile" "while" "with" "yield" "methods"
183183
"null" "constructor"})
184184

185+
(def es5-allowed
186+
#{"default"})
187+
185188
#?(:clj (def SENTINEL (Object.))
186189
:cljs (def SENTINEL (js-obj)))
187190

@@ -741,7 +744,10 @@
741744
;; we need to check both keys and values of the JS module index, because
742745
;; macroexpansion will be looking for the provided name - António Monteiro
743746
(contains?
744-
(into #{} (mapcat identity) (get-in @env/*compiler* [:js-module-index]))
747+
(into #{}
748+
(mapcat (fn [[k v]]
749+
[k (:name v)]))
750+
(get-in @env/*compiler* [:js-module-index]))
745751
(str module)))
746752

747753
(defn node-module-dep?
@@ -791,16 +797,16 @@
791797
(defn resolve-ns-alias
792798
([env name]
793799
(resolve-ns-alias env name (symbol name)))
794-
([env name default]
800+
([env name not-found]
795801
(let [sym (symbol name)]
796-
(get (:requires (:ns env)) sym default))))
802+
(get (:requires (:ns env)) sym not-found))))
797803

798804
(defn resolve-macro-ns-alias
799805
([env name]
800806
(resolve-macro-ns-alias env name (symbol name)))
801-
([env name default]
807+
([env name not-found]
802808
(let [sym (symbol name)]
803-
(get (:require-macros (:ns env)) sym default))))
809+
(get (:require-macros (:ns env)) sym not-found))))
804810

805811
(defn confirm-ns
806812
"Given env, an analysis environment, and ns-sym, a symbol identifying a
@@ -950,6 +956,11 @@
950956

951957
(defmulti resolve* (fn [sym full-ns current-ns] (ns->module-type full-ns)))
952958

959+
(defmethod resolve* :js
960+
[sym full-ns current-ns]
961+
{:name (symbol (str full-ns) (str (name sym)))
962+
:ns full-ns})
963+
953964
(defmethod resolve* :node
954965
[sym full-ns current-ns]
955966
{:name (symbol (str current-ns) (str (munge-node-lib full-ns) "." (name sym)))
@@ -985,7 +996,7 @@
985996
module-type (ns->module-type ns)]
986997
(case module-type
987998
:js {:name (symbol
988-
(or (gets @env/*compiler* :js-module-index ns)
999+
(or (gets @env/*compiler* :js-module-index ns :name)
9891000
(resolve-ns-alias env ns)))
9901001
:ns 'js}
9911002
:node {:name (symbol (str current-ns)
@@ -1031,7 +1042,7 @@
10311042
ns)
10321043
full-ns (resolve-ns-alias env ns
10331044
(or (and (js-module-exists? ns)
1034-
(get-in @env/*compiler* [:js-module-index ns]))
1045+
(gets @env/*compiler* :js-module-index ns :name))
10351046
(symbol ns)))]
10361047
(when (some? confirm)
10371048
(when (not= current-ns full-ns)
@@ -1348,14 +1359,14 @@
13481359
:children [test-expr then-expr else-expr]}))
13491360

13501361
(defmethod parse 'case*
1351-
[op env [_ sym tests thens default :as form] name _]
1362+
[op env [_ sym tests thens default-clause :as form] name _]
13521363
(assert (symbol? sym) "case* must switch on symbol")
13531364
(assert (every? vector? tests) "case* tests must be grouped in vectors")
13541365
(let [expr-env (assoc env :context :expr)
13551366
v (disallowing-recur (analyze expr-env sym))
13561367
tests (mapv #(mapv (fn [t] (analyze expr-env t)) %) tests)
13571368
thens (mapv #(analyze env %) thens)
1358-
default (analyze env default)]
1369+
default-clause (analyze env default-clause)]
13591370
(assert (every? (fn [t]
13601371
(or
13611372
(-> t :info :const)
@@ -1364,8 +1375,8 @@
13641375
(apply concat tests))
13651376
"case* tests must be numbers, strings, or constants")
13661377
{:env env :op :case* :form form
1367-
:v v :tests tests :thens thens :default default
1368-
:children (vec (concat [v] tests thens (if default [default])))}))
1378+
:v v :tests tests :thens thens :default default-clause
1379+
:children (vec (concat [v] tests thens (if default-clause [default-clause])))}))
13691380

13701381
(defmethod parse 'throw
13711382
[op env [_ throw :as form] name _]
@@ -1404,9 +1415,9 @@
14041415
finally (when (seq fblock)
14051416
(analyze (assoc env :context :statement) `(do ~@(rest fblock))))
14061417
e (when (or (seq cblocks) dblock) (gensym "e"))
1407-
default (if-let [[_ _ name & cb] dblock]
1408-
`(cljs.core/let [~name ~e] ~@cb)
1409-
`(throw ~e))
1418+
default-block (if-let [[_ _ name & cb] dblock]
1419+
`(cljs.core/let [~name ~e] ~@cb)
1420+
`(throw ~e))
14101421
cblock (if (seq cblocks)
14111422
`(cljs.core/cond
14121423
~@(mapcat
@@ -1415,8 +1426,8 @@
14151426
`[(cljs.core/instance? ~type ~e)
14161427
(cljs.core/let [~name ~e] ~@cb)])
14171428
cblocks)
1418-
:else ~default)
1419-
default)
1429+
:else ~default-block)
1430+
default-block)
14201431
locals (:locals catchenv)
14211432
locals (if e
14221433
(assoc locals e
@@ -2339,7 +2350,7 @@
23392350
;; Google Closure compiler, e.g. module$resources$libs$calculator.
23402351
;; This means that we need to create an alias from the module name
23412352
;; given with :provides to the new name.
2342-
[lib js-module-provides] (if-some [js-module-name (get-in @env/*compiler* [:js-module-index (str lib)])]
2353+
[lib js-module-provides] (if-some [js-module-name (gets @env/*compiler* :js-module-index (str lib) :name)]
23432354
[(symbol js-module-name) lib]
23442355
[lib nil])
23452356
{alias :as referred :refer renamed :rename

src/main/clojure/cljs/closure.clj

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2321,17 +2321,18 @@
23212321
js-modules)
23222322
js-modules (convert-js-modules js-modules opts)]
23232323
;; Write modules to disk, update compiler state and build new options
2324-
(reduce (fn [new-opts {:keys [file] :as ijs}]
2324+
(reduce (fn [new-opts {:keys [file module-type] :as ijs}]
23252325
(let [ijs (write-javascript opts ijs)
23262326
module-name (-> (deps/load-library (:out-file ijs)) first :provides first)]
23272327
(doseq [provide (:provides ijs)]
23282328
(swap! env/*compiler*
2329-
#(update-in % [:js-module-index] assoc provide module-name)))
2329+
#(update-in % [:js-module-index] assoc provide {:name module-name
2330+
:module-type module-type})))
23302331
(-> new-opts
2331-
(update-in [:libs] (comp vec conj) (:out-file ijs))
2332-
;; js-module might be defined in either, so update both
2333-
(update-in [:foreign-libs] (comp vec (fn [libs] (remove #(= (:file %) file) libs))))
2334-
(update-in [:ups-foreign-libs] (comp vec (fn [libs] (remove #(= (:file %) file) libs)))))))
2332+
(update-in [:libs] (comp vec conj) (:out-file ijs))
2333+
;; js-module might be defined in either, so update both
2334+
(update-in [:foreign-libs] (comp vec (fn [libs] (remove #(= (:file %) file) libs))))
2335+
(update-in [:ups-foreign-libs] (comp vec (fn [libs] (remove #(= (:file %) file) libs)))))))
23352336
opts js-modules)))
23362337
opts)))
23372338

src/main/clojure/cljs/compiler.cljc

Lines changed: 19 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,15 @@
3636

3737
(def js-reserved ana/js-reserved)
3838

39+
(def ^:private es5>=
40+
(into #{}
41+
(comp
42+
(mapcat (fn [lang]
43+
[lang (keyword (string/replace (name lang) #"^ecmascript" "es"))])))
44+
[:ecmascript5 :ecmascript5-strict :ecmascript6 :ecmascript6-strict
45+
:ecmascript-2015 :ecmascript6-typed :ecmascript-2016 :ecmascript-2017
46+
:ecmascript-next]))
47+
3948
(def ^:dynamic *recompiled* nil)
4049
(def ^:dynamic *inputs* nil)
4150
(def ^:dynamic *source-map-data* nil)
@@ -333,9 +342,10 @@
333342
[{:keys [info env form] :as ast}]
334343
(if-let [const-expr (:const-expr ast)]
335344
(emit (assoc const-expr :env env))
336-
(let [var-name (:name info)
345+
(let [{:keys [options] :as cenv} @env/*compiler*
346+
var-name (:name info)
337347
info (if (= (namespace var-name) "js")
338-
(let [js-module-name (get-in @env/*compiler* [:js-module-index (name var-name)])]
348+
(let [js-module-name (get-in cenv [:js-module-index (name var-name) :name])]
339349
(or js-module-name (name var-name)))
340350
info)]
341351
; We need a way to write bindings out to source maps and javascript
@@ -346,10 +356,13 @@
346356
; (prevents duplicate fn-param-names)
347357
(emits (munge ast))
348358
(when-not (= :statement (:context env))
349-
(emit-wrap env
350-
(emits
351-
(cond-> info
352-
(not= form 'js/-Infinity) munge))))))))
359+
(let [reserved (cond-> js-reserved
360+
(es5>= (:language-out options))
361+
(set/difference ana/es5-allowed))]
362+
(emit-wrap env
363+
(emits
364+
(cond-> info
365+
(not= form 'js/-Infinity) (munge reserved))))))))))
353366

354367
(defmethod emit* :var-special
355368
[{:keys [env var sym meta] :as arg}]

src/test/cljs/cljs/npm_deps_test.cljs

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,8 @@
33
(:require [cljs.test :refer [deftest is]]
44
["lodash/array" :as array :refer [slice] :rename {slice slc}]
55
[calculator :as vector :refer [add] :rename {add plus}]
6-
[es6_calc]))
6+
[es6_calc]
7+
[es6_default_hello :as es6hello]))
78

89
(def array #js [1 2 3])
910

@@ -25,3 +26,6 @@
2526

2627
(deftest test-cljs-2286
2728
(is (= 3 (es6_calc/calculator.add 1 2))))
29+
30+
(deftest test-cljs-1620
31+
(is (= "Hello, world!" (es6hello/default))))

0 commit comments

Comments
 (0)