Skip to content

Commit 8ab53af

Browse files
committed
* handle case where we find an extern and it has a type, use the type to continue resolving
* can infer console.log again
1 parent 5980af3 commit 8ab53af

File tree

2 files changed

+24
-10
lines changed

2 files changed

+24
-10
lines changed

src/main/clojure/cljs/analyzer.cljc

Lines changed: 18 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1045,7 +1045,7 @@
10451045
:else
10461046
(let [[x' externs'] me
10471047
info' (meta x')]
1048-
(if (and (= 'Function (:tag info')) (:ctor info'))
1048+
(if (and (:ctor info') (= 'Function (:tag info')))
10491049
(or
10501050
;; then check for "static" property
10511051
(resolve-extern (next pre) externs' top
@@ -1063,12 +1063,24 @@
10631063
(when-let [super (:super info')]
10641064
(resolve-extern (into [super] (next pre)) externs top
10651065
(-> ret
1066-
(update :resolved conj x)
1066+
(assoc :resolved [])
10671067
(assoc :info nil)))))
1068-
(recur (next pre) externs' top
1069-
(-> ret
1070-
(update :resolved conj x)
1071-
(assoc :info info'))))))))))
1068+
1069+
(or
1070+
;; If the tag isn't Function, try to resolve it
1071+
;; similar to the super case above
1072+
(let [tag (:tag info')]
1073+
(when (and tag (not= 'Function tag))
1074+
(resolve-extern (into [tag] (next pre)) externs top
1075+
(-> ret
1076+
(assoc :resolved [])
1077+
(assoc :info nil)))))
1078+
1079+
;; assume static property
1080+
(recur (next pre) externs' top
1081+
(-> ret
1082+
(update :resolved conj x)
1083+
(assoc :info info')))))))))))
10721084

10731085
(defn has-extern?*
10741086
[pre externs]

src/test/clojure/cljs/externs_infer_tests.clj

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -49,16 +49,18 @@
4949
(is (= '[Number]
5050
(-> (ana/resolve-extern '[Number] externs) :resolved)))
5151
(is (= '[Number prototype valueOf]
52-
(-> (ana/resolve-extern '[Number valueOf] externs) :resolved)))))
52+
(-> (ana/resolve-extern '[Number valueOf] externs) :resolved)))
53+
(is (= '[Console]
54+
(-> (ana/resolve-extern '[console] externs) :resolved)))
55+
(is (= '[Console prototype log]
56+
(-> (ana/resolve-extern '[console log] externs) :resolved)))))
5357

5458
(comment
59+
(clojure.test/test-vars [#'test-resolve-extern])
5560

5661
(def externs (externs/externs-map))
57-
5862
;; succeeds
5963
(ana/resolve-extern '[console] externs)
60-
61-
;; this one fails
6264
(ana/resolve-extern '[console log] externs)
6365

6466
)

0 commit comments

Comments
 (0)