File tree Expand file tree Collapse file tree 2 files changed +39
-8
lines changed Expand file tree Collapse file tree 2 files changed +39
-8
lines changed Original file line number Diff line number Diff line change 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
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] _ _]
Original file line number Diff line number Diff line change 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
You can’t perform that action at this time.
0 commit comments