Skip to content

Commit fd783d6

Browse files
committed
* (wip) externs-var-info, which could be used by both has-extern? and js-tag
* test are failing because - we have a bad hack that assumes we have an instance - extern-var-info doesn't tell us what the *resolved* prefix is
1 parent 4b84a1a commit fd783d6

File tree

2 files changed

+42
-12
lines changed

2 files changed

+42
-12
lines changed

src/main/clojure/cljs/analyzer.cljc

+17-12
Original file line numberDiff line numberDiff line change
@@ -1030,7 +1030,7 @@
10301030
boolean Boolean
10311031
symbol Symbol})
10321032

1033-
(defn has-extern?*
1033+
(defn extern-var-info
10341034
([pre externs]
10351035
(let [pre (if-some [me (find
10361036
(get-in externs '[Window prototype])
@@ -1039,25 +1039,29 @@
10391039
(into [tag 'prototype] (next pre))
10401040
pre)
10411041
pre)]
1042-
(has-extern?* pre externs externs)))
1043-
([pre externs top]
1042+
(extern-var-info pre externs externs nil)))
1043+
([pre externs top info]
10441044
(cond
1045-
(empty? pre) true
1045+
(empty? pre) info
10461046
:else
10471047
(let [x (first pre)
10481048
me (find externs x)]
10491049
(cond
1050-
(not me) false
1050+
(not me) nil
10511051
:else
10521052
(let [[x' externs'] me
1053-
xmeta (meta x')]
1054-
(if (and (= 'Function (:tag xmeta)) (:ctor xmeta))
1055-
(or (has-extern?* (into '[prototype] (next pre)) externs' top)
1056-
(has-extern?* (next pre) externs' top)
1053+
info' (meta x')]
1054+
(if (and (= 'Function (:tag info')) (:ctor info'))
1055+
(or (extern-var-info (into '[prototype] (next pre)) externs' top nil)
1056+
(extern-var-info (next pre) externs' top info')
10571057
;; check base type if it exists
1058-
(when-let [super (:super xmeta)]
1059-
(has-extern?* (into [super] (next pre)) externs top)))
1060-
(recur (next pre) externs' top))))))))
1058+
(when-let [super (:super info')]
1059+
(extern-var-info (into [super] (next pre)) externs top nil)))
1060+
(recur (next pre) externs' top info'))))))))
1061+
1062+
(defn has-extern?*
1063+
[pre externs]
1064+
(boolean (extern-var-info pre externs)))
10611065

10621066
(defn has-extern?
10631067
([pre]
@@ -3569,6 +3573,7 @@
35693573
{:warn-type :target :form form :property prop}))
35703574
;; Unresolveable property on existing extern
35713575
(let [[pre' pre] ((juxt butlast identity) (-> tag meta :prefix))]
3576+
(println ">>>>>" pre' pre)
35723577
(when (and (has-extern? pre') (not (has-extern? pre)))
35733578
(warning :infer-warning env
35743579
{:warn-type :property :form form

src/test/clojure/cljs/externs_infer_tests.clj

+25
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,25 @@
3535
(is (true? (ana/has-extern? '[baz] externs)))
3636
(is (false? (ana/has-extern? '[Baz] externs)))))
3737

38+
(comment
39+
40+
(def externs
41+
(externs/externs-map
42+
(closure/load-externs
43+
{:externs ["src/test/externs/test.js"]
44+
:use-only-custom-externs true})))
45+
46+
;; working
47+
(externs/info externs '[baz])
48+
(externs/info externs '[Foo gozMethod])
49+
50+
(ana/extern-var-info '[baz] externs)
51+
(ana/extern-var-info '[Foo gozMethod] externs)
52+
53+
(ana/has-extern? '[Foo] externs)
54+
55+
)
56+
3857
(deftest test-has-extern?-defaults
3958
(let [externs (externs/externs-map)]
4059
(is (true? (ana/has-extern? '[console] externs)))
@@ -189,6 +208,12 @@
189208
(string/starts-with?
190209
"Cannot resolve property gozMethod for inferred type js/Foo")))))
191210

211+
(comment
212+
213+
(clojure.test/test-vars [#'test-type-hint-infer-unknown-method])
214+
215+
)
216+
192217
(deftest test-infer-unknown-method-from-externs
193218
(let [ws (atom [])
194219
res (infer-test-helper

0 commit comments

Comments
 (0)