Skip to content

Commit c1cd872

Browse files
committed
* change normalize-js-tag so it marks the ctor prop
* add normalize-unresolved-prefix to fix up the cases we can't find * add impl unit tests * all externs infer tests passing again
1 parent 1684a81 commit c1cd872

File tree

2 files changed

+45
-4
lines changed

2 files changed

+45
-4
lines changed

src/main/clojure/cljs/analyzer.cljc

Lines changed: 16 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -980,9 +980,10 @@
980980
(defn normalize-js-tag [x]
981981
;; if not 'js, assume constructor
982982
(if-not (= 'js x)
983-
(with-meta 'js
984-
{:prefix (conj (->> (string/split (name x) #"\.")
985-
(map symbol) vec))})
983+
(let [props (->> (string/split (name x) #"\.") (map symbol))
984+
[xs y] ((juxt butlast last) props)]
985+
(with-meta 'js
986+
{:prefix (vec (concat xs [(with-meta y {:ctor true})]))}))
986987
x))
987988

988989
(defn ->type-set
@@ -1082,6 +1083,16 @@
10821083
(recur (next pre) externs' top
10831084
(update ret :resolved conj x))))))))))
10841085

1086+
(defn normalize-unresolved-prefix
1087+
[pre]
1088+
(cond-> pre
1089+
(< 1 (count pre))
1090+
(cond->
1091+
(-> pre pop peek meta :ctor)
1092+
(-> pop
1093+
(conj 'prototype)
1094+
(conj (peek pre))))))
1095+
10851096
(defn has-extern?*
10861097
[pre externs]
10871098
(boolean (resolve-extern pre externs)))
@@ -3600,7 +3611,8 @@
36003611
(let [pre (-> tag meta :prefix)]
36013612
(when-not (has-extern? pre)
36023613
(swap! env/*compiler* update-in
3603-
(into [::namespaces (-> env :ns :name) :externs] pre) merge {}))))
3614+
(into [::namespaces (-> env :ns :name) :externs]
3615+
(normalize-unresolved-prefix pre)) merge {}))))
36043616
(case dot-action
36053617
::access (let [children [:target]]
36063618
{:op :host-field

src/test/clojure/cljs/externs_infer_tests.clj

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,26 @@
2323
"goog.isArrayLike;" "Java.type;" "Object.out;" "Object.out.println;"
2424
"Object.error;" "Object.error.println;"])
2525

26+
(deftest test-normalize-js-tag
27+
(is (= 'js (ana/normalize-js-tag 'js)))
28+
(is (= '[Foo] (-> 'js/Foo ana/normalize-js-tag meta :prefix)))
29+
(is (true? (-> 'js/Foo ana/normalize-js-tag meta :prefix last meta :ctor)))
30+
(is (= '[Foo Bar] (-> 'js/Foo.Bar ana/normalize-js-tag meta :prefix)))
31+
(is (true? (-> 'js/Foo.Bar ana/normalize-js-tag meta :prefix last meta :ctor))))
32+
33+
(deftest test-normalize-unresolved-prefix
34+
(let [pre (-> (ana/normalize-js-tag 'js/Foo) meta :prefix (conj 'bar))]
35+
(is (= '[Foo prototype bar] (ana/normalize-unresolved-prefix pre))))
36+
(let [pre '[Foo bar]]
37+
(is (= '[Foo bar] (ana/normalize-unresolved-prefix pre)))))
38+
39+
(comment
40+
41+
(test/test-vars [#'test-normalize-js-tag])
42+
(test/test-vars [#'test-normalize-unresolved-prefix])
43+
44+
)
45+
2646
(deftest test-resolve-extern
2747
(let [externs
2848
(externs/externs-map
@@ -233,6 +253,15 @@
233253

234254
(comment
235255

256+
(require '[clojure.java.io :as io]
257+
'[cljs.closure :as cc])
258+
259+
(def externs
260+
(-> (cc/js-source-file nil (io/file "src/test/externs/test.js"))
261+
externs/parse-externs externs/index-externs))
262+
263+
(ana/resolve-extern '[Foo gozMethod] externs)
264+
236265
(clojure.test/test-vars [#'test-type-hint-infer-unknown-method])
237266

238267
)

0 commit comments

Comments
 (0)