summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorStuart Halloway <stu@thinkrelevance.com>2010-07-29 15:27:13 -0400
committerStuart Halloway <stu@thinkrelevance.com>2010-07-30 09:00:29 -0400
commit60d5927fe7b9a2aa773b58666ad64ffa6379c1fe (patch)
tree1d3a5481673b82ef29ccd02f55cf84837f1ab221
parenta2c95ef1bf6e34a455b469ac9ff18ddff7e9cef7 (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.clj11
-rw-r--r--test/clojure/test_clojure/genclass.clj17
-rw-r--r--test/clojure/test_clojure/helpers.clj12
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))))
+
+