Skip to content

Commit 756fa9b

Browse files
anmonteiroswannodette
authored andcommitted
CLJS-1274: Allow assignment to namespace-qualified names in current namespace
1 parent 709cc57 commit 756fa9b

File tree

3 files changed

+26
-4
lines changed

3 files changed

+26
-4
lines changed

src/main/clojure/cljs/analyzer.cljc

+12-4
Original file line numberDiff line numberDiff line change
@@ -1137,7 +1137,7 @@
11371137
(when (symbol? x) x))
11381138

11391139
(defmethod parse 'def
1140-
[op env form name _]
1140+
[op env form _ _]
11411141
(let [pfn (fn
11421142
([_ sym] {:sym sym})
11431143
([_ sym init] {:sym sym :init init})
@@ -1150,13 +1150,21 @@
11501150
dynamic (-> sym meta :dynamic)
11511151
ns-name (-> env :ns :name)
11521152
locals (:locals env)
1153-
clash-ns (symbol (str ns-name "." sym))]
1153+
clash-ns (symbol (str ns-name "." sym))
1154+
sym-ns (namespace sym)
1155+
sym (cond
1156+
(and sym-ns (not #?(:clj (= (symbol sym-ns) ns-name)
1157+
:cljs (symbol-identical? (symbol sym-ns) ns-name))))
1158+
(throw (error env (str "Can't def ns-qualified name in namespace " sym-ns)))
1159+
1160+
(some? sym-ns)
1161+
(symbol (name sym))
1162+
1163+
:else sym)]
11541164
(when (get-in @env/*compiler* [::namespaces clash-ns])
11551165
(warning :ns-var-clash env
11561166
{:ns (symbol (str ns-name "." sym))
11571167
:var (symbol (str ns-name) (str sym))}))
1158-
(when (namespace sym)
1159-
(throw (error env "Can't def ns-qualified name")))
11601168
(when (:const (resolve-var (dissoc env :locals) sym))
11611169
(throw (error env "Can't redefine a constant")))
11621170
(when-let [doc (:doc args)]

src/test/cljs/cljs/core_test.cljs

+6
Original file line numberDiff line numberDiff line change
@@ -3235,6 +3235,12 @@
32353235
(let [m (zipmap (range i) (range i))]
32363236
(is (= () (last (take (inc i) (iterate rest m))))))))
32373237

3238+
(def cljs.core-test/foo-1274 42)
3239+
3240+
(deftest test-cljs-1274
3241+
(is (= foo-1274 42))
3242+
(is (= cljs.core-test/foo-1274 42)))
3243+
32383244
(comment
32393245
;; ObjMap
32403246
;; (let [ks (map (partial str "foo") (range 500))

src/test/clojure/cljs/analyzer_tests.clj

+8
Original file line numberDiff line numberDiff line change
@@ -441,3 +441,11 @@
441441
(a/analyze test-env
442442
'(ns foo.core
443443
(:require [clojure.set :rename {intersection foo}]))))))))
444+
445+
446+
(deftest test-cljs-1274
447+
(let [test-env (assoc-in (a/empty-env) [:ns :name] 'cljs.user)]
448+
(binding [a/*cljs-ns* a/*cljs-ns*]
449+
(is (thrown-with-msg? Exception #"Can't def ns-qualified name in namespace foo.core"
450+
(a/analyze test-env '(def foo.core/foo 43))))
451+
(is (a/analyze test-env '(def cljs.user/foo 43))))))

0 commit comments

Comments
 (0)