Skip to content

Commit 9562ae1

Browse files
authored
CLJS-3377: Objects created from required JS constructor are not poisoned (#181)
CLJS-3377: Objects created from required JS constructor are not poisoned (#181) fix 'new analyzer case to return 'js if the tag of the constructor is 'js add test case
1 parent c0d3052 commit 9562ae1

File tree

2 files changed

+39
-8
lines changed

2 files changed

+39
-8
lines changed

src/main/clojure/cljs/analyzer.cljc

+19-8
Original file line numberDiff line numberDiff line change
@@ -2556,6 +2556,19 @@
25562556
:tag (:tag expr)
25572557
:children [:expr]}))
25582558

2559+
(def js-prim-ctor->tag
2560+
'{js/Object object
2561+
js/String string
2562+
js/Array array
2563+
js/Number number
2564+
js/Function function
2565+
js/Boolean boolean})
2566+
2567+
(defn prim-ctor?
2568+
"Test whether a tag is a constructor for a JS primitive"
2569+
[t]
2570+
(contains? js-prim-ctor->tag t))
2571+
25592572
(defmethod parse 'new
25602573
[_ env [_ ctor & args :as form] _ _]
25612574
(disallowing-recur
@@ -2577,14 +2590,12 @@
25772590
(warning :fn-arity env {:argc argc :ctor ctor}))
25782591
{:env env :op :new :form form :class ctorexpr :args argexprs
25792592
:children [:class :args]
2580-
:tag (let [name (-> ctorexpr :info :name)]
2581-
(or ('{js/Object object
2582-
js/String string
2583-
js/Array array
2584-
js/Number number
2585-
js/Function function
2586-
js/Boolean boolean} name)
2587-
name))})))
2593+
:tag (let [tag (-> ctorexpr :info :tag)]
2594+
(if (and (js-tag? tag)
2595+
(not (prim-ctor? tag)))
2596+
'js ; some foreign thing, drop the prefix
2597+
(let [name (-> ctorexpr :info :name)]
2598+
(or (js-prim-ctor->tag name) name))))})))
25882599

25892600
(defmethod parse 'set!
25902601
[_ env [_ target val alt :as form] _ _]

src/test/clojure/cljs/externs_infer_tests.clj

+20
Original file line numberDiff line numberDiff line change
@@ -433,6 +433,26 @@
433433
"Object.onAuthStateChanged;"])
434434
res)))))
435435

436+
(deftest test-cljs-3377
437+
(testing "constructors from foreign libraries that used via `new` should propagate 'js hints"
438+
(let [ws (atom [])
439+
res (infer-test-helper
440+
{:js-dependency-index {"firebase" {:global-exports '{firebase Firebase}}}
441+
:forms '[(ns foo.core
442+
(:require [firebase :refer [GoogleAuthProvider]]))
443+
(def goog-provider
444+
(GoogleAuthProvider.))
445+
(.someMethod goog-provider)
446+
(.-someProperty goog-provider)]
447+
:warnings ws
448+
:warn true
449+
:with-core? false})]
450+
(is (= (unsplit-lines
451+
["Object.GoogleAuthProvider;"
452+
"Object.someMethod;"
453+
"Object.someProperty;"])
454+
res)))))
455+
436456
(comment
437457
(binding [ana/*cljs-ns* ana/*cljs-ns*]
438458
(ana/no-warn

0 commit comments

Comments
 (0)