Skip to content

Commit 0ff0d2a

Browse files
committed
warning for unresolveable properties on known extern types
1 parent b7cf258 commit 0ff0d2a

2 files changed

Lines changed: 32 additions & 10 deletions

File tree

src/main/clojure/cljs/analyzer.cljc

Lines changed: 18 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -420,8 +420,11 @@
420420
(str name " is shadowed by a local"))
421421

422422
(defmethod error-message :infer-warning
423-
[warning-type {:keys [form]}]
424-
(str "Cannot infer target type for " form ""))
423+
[warning-type {:keys [warn-type form type property]}]
424+
(case warn-type
425+
:target (str "Cannot infer target type in expression " form "")
426+
:property (str "Cannot resolve property " property
427+
" for inferred type " type " in expression " form)))
425428

426429
(defn default-warning-handler [warning-type env extra]
427430
(when (warning-type *cljs-warnings*)
@@ -2623,11 +2626,19 @@
26232626
update-in [:prefix] (fnil conj '[Object]) prop))
26242627
nil)]
26252628
(when (and (not (string/starts-with? (str prop) "cljs$"))
2626-
(not= 'js target-tag)
2627-
(get-in env [:locals target]))
2628-
(when (or (nil? target-tag)
2629-
('#{any} target-tag))
2630-
(warning :infer-warning env {:form form})))
2629+
(not= 'js target-tag))
2630+
(when (and (get-in env [:locals target])
2631+
(or (nil? target-tag)
2632+
('#{any} target-tag)))
2633+
(warning :infer-warning env
2634+
{:warn-type :target :form form}))
2635+
(let [[pre' pre] ((juxt (comp butlast butlast) identity) ;; drop prototype from pre'
2636+
(-> tag meta :prefix))]
2637+
(when (and (has-extern? pre') (not (has-extern? pre)))
2638+
(warning :infer-warning env
2639+
{:warn-type :property :form form
2640+
:type (symbol "js" (string/join "." pre'))
2641+
:property prop}))))
26312642
(when (js-tag? tag)
26322643
(let [pre (-> tag meta :prefix)]
26332644
(when-not (has-extern? pre)

src/test/clojure/cljs/analyzer_tests.clj

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -703,6 +703,18 @@
703703
(map (comp :externs second)
704704
(get @test-cenv ::a/namespaces))))))
705705

706+
(let [test-cenv (atom {::a/externs (externs/externs-map)})]
707+
(binding [a/*cljs-ns* a/*cljs-ns*
708+
a/*cljs-warnings* (assoc a/*cljs-warnings* :infer-warning true)]
709+
(e/with-compiler-env test-cenv
710+
(a/analyze-form-seq
711+
'[(defn foo [^js/React.Component c]
712+
(.render c))]))
713+
(cc/emit-externs
714+
(reduce util/map-merge {}
715+
(map (comp :externs second)
716+
(get @test-cenv ::a/namespaces))))))
717+
706718
;; works, does not generate extern
707719
(let [test-cenv (atom {::a/externs (externs/externs-map
708720
(closure/load-externs
@@ -761,19 +773,18 @@
761773
(map (comp :externs second)
762774
(get @test-cenv ::a/namespaces))))))
763775

764-
;; works, generates externs
776+
;; known extern
765777
(let [test-cenv (atom {::a/externs (externs/externs-map
766778
(closure/load-externs
767779
{:externs ["src/test/externs/test.js"]}))})]
768780
(binding [a/*cljs-ns* a/*cljs-ns*
769781
a/*cljs-warnings* (assoc a/*cljs-warnings* :infer-warning true)]
770782
(e/with-compiler-env test-cenv
771783
(a/analyze-form-seq
772-
'[(.gozMethod (js/woz))]))
784+
'[(.gozMethod (js/baz))]))
773785
(cc/emit-externs
774786
(reduce util/map-merge {}
775787
(map (comp :externs second)
776788
(get @test-cenv ::a/namespaces))))))
777789

778-
779790
)

0 commit comments

Comments
 (0)