Skip to content

Commit 1684a81

Browse files
committed
* fix resolve-extern behavior for resolving the var info
- we only care about var info for the last property - we don't what prefix resolution to clobber the actual instance var info * remove js-tag, incomplete, instead use resolve-extern
1 parent 8b96e4d commit 1684a81

File tree

2 files changed

+33
-30
lines changed

2 files changed

+33
-30
lines changed

src/main/clojure/cljs/analyzer.cljc

Lines changed: 26 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -1033,7 +1033,7 @@
10331033
"Given a foreign js property list, return a resolved js property list and the
10341034
extern var info"
10351035
([pre externs]
1036-
(resolve-extern pre externs externs {:resolved [] :info nil}))
1036+
(resolve-extern pre externs externs {:resolved []}))
10371037
([pre externs top ret]
10381038
(cond
10391039
(empty? pre) ret
@@ -1044,43 +1044,43 @@
10441044
(not me) nil
10451045
:else
10461046
(let [[x' externs'] me
1047-
info' (meta x')]
1047+
info' (meta x')
1048+
ret (cond-> ret
1049+
;; we only care about var info for the last property
1050+
;; also if we already added it, don't override it
1051+
;; because we're now resolving type information
1052+
;; not instance information anymore
1053+
;; i.e. [console] -> [Console] but :tag is Console _not_ Function vs.
1054+
;; [console log] -> [Console prototype log] where :tag is Function
1055+
(and (empty? (next pre))
1056+
(not (contains? ret :info)))
1057+
(assoc :info info'))]
10481058
(if (and (:ctor info') (= 'Function (:tag info')))
10491059
(or
10501060
;; then check for "static" property
10511061
(resolve-extern (next pre) externs' top
1052-
(-> ret
1053-
(update :resolved conj x)
1054-
(assoc :info info')))
1055-
1056-
;; first look for a property on the prototype
1057-
(resolve-extern (into '[prototype] (next pre)) externs' top
1058-
(-> ret
1059-
(update :resolved conj x)
1060-
(assoc :info nil)))
1061-
1062-
;; finally check the super class if there is one
1063-
(when-let [super (:super info')]
1064-
(resolve-extern (into [super] (next pre)) externs top
1065-
(-> ret
1066-
(assoc :resolved [])
1067-
(assoc :info nil)))))
1062+
(update ret :resolved conj x))
1063+
1064+
;; first look for a property on the prototype
1065+
(resolve-extern (into '[prototype] (next pre)) externs' top
1066+
(update ret :resolved conj x))
1067+
1068+
;; finally check the super class if there is one
1069+
(when-let [super (:super info')]
1070+
(resolve-extern (into [super] (next pre)) externs top
1071+
(assoc ret :resolved []))))
10681072

10691073
(or
10701074
;; If the tag isn't Function or undefined,
10711075
;; try to resolve it similar to the super case above
10721076
(let [tag (:tag info')]
10731077
(when (and tag (not (contains? '#{Function undefined} tag)))
10741078
(resolve-extern (into [tag] (next pre)) externs top
1075-
(-> ret
1076-
(assoc :resolved [])
1077-
(assoc :info nil)))))
1079+
(assoc ret :resolved []))))
10781080

10791081
;; assume static property
10801082
(recur (next pre) externs' top
1081-
(-> ret
1082-
(update :resolved conj x)
1083-
(assoc :info info')))))))))))
1083+
(update ret :resolved conj x))))))))))
10841084

10851085
(defn has-extern?*
10861086
[pre externs]
@@ -1101,12 +1101,8 @@
11011101
([pre tag-type externs]
11021102
(js-tag pre tag-type externs externs))
11031103
([pre tag-type externs top]
1104-
(when-let [[p externs' :as me] (find externs (first pre))]
1105-
(let [tag (-> p meta tag-type)]
1106-
(if (= (count pre) 1)
1107-
(when tag (symbol "js" (str (alias->type tag tag))))
1108-
(or (js-tag (next pre) tag-type externs' top)
1109-
(js-tag (into '[prototype] (next pre)) tag-type (get top tag) top)))))))
1104+
(when-let [tag (get-in (resolve-extern pre externs) [:info tag-type])]
1105+
(symbol "js" (str (alias->type tag tag))))))
11101106

11111107
(defn dotted-symbol? [sym]
11121108
(let [s (str sym)]

src/test/clojure/cljs/externs_infer_tests.clj

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -82,9 +82,16 @@
8282
{:externs ["src/test/externs/test.js"]}))]
8383
(is (= 'js/Console (ana/js-tag '[console] :tag externs)))
8484
(is (= 'js/Function (ana/js-tag '[console log] :tag externs)))
85+
(is (= 'js/undefined (ana/js-tag '[console log] :ret-tag externs)))
8586
(is (= 'js/Boolean (ana/js-tag '[Number isNaN] :ret-tag externs)))
8687
(is (= 'js/Foo (ana/js-tag '[baz] :ret-tag externs)))))
8788

89+
(comment
90+
91+
(clojure.test/test-vars [#'test-js-tag])
92+
93+
)
94+
8895
(defn infer-test-helper
8996
[{:keys [forms externs warnings warn js-dependency-index node-module-index with-core? opts]}]
9097
(let [test-cenv (atom

0 commit comments

Comments
 (0)