Skip to content

Commit e80e698

Browse files
author
Chris Blom
committed
Use a separate node type for regex forms
This node type stores the pattern string, instead of using generic token nodes that store java.util.Pattern objects. java.util.Pattern instances cannot be compared using equals, which would prevent comparison of sexprs generated by node/sexpr that contain regex forms
1 parent cc5ff42 commit e80e698

File tree

5 files changed

+36
-10
lines changed

5 files changed

+36
-10
lines changed

src/rewrite_clj/node.clj

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
protocols
1313
quote
1414
reader-macro
15+
regex
1516
seq
1617
string
1718
token
@@ -57,6 +58,9 @@
5758
meta-node
5859
raw-meta-node]
5960

61+
[rewrite-clj.node.regex
62+
regex-node]
63+
6064
[rewrite-clj.node.reader-macro
6165
deref-node
6266
eval-node

src/rewrite_clj/node/regex.clj

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
(ns ^:no-doc rewrite-clj.node.regex
2+
(:require [rewrite-clj.node.protocols :as node]))
3+
4+
5+
;; ## Node
6+
7+
(defrecord RegexNode [pattern]
8+
rewrite-clj.node.protocols/Node
9+
(tag [_] :regex)
10+
(printable-only? [_] false)
11+
(sexpr [_] (list 're-pattern pattern))
12+
(length [_] 1)
13+
(string [_] (str "#\"" pattern "\"")))
14+
15+
(node/make-printable! RegexNode)
16+
17+
;; ## Constructor
18+
19+
(defn regex-node
20+
"Create node representing a regex"
21+
[pattern-string]
22+
(->RegexNode pattern-string))

src/rewrite_clj/parser/core.clj

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -114,7 +114,7 @@
114114
nil (reader/throw-reader reader "Unexpected EOF.")
115115
\{ (node/set-node (parse-delim reader \}))
116116
\( (node/fn-node (parse-delim reader \)))
117-
\" (parse-regex reader)
117+
\" (node/regex-node (parse-regex reader))
118118
\^ (node/raw-meta-node (parse-printables reader :meta 2 true))
119119
\' (node/var-node (parse-printables reader :var 1 true))
120120
\= (node/eval-node (parse-printables reader :eval 1 true))

src/rewrite_clj/parser/string.clj

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,4 +40,4 @@
4040
(defn parse-regex
4141
[reader]
4242
(let [h (read-string-data reader)]
43-
(node/token-node (re-pattern (string/join "\n" h)))))
43+
(string/join "\n" h)))

test/rewrite_clj/parser_test.clj

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -112,15 +112,15 @@
112112
(tabular
113113
(fact "about parsing regular expressions"
114114
(let [n (p/parse-string ?s)]
115-
(node/tag n) => :token
116-
(class (node/sexpr n)) => java.util.regex.Pattern
117-
(str (node/sexpr n)) => ?p))
115+
(node/tag n) => :regex
116+
(node/sexpr n) => ?p))
118117
?s ?p
119-
"#\"regex\"" "regex"
120-
"#\"regex\\.\"" "regex\\."
121-
"#\"[reg|k].x\"" "[reg|k].x"
122-
"#\"a\\nb\"" "a\\nb"
123-
"#\"a\nb\"" "a\nb")
118+
119+
"#\"regex\"" '(re-pattern "regex")
120+
"#\"regex\\.\"" '(re-pattern "regex\\.")
121+
"#\"[reg|k].x\"" '(re-pattern "[reg|k].x")
122+
"#\"a\\nb\"" '(re-pattern "a\\nb")
123+
"#\"a\nb\"" '(re-pattern "a\nb"))
124124

125125
(tabular
126126
(fact "about parsing strings"

0 commit comments

Comments
 (0)