summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/jvm/clojure/lang/Namespace.java9
-rw-r--r--test/clojure/test_clojure/rt.clj10
2 files changed, 15 insertions, 4 deletions
diff --git a/src/jvm/clojure/lang/Namespace.java b/src/jvm/clojure/lang/Namespace.java
index 4c557a9a..19369733 100644
--- a/src/jvm/clojure/lang/Namespace.java
+++ b/src/jvm/clojure/lang/Namespace.java
@@ -79,11 +79,14 @@ public Var intern(Symbol sym){
}
private void warnOrFailOnReplace(Symbol sym, Object o, Object v){
- if (o instanceof Var) {
- if (((Var)o).ns != RT.CLOJURE_NS) {
+ if (o instanceof Var)
+ {
+ Namespace ns = ((Var)o).ns;
+ if (ns == this)
+ return;
+ if (ns != RT.CLOJURE_NS)
throw new IllegalStateException(sym + " already refers to: " + o + " in namespace: " + name);
}
- }
RT.errPrintWriter().println("WARNING: " + sym + " already refers to: " + o + " in namespace: " + name
+ ", being replaced by: " + v);
}
diff --git a/test/clojure/test_clojure/rt.clj b/test/clojure/test_clojure/rt.clj
index 5b7f2493..175bfd82 100644
--- a/test/clojure/test_clojure/rt.clj
+++ b/test/clojure/test_clojure/rt.clj
@@ -83,10 +83,18 @@
(deftest last-var-wins-for-core
(testing "you can replace a core name, with warning"
- (let [ns (temp-ns 'clojure.set)
+ (let [ns (temp-ns)
replacement (gensym)]
(with-err-string-writer (intern ns 'prefers replacement))
(is (= replacement @('prefers (ns-publics ns))))))
+ (testing "you can replace a name you defined before"
+ (let [ns (temp-ns)
+ s (gensym)
+ v1 (intern ns 'foo s)
+ v2 (intern ns 'bar s)]
+ (with-err-string-writer (.refer ns 'flatten v1))
+ (.refer ns 'flatten v2)
+ (is (= v2 (ns-resolve ns 'flatten)))))
(testing "you cannot intern over an existing non-core name"
(let [ns (temp-ns 'clojure.set)
replacement (gensym)]