Skip to content

Commit f13c08c

Browse files
committed
CLJS-2852: Clojure imparity: ns-publics returns different arglists for macros
1 parent b369fe1 commit f13c08c

File tree

3 files changed

+43
-7
lines changed

3 files changed

+43
-7
lines changed

src/main/clojure/cljs/core.cljc

Lines changed: 15 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -3056,19 +3056,27 @@
30563056
(.push ~dest (unchecked-get (js-arguments) i#))
30573057
(recur (inc i#))))))
30583058

3059+
(core/defn- elide-implicit-macro-args [arglists]
3060+
(core/map (core/fn [arglist]
3061+
(if (core/vector? arglist)
3062+
(core/subvec arglist 2)
3063+
(core/drop 2 arglist)))
3064+
arglists))
3065+
30593066
(core/defn- variadic-fn [name meta [[arglist & body :as method] :as fdecl] emit-var?]
30603067
(core/letfn [(dest-args [c]
30613068
(map (core/fn [n] `(unchecked-get (js-arguments) ~n))
30623069
(range c)))]
30633070
(core/let [rname (symbol (core/str ana/*cljs-ns*) (core/str name))
30643071
sig (remove '#{&} arglist)
30653072
c-1 (core/dec (count sig))
3073+
macro? (:macro meta)
30663074
meta (assoc meta
30673075
:top-fn
30683076
{:variadic? true
3069-
:max-fixed-arity c-1
3070-
:method-params [sig]
3071-
:arglists (core/list arglist)
3077+
:max-fixed-arity (core/cond-> c-1 macro? (core/- 2))
3078+
:method-params (core/cond-> [sig] macro? elide-implicit-macro-args)
3079+
:arglists (core/cond-> (core/list arglist) macro? elide-implicit-macro-args)
30723080
:arglists-meta (doall (map meta [arglist]))})]
30733081
`(do
30743082
(def ~(with-meta name meta)
@@ -3117,12 +3125,13 @@
31173125
(concat
31183126
(map count sigs)
31193127
[(core/- (count (first (filter varsig? arglists))) 2)]))
3128+
macro? (:macro meta)
31203129
meta (assoc meta
31213130
:top-fn
31223131
{:variadic? variadic
3123-
:max-fixed-arity maxfa
3124-
:method-params sigs
3125-
:arglists arglists
3132+
:max-fixed-arity (core/cond-> maxfa macro? (core/- 2))
3133+
:method-params (core/cond-> sigs macro? elide-implicit-macro-args)
3134+
:arglists (core/cond-> arglists macro? elide-implicit-macro-args)
31263135
:arglists-meta (doall (map meta arglists))})
31273136
args-sym (gensym "args")
31283137
param-counts (map count arglists)]

src/test/cljs/cljs/macro_test.cljs

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,8 @@
99
(ns cljs.macro-test
1010
(:refer-clojure :exclude [==])
1111
(:require [cljs.test :refer-macros [deftest is]])
12-
(:use-macros [cljs.macro-test.macros :only [==]]))
12+
(:use-macros [cljs.macro-test.macros :only [==]])
13+
(:require-macros [cljs.macro-test.cljs2852]))
1314

1415
(deftest test-macros
1516
(is (= (== 1 1) 2)))
@@ -22,3 +23,8 @@
2223

2324
(deftest test-cljs-2283
2425
(is (= ":a" (first (js-keys (js-obj :a 1))))))
26+
27+
(deftest test-cljs-2852
28+
(is (= '([x])) (cljs.macro-test.cljs2852/beta))
29+
(is (= '([x] [x y])) (cljs.macro-test.cljs2852/delta))
30+
(is (= '([x] [x & xs])) (cljs.macro-test.cljs2852/zeta)))
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
(ns cljs.macro-test.cljs2852)
2+
3+
(defmacro alpha
4+
([x]))
5+
6+
(defmacro beta []
7+
`'~(:arglists (meta #'alpha)))
8+
9+
(defmacro gamma
10+
([x])
11+
([x y]))
12+
13+
(defmacro delta []
14+
`'~(:arglists (meta #'gamma)))
15+
16+
(defmacro epsilon
17+
([x])
18+
([x & xs]))
19+
20+
(defmacro zeta []
21+
`'~(:arglists (meta #'epsilon)))

0 commit comments

Comments
 (0)