Skip to content

Commit e346289

Browse files
committed
warn about externs to Object
1 parent 8838bb9 commit e346289

2 files changed

Lines changed: 22 additions & 18 deletions

File tree

src/main/clojure/cljs/analyzer.cljc

Lines changed: 22 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -424,7 +424,9 @@
424424
(case warn-type
425425
:target (str "Cannot infer target type in expression " form "")
426426
:property (str "Cannot resolve property " property
427-
" for inferred type " type " in expression " form)))
427+
" for inferred type " type " in expression " form)
428+
:object (str "Adding extern to Object for property " property " due to "
429+
"ambiguous expression " form)))
428430

429431
(defn default-warning-handler [warning-type env extra]
430432
(when (warning-type *cljs-warnings*)
@@ -2625,24 +2627,27 @@
26252627
(vary-meta (normalize-js-tag target-tag)
26262628
update-in [:prefix] (fnil conj '[Object]) prop))
26272629
nil)]
2628-
(when (and (not (string/starts-with? (str prop) "cljs$"))
2629-
(not= 'js target-tag))
2630-
;; Cannot determine type of the target
2631-
(when (and (get-in env [:locals target])
2632-
(or (nil? target-tag)
2633-
('#{any} target-tag)))
2630+
(when (not (string/starts-with? (str prop) "cljs$"))
2631+
;; Adding to Object
2632+
(when (= 'Object (first (-> tag meta :prefix)))
26342633
(warning :infer-warning env
2635-
{:warn-type :target :form form}))
2636-
;; Unresolveable property on existing extern
2637-
(let [[pre' pre] ((juxt butlast identity) ;; drop prototype from pre'
2638-
(-> tag meta :prefix))]
2639-
(when (and (has-extern? pre') (not (has-extern? pre)))
2634+
{:warn-type :object :form form :property prop}))
2635+
(when (not= 'js target-tag)
2636+
;; Cannot determine type of the target
2637+
(when (and (get-in env [:locals target])
2638+
(or (nil? target-tag)
2639+
('#{any} target-tag)))
26402640
(warning :infer-warning env
2641-
{:warn-type :property :form form
2642-
:type (symbol "js"
2643-
(string/join "."
2644-
(cond-> pre' (= 'prototype (last pre')) butlast)))
2645-
:property prop}))))
2641+
{:warn-type :target :form form}))
2642+
;; Unresolveable property on existing extern
2643+
(let [[pre' pre] ((juxt butlast identity) (-> tag meta :prefix))]
2644+
(when (and (has-extern? pre') (not (has-extern? pre)))
2645+
(warning :infer-warning env
2646+
{:warn-type :property :form form
2647+
:type (symbol "js"
2648+
(string/join "."
2649+
(cond-> pre' (= 'prototype (last pre')) butlast)))
2650+
:property prop})))))
26462651
(when (js-tag? tag)
26472652
(let [pre (-> tag meta :prefix)]
26482653
(when-not (has-extern? pre)

src/test/clojure/cljs/analyzer_tests.clj

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -794,7 +794,6 @@
794794
(map (comp :externs second)
795795
(get @test-cenv ::a/namespaces))))))
796796

797-
;; wrong
798797
(let [test-cenv (atom {::a/externs (externs/externs-map
799798
(closure/load-externs
800799
{:externs ["src/test/externs/test.js"]}))})]

0 commit comments

Comments
 (0)