Skip to content

Commit fe450ee

Browse files
committed
js-tag helper for resolving 'js/foo types and tests
1 parent a88fd87 commit fe450ee

2 files changed

Lines changed: 27 additions & 3 deletions

File tree

src/main/clojure/cljs/analyzer.cljc

Lines changed: 21 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -815,6 +815,21 @@
815815
(get-in externs (conj '[Number] x)))))
816816
(-> (last pre) str (string/starts-with? "cljs$")))))
817817

818+
(defn js-tag
819+
([pre]
820+
(js-tag pre :tag))
821+
([pre tag-type]
822+
(js-tag pre :tag (get @env/*compiler* ::externs)))
823+
([pre tag-type externs]
824+
(js-tag pre tag-type externs externs))
825+
([pre tag-type externs top]
826+
(when-let [[p externs' :as me] (find externs (first pre))]
827+
(let [tag (-> p meta tag-type)]
828+
(if (= (count pre) 1)
829+
(when tag (symbol "js" (str (alias->type tag tag))))
830+
(or (js-tag (next pre) tag-type externs' top)
831+
(js-tag (into '[prototype] (next pre)) tag-type (get top tag) top)))))))
832+
818833
(defn resolve-var
819834
"Resolve a var. Accepts a side-effecting confirm fn for producing
820835
warnings about unresolved vars."
@@ -830,9 +845,12 @@
830845
(when-not (has-extern? pre)
831846
(swap! env/*compiler* update-in
832847
(into [::namespaces (-> env :ns :name) :externs] pre) merge {}))
833-
{:name sym
834-
:ns 'js
835-
:tag (with-meta 'js {:prefix pre})}))
848+
(merge
849+
{:name sym
850+
:ns 'js
851+
:tag (with-meta (or (js-tag pre) 'js) {:prefix pre})}
852+
(when-let [ret-tag (js-tag pre :ret-tag)]
853+
{:ret-tag ret-tag}))))
836854
(let [s (str sym)
837855
lb (get locals sym)]
838856
(cond

src/test/clojure/cljs/analyzer_tests.clj

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -646,6 +646,12 @@
646646
{:externs ["src/test/externs/test.js"]
647647
:use-only-custom-externs true}))}))
648648

649+
(deftest test-js-tag
650+
(let [externs (externs/externs-map)]
651+
(is (= 'js/Console (a/js-tag '[console] :tag externs)))
652+
(is (= 'js/Function (a/js-tag '[console log] :tag externs)))
653+
(is (= 'js/Boolean (a/js-tag '[Number isNaN] :ret-tag externs)))))
654+
649655
(deftest test-externs-infer
650656
(binding [a/*cljs-ns* a/*cljs-ns*]
651657
(e/with-compiler-env externs-cenv

0 commit comments

Comments
 (0)