Skip to content

Commit adaef45

Browse files
committed
add cljs.analyzer/node-like? helper for detecting when we're generating code
that's Node-like, but not actually targeting the Node.js runtime. In this case we should generate externs for library usage.
1 parent f4cc128 commit adaef45

File tree

1 file changed

+31
-9
lines changed

1 file changed

+31
-9
lines changed

src/main/clojure/cljs/analyzer.cljc

Lines changed: 31 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -165,11 +165,14 @@
165165
(defn unchecked-arrays? []
166166
*unchecked-arrays*)
167167

168+
(defn compiler-options []
169+
(get @env/*compiler* :options))
170+
168171
(defn checked-arrays
169172
"Returns false-y, :warn, or :error based on configuration and the
170173
current value of *unchecked-arrays*."
171174
[]
172-
(when (and (not (-> @env/*compiler* :options :advanced))
175+
(when (and (not (:advanced (compiler-options)))
173176
(not *unchecked-arrays*))
174177
*checked-arrays*))
175178

@@ -1070,19 +1073,38 @@
10701073
:op :js-var
10711074
:ns full-ns})
10721075

1076+
(defn extern-pre [sym current-ns]
1077+
(let [pre (into '[Object] (->> (string/split (name sym) #"\.") (map symbol) vec))]
1078+
(when-not (has-extern? pre)
1079+
(swap! env/*compiler* update-in
1080+
(into [::namespaces current-ns :externs] pre) merge {}))
1081+
pre))
1082+
1083+
(defn node-like?
1084+
([]
1085+
(node-like? (compiler-options)))
1086+
([opts]
1087+
(and (= :nodejs (:target opts))
1088+
(false? (:nodejs-rt opts)))))
1089+
10731090
(defmethod resolve* :node
10741091
[env sym full-ns current-ns]
1075-
{:ns current-ns
1076-
:name (symbol (str current-ns) (str (munge-node-lib full-ns) "." (name sym)))
1077-
:op :js-var
1078-
:foreign true})
1092+
;; not actually targeting Node.js, we need to generate externs
1093+
(if (node-like?)
1094+
(let [pre (extern-pre sym current-ns)]
1095+
{:ns current-ns
1096+
:name (symbol (str current-ns) (str (munge-node-lib full-ns) "." (name sym)))
1097+
:op :js-var
1098+
:tag (with-meta 'js {:prefix pre})
1099+
:foreign true})
1100+
{:ns current-ns
1101+
:name (symbol (str current-ns) (str (munge-node-lib full-ns) "." (name sym)))
1102+
:op :js-var
1103+
:foreign true}))
10791104

10801105
(defmethod resolve* :global
10811106
[env sym full-ns current-ns]
1082-
(let [pre (into '[Object] (->> (string/split (name sym) #"\.") (map symbol) vec))]
1083-
(when-not (has-extern? pre)
1084-
(swap! env/*compiler* update-in
1085-
(into [::namespaces current-ns :externs] pre) merge {}))
1107+
(let [pre (extern-pre sym current-ns)]
10861108
{:ns current-ns
10871109
:name (symbol (str current-ns) (str (munge-global-export full-ns) "." (name sym)))
10881110
:op :js-var

0 commit comments

Comments
 (0)