Skip to content

Commit 4e85b04

Browse files
committed
first pass at refactoring resolve-var post module enhancements
remove code duplication & move decisions based on module types out
1 parent d02265d commit 4e85b04

1 file changed

Lines changed: 58 additions & 71 deletions

File tree

src/main/clojure/cljs/analyzer.cljc

Lines changed: 58 additions & 71 deletions
Original file line numberDiff line numberDiff line change
@@ -941,6 +941,59 @@
941941
[(checked-arrays) sym])
942942
sym))
943943

944+
(defn ns->module-type [ns]
945+
(cond
946+
(js-module-exists? ns) :js
947+
(node-module-dep? ns) :node
948+
(dep-has-global-exports? ns) :global))
949+
950+
(defmulti resolve* (fn [sym full-ns current-ns] (ns->module-type full-ns)))
951+
952+
(defmethod resolve* :node
953+
[sym full-ns current-ns]
954+
{:name (symbol (str current-ns) (str (munge-node-lib full-ns) "." (name sym)))
955+
:ns current-ns})
956+
957+
(defmethod resolve* :global
958+
[sym full-ns current-ns]
959+
{:name (symbol (str current-ns) (str (munge-global-export full-ns) "." (name sym)))
960+
:ns current-ns})
961+
962+
(defmethod resolve* :default
963+
[sym full-ns current-ns]
964+
(merge (gets @env/*compiler* ::namespaces full-ns :defs (symbol (name sym)))
965+
{:name (symbol (str full-ns) (str (name sym)))
966+
:ns full-ns}))
967+
968+
(defn required? [ns env]
969+
(or (contains? (set (vals (gets env :ns :requires))) ns)
970+
(contains? (set (vals (gets env :ns :uses))) ns)))
971+
972+
(defn invokeable-ns?
973+
"Returns true if ns is a required namespace and a JavaScript module that
974+
might be invokeable as a function."
975+
[ns env]
976+
(let [ns (resolve-ns-alias env ns)]
977+
(and (or (js-module-exists? ns)
978+
(node-module-dep? ns)
979+
(dep-has-global-exports? ns))
980+
(required? ns env))))
981+
982+
(defn resolve-invokeable-ns [ns current-ns env]
983+
(let [ns (resolve-ns-alias env ns)
984+
module-type (ns->module-type ns)]
985+
(case module-type
986+
:js {:name (symbol
987+
(or (gets @env/*compiler* :js-module-index ns)
988+
(resolve-ns-alias env ns)))
989+
:ns 'js}
990+
:node {:name (symbol (str current-ns)
991+
(munge-node-lib (resolve-ns-alias env ns)))
992+
:ns current-ns}
993+
:global {:name (symbol (str current-ns)
994+
(munge-global-export (resolve-ns-alias env ns)))
995+
:ns current-ns})))
996+
944997
(defn resolve-var
945998
"Resolve a var. Accepts a side-effecting confirm fn for producing
946999
warnings about unresolved vars."
@@ -983,19 +1036,7 @@
9831036
(when (not= current-ns full-ns)
9841037
(confirm-ns env full-ns))
9851038
(confirm env full-ns (symbol (name sym))))
986-
(cond
987-
(node-module-dep? full-ns)
988-
{:name (symbol (str current-ns)
989-
(str (munge-node-lib full-ns) "." (name sym)))
990-
:ns current-ns}
991-
(dep-has-global-exports? full-ns)
992-
{:name (symbol (str current-ns)
993-
(str (munge-global-export full-ns) "." (name sym)))
994-
:ns current-ns}
995-
:else
996-
(merge (gets @env/*compiler* ::namespaces full-ns :defs (symbol (name sym)))
997-
{:name (symbol (str full-ns) (str (name sym)))
998-
:ns full-ns})))
1039+
(resolve* sym full-ns current-ns))
9991040

10001041
(dotted-symbol? sym)
10011042
(let [idx (.indexOf s ".")
@@ -1005,8 +1046,6 @@
10051046
{:name (symbol (str (:name lb)) suffix)}
10061047
(if-some [full-ns (gets @env/*compiler* ::namespaces current-ns :imports prefix)]
10071048
{:name (symbol (str full-ns) suffix)}
1008-
1009-
;else
10101049
(if-some [info (gets @env/*compiler* ::namespaces current-ns :defs prefix)]
10111050
(merge info
10121051
{:name (symbol (str current-ns) (str sym))
@@ -1017,39 +1056,13 @@
10171056

10181057
(some? (gets @env/*compiler* ::namespaces current-ns :uses sym))
10191058
(let [full-ns (gets @env/*compiler* ::namespaces current-ns :uses sym)]
1020-
(cond
1021-
(node-module-dep? full-ns)
1022-
{:name (symbol (str current-ns) (str (munge-node-lib full-ns) "." sym))
1023-
:ns current-ns}
1024-
1025-
(dep-has-global-exports? full-ns)
1026-
{:name (symbol (str current-ns) (str (munge-global-export full-ns) "." sym))
1027-
:ns current-ns}
1028-
1029-
:else
1030-
(merge
1031-
(gets @env/*compiler* ::namespaces full-ns :defs sym)
1032-
{:name (symbol (str full-ns) (str sym))
1033-
:ns full-ns})))
1059+
(resolve* sym full-ns current-ns))
10341060

10351061
(some? (gets @env/*compiler* ::namespaces current-ns :renames sym))
10361062
(let [qualified-symbol (gets @env/*compiler* ::namespaces current-ns :renames sym)
10371063
full-ns (symbol (namespace qualified-symbol))
10381064
sym (symbol (name qualified-symbol))]
1039-
(cond
1040-
(node-module-dep? full-ns)
1041-
{:name (symbol (str current-ns) (str (munge-node-lib full-ns) "." sym))
1042-
:ns current-ns}
1043-
1044-
(dep-has-global-exports? full-ns)
1045-
{:name (symbol (str current-ns) (str (munge-global-export full-ns) "." sym))
1046-
:ns current-ns}
1047-
1048-
:else
1049-
(merge
1050-
(gets @env/*compiler* ::namespaces full-ns :defs sym)
1051-
{:name qualified-symbol
1052-
:ns full-ns})))
1065+
(resolve* sym full-ns current-ns))
10531066

10541067
(some? (gets @env/*compiler* ::namespaces current-ns :imports sym))
10551068
(recur env (gets @env/*compiler* ::namespaces current-ns :imports sym) confirm)
@@ -1070,34 +1083,8 @@
10701083
{:name (symbol "cljs.core" (str sym))
10711084
:ns 'cljs.core}))
10721085

1073-
;; The following three cases support for invoking JS modules that export themselves as function -David
1074-
(and (or (js-module-exists? s)
1075-
(js-module-exists? (resolve-ns-alias env s)))
1076-
(let [full-ns (resolve-ns-alias env s)]
1077-
(or (contains? (set (vals (gets env :ns :requires))) full-ns)
1078-
(contains? (set (vals (gets env :ns :uses))) full-ns))))
1079-
(let [module (or (gets @env/*compiler* :js-module-index s)
1080-
(resolve-ns-alias env s))]
1081-
{:name (symbol module)
1082-
:ns 'js})
1083-
1084-
(and (or (node-module-dep? s)
1085-
(node-module-dep? (resolve-ns-alias env s)))
1086-
(let [full-ns (resolve-ns-alias env s)]
1087-
(or (contains? (set (vals (gets env :ns :requires))) full-ns)
1088-
(contains? (set (vals (gets env :ns :uses))) full-ns))))
1089-
(let [module (resolve-ns-alias env s)]
1090-
{:name (symbol (str current-ns) (munge-node-lib module))
1091-
:ns current-ns})
1092-
1093-
(and (or (dep-has-global-exports? s)
1094-
(dep-has-global-exports? (resolve-ns-alias env s)))
1095-
(let [full-ns (resolve-ns-alias env s)]
1096-
(or (contains? (set (vals (gets env :ns :requires))) full-ns)
1097-
(contains? (set (vals (gets env :ns :uses))) full-ns))))
1098-
(let [module (resolve-ns-alias env s)]
1099-
{:name (symbol (str current-ns) (munge-global-export module))
1100-
:ns current-ns})
1086+
(invokeable-ns? s env)
1087+
(resolve-invokeable-ns s current-ns env)
11011088

11021089
:else
11031090
(do

0 commit comments

Comments
 (0)