Skip to content

Commit 49ed833

Browse files
committed
CLJS-1187: var ast contains internal nodes with bad analysis :context
ensure that internal var AST nodes are analyzed in :expr contexts
1 parent d12d678 commit 49ed833

File tree

2 files changed

+20
-4
lines changed

2 files changed

+20
-4
lines changed

src/clj/cljs/analyzer.clj

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -655,10 +655,11 @@
655655

656656
(defmethod parse 'var
657657
[op env [_ sym :as form] _ _]
658-
(let [var (resolve-var env sym (confirm-var-exists-throw))]
658+
(let [var (resolve-var env sym (confirm-var-exists-throw))
659+
expr-env (assoc env :context :expr)]
659660
{:env env :op :var-special :form form
660-
:var (analyze env sym)
661-
:sym (analyze env `(quote ~(symbol (name (:ns var)) (name (:name var)))))
661+
:var (analyze expr-env sym)
662+
:sym (analyze expr-env `(quote ~(symbol (name (:ns var)) (name (:name var)))))
662663
:meta (let [ks [:ns :doc :file :line :column]
663664
m (merge
664665
(assoc (zipmap ks (map #(list 'quote (get var %)) ks))
@@ -669,7 +670,7 @@
669670
uks (keys user-meta)]
670671
(zipmap uks
671672
(map #(list 'quote (get user-meta %)) uks))))]
672-
(analyze env m))}))
673+
(analyze expr-env m))}))
673674

674675
(defmethod parse 'if
675676
[op env [_ test then else :as form] name _]

test/cljs/cljs/core_test.cljs

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2721,6 +2721,21 @@
27212721
(is (= identity (dispatch-fn cljs-1144)))
27222722
(is (= ::default (default-dispatch-val cljs-1144))))
27232723

2724+
(defn foo-1187 [] (print "foo!"))
2725+
2726+
(defn bar-1187 [] (print "bar!"))
2727+
2728+
(defn print-foo-1187 [fb]
2729+
(apply
2730+
(case fb
2731+
:foo #'foo-1187
2732+
:bar #'bar-1187) []))
2733+
2734+
(deftest test-cljs-1187 []
2735+
(testing "Internal var nodes analyzed in expression context"
2736+
(is (= (with-out-str (print-foo-1187 :foo))
2737+
"foo!"))))
2738+
27242739
(comment
27252740
;; ObjMap
27262741
;; (let [ks (map (partial str "foo") (range 500))

0 commit comments

Comments
 (0)