Skip to content

Commit

Permalink
CLJ-2350 Improve keyword aritiy exception message
Browse files Browse the repository at this point in the history
When calling a keyword with the wrong number of arguments (0, or more
than 2), throw an ArityException rather than IllegalArgumentException.
The ArityException class has improved error messages over the custom
IllegalArgumentException thrown by Keyword.java.

Signed-off-by: Alex Miller <alex.miller@cognitect.com>
  • Loading branch information
marcomorain authored and puredanger committed Sep 14, 2021
1 parent b0ca4b8 commit bd4c42d
Show file tree
Hide file tree
Showing 2 changed files with 35 additions and 21 deletions.
50 changes: 29 additions & 21 deletions src/jvm/clojure/lang/Keyword.java
Expand Up @@ -93,21 +93,29 @@ public String toString(){
return _str;
}

/**
* @deprecated CLJ-2350: This function is no longer called, but has not been
* removed to maintain the public interface.
*/
public Object throwArity(){
throw new IllegalArgumentException("Wrong number of args passed to keyword: "
+ toString());
}

Object throwArity(int n) {
throw new ArityException(n, toString());
}

public Object call() {
return throwArity();
return throwArity(0);
}

public void run(){
throw new UnsupportedOperationException();
}

public Object invoke() {
return throwArity();
return throwArity(0);
}

public int compareTo(Object o){
Expand Down Expand Up @@ -146,106 +154,106 @@ final public Object invoke(Object obj, Object notFound) {
}

public Object invoke(Object arg1, Object arg2, Object arg3) {
return throwArity();
return throwArity(3);
}

public Object invoke(Object arg1, Object arg2, Object arg3, Object arg4) {
return throwArity();
return throwArity(4);
}

public Object invoke(Object arg1, Object arg2, Object arg3, Object arg4, Object arg5) {
return throwArity();
return throwArity(5);
}

public Object invoke(Object arg1, Object arg2, Object arg3, Object arg4, Object arg5, Object arg6) {
return throwArity();
return throwArity(6);
}

public Object invoke(Object arg1, Object arg2, Object arg3, Object arg4, Object arg5, Object arg6, Object arg7)
{
return throwArity();
return throwArity(7);
}

public Object invoke(Object arg1, Object arg2, Object arg3, Object arg4, Object arg5, Object arg6, Object arg7,
Object arg8) {
return throwArity();
return throwArity(8);
}

public Object invoke(Object arg1, Object arg2, Object arg3, Object arg4, Object arg5, Object arg6, Object arg7,
Object arg8, Object arg9) {
return throwArity();
return throwArity(9);
}

public Object invoke(Object arg1, Object arg2, Object arg3, Object arg4, Object arg5, Object arg6, Object arg7,
Object arg8, Object arg9, Object arg10) {
return throwArity();
return throwArity(10);
}

public Object invoke(Object arg1, Object arg2, Object arg3, Object arg4, Object arg5, Object arg6, Object arg7,
Object arg8, Object arg9, Object arg10, Object arg11) {
return throwArity();
return throwArity(11);
}

public Object invoke(Object arg1, Object arg2, Object arg3, Object arg4, Object arg5, Object arg6, Object arg7,
Object arg8, Object arg9, Object arg10, Object arg11, Object arg12) {
return throwArity();
return throwArity(12);
}

public Object invoke(Object arg1, Object arg2, Object arg3, Object arg4, Object arg5, Object arg6, Object arg7,
Object arg8, Object arg9, Object arg10, Object arg11, Object arg12, Object arg13)
{
return throwArity();
return throwArity(13);
}

public Object invoke(Object arg1, Object arg2, Object arg3, Object arg4, Object arg5, Object arg6, Object arg7,
Object arg8, Object arg9, Object arg10, Object arg11, Object arg12, Object arg13, Object arg14)
{
return throwArity();
return throwArity(14);
}

public Object invoke(Object arg1, Object arg2, Object arg3, Object arg4, Object arg5, Object arg6, Object arg7,
Object arg8, Object arg9, Object arg10, Object arg11, Object arg12, Object arg13, Object arg14,
Object arg15) {
return throwArity();
return throwArity(15);
}

public Object invoke(Object arg1, Object arg2, Object arg3, Object arg4, Object arg5, Object arg6, Object arg7,
Object arg8, Object arg9, Object arg10, Object arg11, Object arg12, Object arg13, Object arg14,
Object arg15, Object arg16) {
return throwArity();
return throwArity(16);
}

public Object invoke(Object arg1, Object arg2, Object arg3, Object arg4, Object arg5, Object arg6, Object arg7,
Object arg8, Object arg9, Object arg10, Object arg11, Object arg12, Object arg13, Object arg14,
Object arg15, Object arg16, Object arg17) {
return throwArity();
return throwArity(17);
}

public Object invoke(Object arg1, Object arg2, Object arg3, Object arg4, Object arg5, Object arg6, Object arg7,
Object arg8, Object arg9, Object arg10, Object arg11, Object arg12, Object arg13, Object arg14,
Object arg15, Object arg16, Object arg17, Object arg18) {
return throwArity();
return throwArity(18);
}

public Object invoke(Object arg1, Object arg2, Object arg3, Object arg4, Object arg5, Object arg6, Object arg7,
Object arg8, Object arg9, Object arg10, Object arg11, Object arg12, Object arg13, Object arg14,
Object arg15, Object arg16, Object arg17, Object arg18, Object arg19) {
return throwArity();
return throwArity(19);
}

public Object invoke(Object arg1, Object arg2, Object arg3, Object arg4, Object arg5, Object arg6, Object arg7,
Object arg8, Object arg9, Object arg10, Object arg11, Object arg12, Object arg13, Object arg14,
Object arg15, Object arg16, Object arg17, Object arg18, Object arg19, Object arg20)
{
return throwArity();
return throwArity(20);
}

public Object invoke(Object arg1, Object arg2, Object arg3, Object arg4, Object arg5, Object arg6, Object arg7,
Object arg8, Object arg9, Object arg10, Object arg11, Object arg12, Object arg13, Object arg14,
Object arg15, Object arg16, Object arg17, Object arg18, Object arg19, Object arg20,
Object... args)
{
return throwArity();
return throwArity(20 + args.length);
}


Expand Down
6 changes: 6 additions & 0 deletions test/clojure/test_clojure/keywords.clj
Expand Up @@ -23,3 +23,9 @@
(are [result lookup] (= result (find-keyword this-ns lookup))
::foo "foo"
nil (str absent-keyword-sym)))))

(deftest arity-exceptions
(is (thrown-with-msg? IllegalArgumentException #"Wrong number of args \(0\) passed to: :kw" (:kw)))
(is (thrown-with-msg? IllegalArgumentException #"Wrong number of args \(20\) passed to: :foo/bar" (apply :foo/bar (range 20))))
(is (thrown-with-msg? IllegalArgumentException #"Wrong number of args \(21\) passed to: :foo/bar" (apply :foo/bar (range 21))))
(is (thrown-with-msg? IllegalArgumentException #"Wrong number of args \(22\) passed to: :foo/bar" (apply :foo/bar (range 22)))))

0 comments on commit bd4c42d

Please sign in to comment.