Skip to content

Commit 8213325

Browse files
authored
Add support for Clojure 1.12 vector metadata (#286)
Contributes to #279
1 parent 3b8ac40 commit 8213325

File tree

3 files changed

+74
-1
lines changed

3 files changed

+74
-1
lines changed

CHANGELOG.adoc

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,10 +19,14 @@ A release with known breaking changes is marked with:
1919
// (adjust these in publish.clj as you see fit)
2020
=== Unreleased
2121

22-
* bump `org.clojure/tools.reader` to version `1.4.2` (@lread)
22+
* bump `org.clojure/tools.reader` to version `1.4.2`
23+
(@lread)
2324
* `sexpr` now 1) expands tag metadata to its long form 2) throws on invalid metadata
2425
https://github.com/clj-commons/rewrite-clj/issues/280[#280]
2526
(@lread)
27+
* Add support for Clojure 1.12 vector metadata
28+
https://github.com/clj-commons/rewrite-clj/issues/279[#279]
29+
(@lread)
2630
* `rewrite-clj.paredit/barf-forward` on zipper created with `:track-position? true` now correctly barfs when current node has children
2731
https://github.com/clj-commons/rewrite-clj/issues/245[#245]
2832
(@lread, thanks for the issue @p4ulcristian!)

src/rewrite_clj/node/meta.cljc

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
(keyword? mta) {mta true}
2222
(symbol? mta) {:tag mta}
2323
(string? mta) {:tag mta}
24+
(vector? mta) {:param-tags mta}
2425
:else (throw (ex-info "Metadata must be a map, keyword, symbol or string" {}))))))
2526
(length [_node]
2627
(+ (count prefix) (node/sum-lengths children)))

test/rewrite_clj/parser_test.cljc

Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -324,6 +324,74 @@
324324
(is (= 'foo (node/sexpr n)) s)
325325
(is (= {:tag "MyType"} (meta (node/sexpr n))) s)))
326326

327+
(deftest t-parsing-clj-1-12-vector-metadata
328+
(doseq [[s expected-meta expected-node]
329+
[["^[a b c] foo"
330+
{:param-tags '[a b c]}
331+
(node/meta-node [(node/vector-node [(node/token-node 'a)
332+
(node/spaces 1)
333+
(node/token-node 'b)
334+
(node/spaces 1)
335+
(node/token-node 'c)])
336+
(node/spaces 1)
337+
(node/token-node 'foo)])]
338+
339+
["^[] foo"
340+
{:param-tags []}
341+
(node/meta-node [(node/vector-node [])
342+
(node/spaces 1)
343+
(node/token-node 'foo)])]
344+
345+
["^[_ _] foo"
346+
{:param-tags '[_ _]}
347+
(node/meta-node [(node/vector-node [(node/token-node '_)
348+
(node/spaces 1)
349+
(node/token-node '_)])
350+
(node/spaces 1)
351+
(node/token-node 'foo)])]
352+
353+
["^{:param-tags [a b c]} foo"
354+
{:param-tags '[a b c]}
355+
(node/meta-node
356+
[(node/map-node [(node/keyword-node :param-tags)
357+
(node/spaces 1)
358+
(node/vector-node [(node/token-node 'a)
359+
(node/spaces 1)
360+
(node/token-node 'b)
361+
(node/spaces 1)
362+
(node/token-node 'c)])])
363+
(node/spaces 1)
364+
(node/token-node 'foo)])]
365+
366+
["#^[a b c] foo"
367+
{:param-tags '[a b c]}
368+
(node/raw-meta-node [(node/vector-node [(node/token-node 'a)
369+
(node/spaces 1)
370+
(node/token-node 'b)
371+
(node/spaces 1)
372+
(node/token-node 'c)])
373+
(node/spaces 1)
374+
(node/token-node 'foo)])]
375+
376+
["#^{:param-tags [a b c]} foo"
377+
{:param-tags '[a b c]}
378+
(node/raw-meta-node
379+
[(node/map-node [(node/keyword-node :param-tags)
380+
(node/spaces 1)
381+
(node/vector-node [(node/token-node 'a)
382+
(node/spaces 1)
383+
(node/token-node 'b)
384+
(node/spaces 1)
385+
(node/token-node 'c)])])
386+
(node/spaces 1)
387+
(node/token-node 'foo)])]]
388+
389+
:let [n (p/parse-string s)]]
390+
(is (= expected-node n) s)
391+
(is (= s (node/string n)))
392+
(is (= 'foo (node/sexpr n)) s)
393+
(is (= expected-meta (meta (node/sexpr n))) s)))
394+
327395
(deftest t-parsing-invalid-metadata
328396
(let [s "^(list not valid) foo"
329397
n (p/parse-string s)]

0 commit comments

Comments
 (0)