summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorStuart Halloway <stu@thinkrelevance.com>2010-05-23 15:37:17 -0400
committerStuart Halloway <stu@thinkrelevance.com>2010-05-24 10:46:09 -0400
commit3da8a12112332d15a91b140fab5e535f0d2528e8 (patch)
treea8188c9bb1fd29a66251503e688ebbe69aac3d7b
parent8c9b0574a83f6c77576325b724c837cf4143eb33 (diff)
better error message on failed refer
Signed-off-by: Stuart Halloway <stu@thinkrelevance.com>
-rw-r--r--src/clj/clojure/core.clj23
-rw-r--r--test/clojure/test_clojure/ns_libs.clj12
2 files changed, 25 insertions, 10 deletions
diff --git a/src/clj/clojure/core.clj b/src/clj/clojure/core.clj
index 0a2a39ae..d1b4b8e4 100644
--- a/src/clj/clojure/core.clj
+++ b/src/clj/clojure/core.clj
@@ -3229,6 +3229,15 @@
[ns]
(filter-key val (partial instance? Class) (ns-map ns)))
+(defn ns-interns
+ "Returns a map of the intern mappings for the namespace."
+ {:added "1.0"}
+ [ns]
+ (let [ns (the-ns ns)]
+ (filter-key val (fn [^clojure.lang.Var v] (and (instance? clojure.lang.Var v)
+ (= ns (.ns v))))
+ (ns-map ns))))
+
(defn refer
"refers to all public vars of ns, subject to filters.
filters can include at most one each of:
@@ -3256,7 +3265,10 @@
(when-not (exclude sym)
(let [v (nspublics sym)]
(when-not v
- (throw (new java.lang.IllegalAccessError (str sym " is not public"))))
+ (throw (new java.lang.IllegalAccessError
+ (if (get (ns-interns ns) sym)
+ (str sym " is not public")
+ (str sym " does not exist")))))
(. *ns* (refer (or (rename sym) sym) v)))))))
(defn ns-refers
@@ -3268,15 +3280,6 @@
(not= ns (.ns v))))
(ns-map ns))))
-(defn ns-interns
- "Returns a map of the intern mappings for the namespace."
- {:added "1.0"}
- [ns]
- (let [ns (the-ns ns)]
- (filter-key val (fn [^clojure.lang.Var v] (and (instance? clojure.lang.Var v)
- (= ns (.ns v))))
- (ns-map ns))))
-
(defn alias
"Add an alias in the current namespace to another
namespace. Arguments are two symbols: the alias to be used, and
diff --git a/test/clojure/test_clojure/ns_libs.clj b/test/clojure/test_clojure/ns_libs.clj
index 10844ded..e1217756 100644
--- a/test/clojure/test_clojure/ns_libs.clj
+++ b/test/clojure/test_clojure/ns_libs.clj
@@ -71,3 +71,15 @@
(is (thrown? IllegalStateException
#"Integer already refers to: class java.lang.Integer"
(defrecord Integer [])))))
+
+(deftest refer-error-messages
+ (let [temp-ns (gensym)]
+ (binding [*ns* *ns*]
+ (in-ns temp-ns)
+ (eval '(def ^{:private true} hidden-var)))
+ (testing "referring to something that does not exist"
+ (is (thrown-with-msg? IllegalAccessError #"nonexistent-var does not exist"
+ (refer temp-ns :only '(nonexistent-var)))))
+ (testing "referring to something non-public"
+ (is (thrown-with-msg? IllegalAccessError #"hidden-var is not public"
+ (refer temp-ns :only '(hidden-var)))))))