diff options
author | Stuart Halloway <stu@thinkrelevance.com> | 2010-05-23 15:37:17 -0400 |
---|---|---|
committer | Stuart Halloway <stu@thinkrelevance.com> | 2010-05-24 10:46:09 -0400 |
commit | 3da8a12112332d15a91b140fab5e535f0d2528e8 (patch) | |
tree | a8188c9bb1fd29a66251503e688ebbe69aac3d7b | |
parent | 8c9b0574a83f6c77576325b724c837cf4143eb33 (diff) |
better error message on failed refer
Signed-off-by: Stuart Halloway <stu@thinkrelevance.com>
-rw-r--r-- | src/clj/clojure/core.clj | 23 | ||||
-rw-r--r-- | test/clojure/test_clojure/ns_libs.clj | 12 |
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))))))) |