diff options
author | Stuart Halloway <stu@thinkrelevance.com> | 2010-07-29 15:27:13 -0400 |
---|---|---|
committer | Stuart Halloway <stu@thinkrelevance.com> | 2010-07-30 09:00:29 -0400 |
commit | 60d5927fe7b9a2aa773b58666ad64ffa6379c1fe (patch) | |
tree | 1d3a5481673b82ef29ccd02f55cf84837f1ab221 | |
parent | a2c95ef1bf6e34a455b469ac9ff18ddff7e9cef7 (diff) |
#407 use munge as cheap validity test for Java method names
Signed-off-by: Stuart Halloway <stu@thinkrelevance.com>
-rw-r--r-- | src/clj/clojure/genclass.clj | 11 | ||||
-rw-r--r-- | test/clojure/test_clojure/genclass.clj | 17 | ||||
-rw-r--r-- | test/clojure/test_clojure/helpers.clj | 12 |
3 files changed, 28 insertions, 12 deletions
diff --git a/src/clj/clojure/genclass.clj b/src/clj/clojure/genclass.clj index fbc7dfe8..e998d996 100644 --- a/src/clj/clojure/genclass.clj +++ b/src/clj/clojure/genclass.clj @@ -90,7 +90,18 @@ strx (str "java.lang." strx)))))) +;; someday this can be made codepoint aware +(defn- valid-java-method-name + [^String s] + (= s (clojure.lang.Compiler/munge s))) + +(defn- validate-generate-class-options + [{:keys [methods]}] + (let [[mname] (remove valid-java-method-name (map (comp str first) methods))] + (when mname (throw (IllegalArgumentException. (str "Not a valid method name: " mname)))))) + (defn- generate-class [options-map] + (validate-generate-class-options options-map) (let [default-options {:prefix "-" :load-impl-ns true :impl-ns (ns-name *ns*)} {:keys [name extends implements constructors methods main factory state init exposes exposes-methods prefix load-impl-ns impl-ns post-init]} diff --git a/test/clojure/test_clojure/genclass.clj b/test/clojure/test_clojure/genclass.clj index cab1f595..f0a69c4f 100644 --- a/test/clojure/test_clojure/genclass.clj +++ b/test/clojure/test_clojure/genclass.clj @@ -9,7 +9,7 @@ (ns ^{:doc "Tests for clojure.core/gen-class" :author "Stuart Halloway, Daniel Solano Gómez"} clojure.test-clojure.genclass - (:use clojure.test) + (:use clojure.test clojure.test-clojure.helpers) (:import [clojure.test_clojure.genclass.examples ExampleClass ExampleAnnotationClass] [java.lang.annotation ElementType @@ -17,17 +17,6 @@ RetentionPolicy Target])) -;; pull this up to a suite-wide helper if you find other tests need it! -(defn get-field - "Access to private or protected field. field-name is a symbol or - keyword." - ([klass field-name] - (get-field klass field-name nil)) - ([klass field-name inst] - (-> klass (.getDeclaredField (name field-name)) - (doto (.setAccessible true)) - (.get inst)))) - (deftest arg-support (let [example (ExampleClass.) o (Object.)] @@ -70,3 +59,7 @@ (let [target (aget first-param-annots 1)] (is (instance? Target target)) (is (= [ElementType/TYPE ElementType/PARAMETER] (seq (.value target))))))))))) + +(deftest genclass-option-validation + (is (fails-with-cause? IllegalArgumentException #"Not a valid method name: has-hyphen" + (@#'clojure.core/validate-generate-class-options {:methods '[[fine [] void] [has-hyphen [] void]]})))) diff --git a/test/clojure/test_clojure/helpers.clj b/test/clojure/test_clojure/helpers.clj index 777b5f64..89a075fc 100644 --- a/test/clojure/test_clojure/helpers.clj +++ b/test/clojure/test_clojure/helpers.clj @@ -49,3 +49,15 @@ (report {:type :fail, :message ~msg, :expected '~form, :actual t#}))))) + +(defn get-field + "Access to private or protected field. field-name is a symbol or + keyword." + ([klass field-name] + (get-field klass field-name nil)) + ([klass field-name inst] + (-> klass (.getDeclaredField (name field-name)) + (doto (.setAccessible true)) + (.get inst)))) + + |