Skip to content

Commit 1ea5350

Browse files
stathissiderisYannick Scherer
authored andcommitted
Add support for Clojure 1.9 namespaced maps
1 parent 13d9764 commit 1ea5350

File tree

3 files changed

+54
-2
lines changed

3 files changed

+54
-2
lines changed

src/rewrite_clj/node.clj

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,7 @@
7070
[rewrite-clj.node.seq
7171
list-node
7272
map-node
73+
namespaced-map-node
7374
set-node
7475
vector-node]
7576

src/rewrite_clj/node/seq.clj

Lines changed: 48 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
(ns ^:no-doc rewrite-clj.node.seq
22
(:require [rewrite-clj.node.protocols :as node]))
33

4-
;; ## Node
4+
;; ## Nodes
55

66
(defrecord SeqNode [tag
77
format-string
@@ -34,7 +34,48 @@
3434
(toString [this]
3535
(node/string this)))
3636

37+
(defrecord NamespacedMapNode [wrap-length children]
38+
node/Node
39+
(tag [this]
40+
:namespaced-map)
41+
(printable-only? [_] false)
42+
(sexpr [this]
43+
(let [n (node/sexpr (first children))]
44+
(reduce-kv
45+
(fn [m k v]
46+
(if (keyword? k)
47+
(cond (namespace k)
48+
(assoc m k v)
49+
(namespace n)
50+
(assoc m (keyword
51+
(str (namespace n) "/" (name n))
52+
(name k)) v)
53+
:else
54+
(assoc m (keyword (name n) (name k)) v))
55+
(assoc m k v)))
56+
{} (apply hash-map (node/sexprs (-> children second :children))))))
57+
(length [_]
58+
(+ wrap-length (node/sum-lengths children)))
59+
(string [this]
60+
(format "#%s{%s}"
61+
(node/string (first children))
62+
(node/concat-strings (-> children second :children))))
63+
64+
node/InnerNode
65+
(inner? [_] true)
66+
(children [_] children)
67+
(replace-children [this children']
68+
(node/assert-sexpr-count children' 2)
69+
(assoc this :children children'))
70+
(leader-length [_]
71+
(dec wrap-length))
72+
73+
Object
74+
(toString [this]
75+
(node/string this)))
76+
3777
(node/make-printable! SeqNode)
78+
(node/make-printable! NamespacedMapNode)
3879

3980
;; ## Constructors
4081

@@ -57,3 +98,9 @@
5798
"Create a node representing an EDN map."
5899
[children]
59100
(->SeqNode :map "{%s}" 2 #(apply hash-map %) children))
101+
102+
(defn namespaced-map-node
103+
"Create a node representing an EDN map namespace."
104+
[children]
105+
(node/assert-sexpr-count children 2)
106+
(->NamespacedMapNode 2 children))

src/rewrite_clj/parser/core.clj

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,8 @@
66
[keyword :refer [parse-keyword]]
77
[string :refer [parse-string parse-regex]]
88
[token :refer [parse-token]]
9-
[whitespace :refer [parse-whitespace]]]))
9+
[whitespace :refer [parse-whitespace]]]
10+
[clojure.tools.reader.reader-types :as r]))
1011

1112
;; ## Base Parser
1213

@@ -119,6 +120,9 @@
119120
\' (node/var-node (parse-printables reader :var 1 true))
120121
\= (node/eval-node (parse-printables reader :eval 1 true))
121122
\_ (node/uneval-node (parse-printables reader :uneval 1 true))
123+
\: (do
124+
(r/unread reader \:)
125+
(node/namespaced-map-node (parse-printables reader :keyword 2 true)))
122126
\? (do
123127
;; we need to examine the next character, so consume one (known \?)
124128
(reader/next reader)

0 commit comments

Comments
 (0)