diff --git a/CHANGELOG.adoc b/CHANGELOG.adoc index a1bb2d3..b4d5948 100644 --- a/CHANGELOG.adoc +++ b/CHANGELOG.adoc @@ -19,10 +19,14 @@ A release with known breaking changes is marked with: // (adjust these in publish.clj as you see fit) === Unreleased -* bump `org.clojure/tools.reader` to version `1.4.2` (@lread) +* bump `org.clojure/tools.reader` to version `1.4.2` +(@lread) * `sexpr` now 1) expands tag metadata to its long form 2) throws on invalid metadata https://github.com/clj-commons/rewrite-clj/issues/280[#280] (@lread) +* Add support for Clojure 1.12 vector metadata +https://github.com/clj-commons/rewrite-clj/issues/279[#279] +(@lread) * `rewrite-clj.paredit/barf-forward` on zipper created with `:track-position? true` now correctly barfs when current node has children https://github.com/clj-commons/rewrite-clj/issues/245[#245] (@lread, thanks for the issue @p4ulcristian!) diff --git a/src/rewrite_clj/node/meta.cljc b/src/rewrite_clj/node/meta.cljc index 49f80b1..cd35b37 100644 --- a/src/rewrite_clj/node/meta.cljc +++ b/src/rewrite_clj/node/meta.cljc @@ -21,6 +21,7 @@ (keyword? mta) {mta true} (symbol? mta) {:tag mta} (string? mta) {:tag mta} + (vector? mta) {:param-tags mta} :else (throw (ex-info "Metadata must be a map, keyword, symbol or string" {})))))) (length [_node] (+ (count prefix) (node/sum-lengths children))) diff --git a/test/rewrite_clj/parser_test.cljc b/test/rewrite_clj/parser_test.cljc index 9ede242..52c6464 100644 --- a/test/rewrite_clj/parser_test.cljc +++ b/test/rewrite_clj/parser_test.cljc @@ -324,6 +324,74 @@ (is (= 'foo (node/sexpr n)) s) (is (= {:tag "MyType"} (meta (node/sexpr n))) s))) +(deftest t-parsing-clj-1-12-vector-metadata + (doseq [[s expected-meta expected-node] + [["^[a b c] foo" + {:param-tags '[a b c]} + (node/meta-node [(node/vector-node [(node/token-node 'a) + (node/spaces 1) + (node/token-node 'b) + (node/spaces 1) + (node/token-node 'c)]) + (node/spaces 1) + (node/token-node 'foo)])] + + ["^[] foo" + {:param-tags []} + (node/meta-node [(node/vector-node []) + (node/spaces 1) + (node/token-node 'foo)])] + + ["^[_ _] foo" + {:param-tags '[_ _]} + (node/meta-node [(node/vector-node [(node/token-node '_) + (node/spaces 1) + (node/token-node '_)]) + (node/spaces 1) + (node/token-node 'foo)])] + + ["^{:param-tags [a b c]} foo" + {:param-tags '[a b c]} + (node/meta-node + [(node/map-node [(node/keyword-node :param-tags) + (node/spaces 1) + (node/vector-node [(node/token-node 'a) + (node/spaces 1) + (node/token-node 'b) + (node/spaces 1) + (node/token-node 'c)])]) + (node/spaces 1) + (node/token-node 'foo)])] + + ["#^[a b c] foo" + {:param-tags '[a b c]} + (node/raw-meta-node [(node/vector-node [(node/token-node 'a) + (node/spaces 1) + (node/token-node 'b) + (node/spaces 1) + (node/token-node 'c)]) + (node/spaces 1) + (node/token-node 'foo)])] + + ["#^{:param-tags [a b c]} foo" + {:param-tags '[a b c]} + (node/raw-meta-node + [(node/map-node [(node/keyword-node :param-tags) + (node/spaces 1) + (node/vector-node [(node/token-node 'a) + (node/spaces 1) + (node/token-node 'b) + (node/spaces 1) + (node/token-node 'c)])]) + (node/spaces 1) + (node/token-node 'foo)])]] + + :let [n (p/parse-string s)]] + (is (= expected-node n) s) + (is (= s (node/string n))) + (is (= 'foo (node/sexpr n)) s) + (is (= expected-meta (meta (node/sexpr n))) s))) + (deftest t-parsing-invalid-metadata (let [s "^(list not valid) foo" n (p/parse-string s)]