Skip to content

Commit

Permalink
CLJS-2217: Support :rename for JS modules
Browse files Browse the repository at this point in the history
  • Loading branch information
anmonteiro authored and dnolen committed Jul 13, 2017
1 parent 6530e0d commit e1ef658
Show file tree
Hide file tree
Showing 6 changed files with 73 additions and 45 deletions.
2 changes: 1 addition & 1 deletion script/test
Expand Up @@ -12,7 +12,7 @@ mkdir -p builds/out-adv
possible=5
ran=0

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}}" > builds/out-adv/core-advanced-test.js; then
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} :foreign-libs [{:file \"src/test/cljs/calculator_global.js\" :provides [\"calculator\"] :global-exports {calculator Calculator}}]}" > builds/out-adv/core-advanced-test.js; then
>&2 echo ClojureScript compilation failed
exit 1
fi;
Expand Down
2 changes: 1 addition & 1 deletion script/test-simple
Expand Up @@ -12,7 +12,7 @@ possible=5
ran=0

#bin/cljsc test >out/core-test.js
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}}" > builds/out-simp/core-simple-test.js; then
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} :foreign-libs [{:file \"src/test/cljs/calculator_global.js\" :provides [\"calculator\"] :global-exports {calculator Calculator}}]}" > builds/out-simp/core-simple-test.js; then
>&2 echo ClojureScript compilation failed
exit 1
fi;
Expand Down
93 changes: 52 additions & 41 deletions src/main/clojure/cljs/analyzer.cljc
Expand Up @@ -927,7 +927,8 @@
{:js-fn-var true
:ret-tag ret-tag}))))
(let [s (str sym)
lb (get locals sym)]
lb (get locals sym)
current-ns (-> env :ns :name)]
(cond
(some? lb) lb

Expand All @@ -942,18 +943,18 @@
(get-in @env/*compiler* [:js-module-index ns]))
(symbol ns)))]
(when (some? confirm)
(when (not= (-> env :ns :name) full-ns)
(when (not= current-ns full-ns)
(confirm-ns env full-ns))
(confirm env full-ns (symbol (name sym))))
(cond
(node-module-dep? full-ns)
{:name (symbol (str (-> env :ns :name))
{:name (symbol (str current-ns)
(str (munge-node-lib full-ns) "." (name sym)))
:ns (-> env :ns :name)}
:ns current-ns}
(dep-has-global-exports? full-ns)
{:name (symbol (str (-> env :ns :name))
{:name (symbol (str current-ns)
(str (munge-global-export full-ns) "." (name sym)))
:ns (-> env :ns :name)}
:ns current-ns}
:else
(merge (gets @env/*compiler* ::namespaces full-ns :defs (symbol (name sym)))
{:name (symbol (str full-ns) (str (name sym)))
Expand All @@ -965,45 +966,56 @@
suffix (subs s (inc idx))]
(if-some [lb (get locals prefix)]
{:name (symbol (str (:name lb)) suffix)}
(let [cur-ns (-> env :ns :name)]
(if-some [full-ns (gets @env/*compiler* ::namespaces cur-ns :imports prefix)]
{:name (symbol (str full-ns) suffix)}

;else
(if-some [info (gets @env/*compiler* ::namespaces cur-ns :defs prefix)]
(merge info
{:name (symbol (str cur-ns) (str sym))
:ns cur-ns})
(merge (gets @env/*compiler* ::namespaces prefix :defs (symbol suffix))
{:name (if (= "" prefix) (symbol suffix) (symbol (str prefix) suffix))
:ns prefix}))))))

(some? (gets @env/*compiler* ::namespaces (-> env :ns :name) :uses sym))
(let [full-ns (gets @env/*compiler* ::namespaces (-> env :ns :name) :uses sym)]
(if-some [full-ns (gets @env/*compiler* ::namespaces current-ns :imports prefix)]
{:name (symbol (str full-ns) suffix)}

;else
(if-some [info (gets @env/*compiler* ::namespaces current-ns :defs prefix)]
(merge info
{:name (symbol (str current-ns) (str sym))
:ns current-ns})
(merge (gets @env/*compiler* ::namespaces prefix :defs (symbol suffix))
{:name (if (= "" prefix) (symbol suffix) (symbol (str prefix) suffix))
:ns prefix})))))

(some? (gets @env/*compiler* ::namespaces current-ns :uses sym))
(let [full-ns (gets @env/*compiler* ::namespaces current-ns :uses sym)]
(cond
(node-module-dep? full-ns)
{:name (symbol (str (-> env :ns :name)) (str (munge-node-lib full-ns) "." sym))
:ns (-> env :ns :name)}
{:name (symbol (str current-ns) (str (munge-node-lib full-ns) "." sym))
:ns current-ns}

(dep-has-global-exports? full-ns)
{:name (symbol (str (-> env :ns :name)) (str (munge-global-export full-ns) "." sym))
:ns (-> env :ns :name)}
{:name (symbol (str current-ns) (str (munge-global-export full-ns) "." sym))
:ns current-ns}

:else
(merge
(gets @env/*compiler* ::namespaces full-ns :defs sym)
{:name (symbol (str full-ns) (str sym))
:ns full-ns})))

(some? (gets @env/*compiler* ::namespaces (-> env :ns :name) :renames sym))
(let [qualified-symbol (gets @env/*compiler* ::namespaces (-> env :ns :name) :renames sym)
(some? (gets @env/*compiler* ::namespaces current-ns :renames sym))
(let [qualified-symbol (gets @env/*compiler* ::namespaces current-ns :renames sym)
full-ns (symbol (namespace qualified-symbol))
sym (symbol (name qualified-symbol))]
(merge
(gets @env/*compiler* ::namespaces full-ns :defs sym)
{:name qualified-symbol
:ns full-ns}))
(cond
(node-module-dep? full-ns)
{:name (symbol (str current-ns) (str (munge-node-lib full-ns) "." sym))
:ns current-ns}

(dep-has-global-exports? full-ns)
{:name (symbol (str current-ns) (str (munge-global-export full-ns) "." sym))
:ns current-ns}

:else
(merge
(gets @env/*compiler* ::namespaces full-ns :defs sym)
{:name qualified-symbol
:ns full-ns})))

(some? (gets @env/*compiler* ::namespaces (-> env :ns :name) :imports sym))
(recur env (gets @env/*compiler* ::namespaces (-> env :ns :name) :imports sym) confirm)
(some? (gets @env/*compiler* ::namespaces current-ns :imports sym))
(recur env (gets @env/*compiler* ::namespaces current-ns :imports sym) confirm)

;; The following three cases support for invoking JS modules that export themselves as function -David
(or (js-module-exists? s)
Expand All @@ -1016,21 +1028,20 @@
(or (node-module-dep? s)
(node-module-dep? (resolve-ns-alias env s)))
(let [module (resolve-ns-alias env s)]
{:name (symbol (str (-> env :ns :name)) (munge-node-lib module))
:ns (-> env :ns :name)})
{:name (symbol (str current-ns) (munge-node-lib module))
:ns current-ns})

(or (dep-has-global-exports? s)
(dep-has-global-exports? (resolve-ns-alias env s)))
(let [module (resolve-ns-alias env s)]
{:name (symbol (str (-> env :ns :name)) (munge-global-export module))
:ns (-> env :ns :name)})
{:name (symbol (str current-ns) (munge-global-export module))
:ns current-ns})

:else
(let [cur-ns (-> env :ns :name)
full-ns (cond
(some? (gets @env/*compiler* ::namespaces cur-ns :defs sym)) cur-ns
(let [full-ns (cond
(some? (gets @env/*compiler* ::namespaces current-ns :defs sym)) current-ns
(core-name? env sym) 'cljs.core
:else cur-ns)]
:else current-ns)]
(when (some? confirm)
(confirm env full-ns sym))
(merge (gets @env/*compiler* ::namespaces full-ns :defs sym)
Expand Down
8 changes: 8 additions & 0 deletions src/test/cljs/calculator_global.js
@@ -0,0 +1,8 @@
Calculator = {
add: function (a, b) {
return a + b;
},
subtract: function (a, b) {
return a - b;
}
};
10 changes: 8 additions & 2 deletions src/test/cljs/cljs/npm_deps_test.cljs
@@ -1,6 +1,12 @@
(ns cljs.npm-deps-test
(:require [cljs.test :refer [deftest is]]
["lodash/array" :as array]))
["lodash/array" :as array :refer [slice] :rename {slice slc}]
[calculator :refer [add] :rename {add plus}]))

(deftest test-module-processing
(is (= (array/nth #js [1 2 3] 1) 2)))
(is (= (array/nth #js [1 2 3] 1) 2))
;; rename works
(is (= (array-seq (slc #js [1 2 3] 1)) [2 3])))

(deftest test-global-exports
(is (= (plus 1 2) 3)))
3 changes: 3 additions & 0 deletions src/test/cljs/externs.js
@@ -1 +1,4 @@
var nth = function(array, n){};
var Calculator = {
add: function(a, b) {}
};

0 comments on commit e1ef658

Please sign in to comment.