Skip to content

Commit 5da21cc

Browse files
committed
* add non-ctor inference for array, string, boolean and number, will be useful later
1 parent 3852e67 commit 5da21cc

File tree

2 files changed

+22
-6
lines changed

2 files changed

+22
-6
lines changed

src/main/clojure/cljs/analyzer.cljc

Lines changed: 17 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2627,12 +2627,12 @@
26272627
:children [:expr]}))
26282628

26292629
(def js-prim-ctor->tag
2630-
'{js/Object object
2631-
js/String string
2632-
js/Array array
2633-
js/Number number
2630+
'{js/Object object
2631+
js/String string
2632+
js/Array array
2633+
js/Number number
26342634
js/Function function
2635-
js/Boolean boolean})
2635+
js/Boolean boolean})
26362636

26372637
(defn prim-ctor?
26382638
"Test whether a tag is a constructor for a JS primitive"
@@ -3585,14 +3585,25 @@
35853585
(list* '. dot-form) " with classification "
35863586
(classify-dot-form dot-form))))))
35873587

3588+
;; this only for a smaller set of types that we want to infer
3589+
;; we don't generally want to consider function for example, these
3590+
;; specific cases are ones we either try to optimize or validate
3591+
(def ^{:private true}
3592+
tag->js-prim-ctor
3593+
'{string js/String
3594+
array js/Array
3595+
number js/Number
3596+
boolean js/Boolean})
3597+
35883598
(defn analyze-dot [env target field member+ form]
35893599
(let [v [target field member+]
35903600
{:keys [dot-action target method field args]} (build-dot-form v)
35913601
enve (assoc env :context :expr)
35923602
targetexpr (analyze enve target)
35933603
form-meta (meta form)
35943604
target-tag (as-> (:tag targetexpr) $
3595-
(or (some-> $ meta :ctor lift-tag-to-js) $))
3605+
(or (some-> $ meta :ctor lift-tag-to-js)
3606+
(tag->js-prim-ctor $ $)))
35963607
prop (or field method)
35973608
tag (or (:tag form-meta)
35983609
(and (js-tag? target-tag)

src/test/clojure/cljs/externs_infer_tests.clj

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -168,6 +168,11 @@
168168
(-> (binding [ana/*cljs-ns* ana/*cljs-ns*]
169169
(env/with-compiler-env (env/default-compiler-env)
170170
(analyze (ana/empty-env) '(.generateKey js/crypto.subtle))))
171+
:tag)))
172+
(is (= 'js/String
173+
(-> (binding [ana/*cljs-ns* ana/*cljs-ns*]
174+
(env/with-compiler-env (env/default-compiler-env)
175+
(analyze (ana/empty-env) '(.toUpperCase "foo"))))
171176
:tag))))
172177

173178
(deftest test-externs-infer

0 commit comments

Comments
 (0)