Skip to content

Commit 4664996

Browse files
roman01lamfikes
authored andcommitted
CLJS-3085: Types are inferred for dynamic vars
Infers dynamic vars as 'any, unless def has a type hint
1 parent 4243384 commit 4664996

File tree

2 files changed

+24
-3
lines changed

2 files changed

+24
-3
lines changed

src/main/clojure/cljs/analyzer.cljc

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1879,9 +1879,11 @@
18791879
(disallowing-ns*
18801880
(analyze (assoc env :context :expr) (:init args) sym))))
18811881
fn-var? (and (some? init-expr) (= (:op init-expr) :fn))
1882-
tag (if fn-var?
1883-
(or (:ret-tag init-expr) tag (:inferred-ret-tag init-expr))
1884-
(or tag (:tag init-expr)))
1882+
tag (cond
1883+
fn-var? (or (:ret-tag init-expr) tag (:inferred-ret-tag init-expr))
1884+
tag tag
1885+
dynamic ANY_SYM
1886+
:else (:tag init-expr))
18851887
export-as (when-let [export-val (-> sym meta :export)]
18861888
(if (= true export-val) var-name export-val))
18871889
doc (or (:doc args) (-> sym meta :doc))]

src/test/cljs/cljs/binding_test.cljs

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,3 +35,22 @@
3535
(is (= 2 (with-redefs [a 10
3636
b (inc a)]
3737
b))))
38+
39+
(def ^:dynamic *foo* false)
40+
(def ^:dynamic ^boolean *foo-tagged* false)
41+
42+
(defn bar [] (if *foo* 1 2))
43+
(defn bar-tagged [] (if *foo-tagged* 1 2))
44+
45+
(deftest test-tag-inference
46+
(is (= 2 (bar)))
47+
(binding [*foo* "abc"]
48+
(is (= 1 (bar))))
49+
(binding [*foo* ""]
50+
(is (= 1 (bar))))
51+
52+
(is (= 2 (bar-tagged)))
53+
(binding [*foo-tagged* "abc"]
54+
(is (= 1 (bar-tagged))))
55+
(binding [*foo-tagged* ""]
56+
(is (= 2 (bar-tagged)))))

0 commit comments

Comments
 (0)