File tree Expand file tree Collapse file tree 3 files changed +54
-2
lines changed Expand file tree Collapse file tree 3 files changed +54
-2
lines changed Original file line number Diff line number Diff line change 70
70
[rewrite-clj.node.seq
71
71
list-node
72
72
map-node
73
+ namespaced-map-node
73
74
set-node
74
75
vector-node]
75
76
Original file line number Diff line number Diff line change 1
1
(ns ^:no-doc rewrite-clj.node.seq
2
2
(:require [rewrite-clj.node.protocols :as node]))
3
3
4
- ; ; ## Node
4
+ ; ; ## Nodes
5
5
6
6
(defrecord SeqNode [tag
7
7
format-string
34
34
(toString [this]
35
35
(node/string this)))
36
36
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
+
37
77
(node/make-printable! SeqNode)
78
+ (node/make-printable! NamespacedMapNode)
38
79
39
80
; ; ## Constructors
40
81
57
98
" Create a node representing an EDN map."
58
99
[children]
59
100
(->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))
Original file line number Diff line number Diff line change 6
6
[keyword :refer [parse-keyword]]
7
7
[string :refer [parse-string parse-regex]]
8
8
[token :refer [parse-token]]
9
- [whitespace :refer [parse-whitespace]]]))
9
+ [whitespace :refer [parse-whitespace]]]
10
+ [clojure.tools.reader.reader-types :as r]))
10
11
11
12
; ; ## Base Parser
12
13
119
120
\' (node/var-node (parse-printables reader :var 1 true ))
120
121
\= (node/eval-node (parse-printables reader :eval 1 true ))
121
122
\_ (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 )))
122
126
\? (do
123
127
; ; we need to examine the next character, so consume one (known \?)
124
128
(reader/next reader)
You can’t perform that action at this time.
0 commit comments