File tree 2 files changed +39
-8
lines changed
2 files changed +39
-8
lines changed Original file line number Diff line number Diff line change 2556
2556
:tag (:tag expr)
2557
2557
:children [:expr ]}))
2558
2558
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
+
2559
2572
(defmethod parse 'new
2560
2573
[_ env [_ ctor & args :as form] _ _]
2561
2574
(disallowing-recur
2577
2590
(warning :fn-arity env {:argc argc :ctor ctor}))
2578
2591
{:env env :op :new :form form :class ctorexpr :args argexprs
2579
2592
: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))))})))
2588
2599
2589
2600
(defmethod parse 'set!
2590
2601
[_ env [_ target val alt :as form] _ _]
Original file line number Diff line number Diff line change 433
433
" Object.onAuthStateChanged;" ])
434
434
res)))))
435
435
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
+
436
456
(comment
437
457
(binding [ana/*cljs-ns* ana/*cljs-ns*]
438
458
(ana/no-warn
You can’t perform that action at this time.
0 commit comments