Skip to content

Commit 0239cd8

Browse files
committed
externs inference test wip
1 parent b80c8cc commit 0239cd8

3 files changed

Lines changed: 30 additions & 5 deletions

File tree

src/main/clojure/cljs/analyzer.cljc

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -798,10 +798,10 @@
798798
(not me) false
799799
:else
800800
(let [seen' (conj seen x)
801-
[x' externs'] me]
802-
(if-some [tag (-> x' meta :tag)]
803-
(let [pre' (into [] (map symbol)
804-
(string/split (str (alias->type tag tag)) #"\."))]
801+
[x' externs'] me
802+
xmeta (meta x')]
803+
(if (and (= 'Function (:tag xmeta)) (:ctor xmeta))
804+
(let [pre' [(:ctor xmeta)]]
805805
(or (has-extern?* (into pre' (next pre)) top top seen')
806806
(has-extern?* (into (conj pre' 'prototype) (next pre)) top top seen')))
807807
(recur (next pre) externs' top seen'))))))))

src/main/clojure/cljs/externs.clj

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,10 @@
3939
(if-let [^JSTypeExpression ty (.getType info)]
4040
{:tag (get-type* ty)}
4141
(if (or (.isConstructor info) (.isInterface info))
42-
{:tag 'Function}
42+
(let [qname (symbol (.. node getFirstChild getQualifiedName))]
43+
(cond-> {:tag 'Function}
44+
(.isConstructor info) (merge {:ctor qname})
45+
(.isInterface info) (merge {:iface qname})))
4346
(if (.hasReturnType info)
4447
{:tag 'Function
4548
:ret-tag (get-type* (.getReturnType info))})))))))

src/test/clojure/cljs/analyzer_tests.clj

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -619,6 +619,22 @@
619619
'(let [y 1] (def y 2))))]
620620
(is (some? (-> parsed :expr :ret :var-ast)))))
621621

622+
(deftest test-infer-externs-basic
623+
(let [externs (externs/externs-map
624+
(closure/load-externs
625+
{:externs ["src/test/externs/test.js"]
626+
:use-only-custom-externs true}))]
627+
(is (true? (a/has-extern? '[Foo] externs)))
628+
(is (false? (a/has-extern? '[foo] externs)))
629+
(is (true? (a/has-extern? '[baz] externs)))
630+
(is (false? (a/has-extern? '[Baz] externs)))))
631+
632+
(deftest test-infer-externs-default
633+
(let [externs (externs/externs-map)]
634+
(is (true? (a/has-extern? '[console] externs)))
635+
(is (true? (a/has-extern? '[console log] externs)))
636+
(is (true? (a/has-extern? '[Number isNaN] externs)))))
637+
622638
(comment
623639
(require '[cljs.compiler :as cc])
624640
(require '[cljs.closure :as closure])
@@ -673,6 +689,12 @@
673689
(map (comp :externs second)
674690
(get @test-cenv ::a/namespaces))))))
675691

692+
(a/has-extern?* '[baz]
693+
(externs/externs-map
694+
(closure/load-externs
695+
{:externs ["src/test/externs/test.js"]
696+
:use-only-custom-externs true})))
697+
676698
;; works, does not generate extern
677699
(let [test-cenv (atom {::a/externs (externs/externs-map
678700
(closure/load-externs

0 commit comments

Comments
 (0)