Skip to content

Commit 771aae9

Browse files
author
Yannick Scherer
committed
[#54] construct namespaced map from keyword and map.
1 parent b3b6312 commit 771aae9

File tree

2 files changed

+28
-26
lines changed

2 files changed

+28
-26
lines changed

src/rewrite_clj/node/seq.clj

Lines changed: 27 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -34,41 +34,45 @@
3434
(toString [this]
3535
(node/string this)))
3636

37-
(defrecord NamespacedMapNode [wrap-length children]
37+
(defn- assert-namespaced-map-children
38+
[children]
39+
(let [exs (node/sexprs children)]
40+
(assert (= (count exs) 2)
41+
"can only contain 2 non-whitespace forms.")
42+
(assert (keyword? (first exs))
43+
"first form in namespaced map needs to be keyword.")
44+
(assert (not (namespace (first exs)))
45+
"keyword for namespaced map may not be already namespaced.")
46+
(assert (map? (second exs))
47+
"second form in namespaced map needs to be map.")))
48+
49+
(defrecord NamespacedMapNode [children]
3850
node/Node
3951
(tag [this]
4052
:namespaced-map)
4153
(printable-only? [_] false)
4254
(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))))))
55+
(let [[ns m] (node/sexprs children)
56+
ns (name ns)]
57+
(->> (for [[k v] m
58+
:let [k' (cond (not (keyword? k)) k
59+
(namespace k) k
60+
:else (keyword ns (name k)))]]
61+
[k' v])
62+
(into {}))))
5763
(length [_]
58-
(+ wrap-length (node/sum-lengths children)))
64+
(+ 1 (node/sum-lengths children)))
5965
(string [this]
60-
(format "#%s{%s}"
61-
(node/string (first children))
62-
(node/concat-strings (-> children second :children))))
66+
(str "#" (node/concat-strings children)))
6367

6468
node/InnerNode
6569
(inner? [_] true)
6670
(children [_] children)
6771
(replace-children [this children']
68-
(node/assert-sexpr-count children' 2)
72+
(assert-namespaced-map-children children')
6973
(assoc this :children children'))
7074
(leader-length [_]
71-
(dec wrap-length))
75+
1)
7276

7377
Object
7478
(toString [this]
@@ -102,5 +106,5 @@
102106
(defn namespaced-map-node
103107
"Create a node representing an EDN map namespace."
104108
[children]
105-
(node/assert-sexpr-count children 2)
106-
(->NamespacedMapNode 2 children))
109+
(assert-namespaced-map-children children)
110+
(->NamespacedMapNode children))

src/rewrite_clj/parser/core.clj

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -120,9 +120,7 @@
120120
\' (node/var-node (parse-printables reader :var 1 true))
121121
\= (node/eval-node (parse-printables reader :eval 1 true))
122122
\_ (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)))
123+
\: (node/namespaced-map-node (parse-printables reader :keyword 2))
126124
\? (do
127125
;; we need to examine the next character, so consume one (known \?)
128126
(reader/next reader)

0 commit comments

Comments
 (0)