branch: elpa/parseclj
commit 4f54ba52fe8a97c6792a9fb5a360822a43a3dfef
Author: Arne Brasseur <[email protected]>
Commit: Arne Brasseur <[email protected]>
Add support for sets
---
clj-lex-test.el | 9 ++++++++-
clj-lex.el | 8 ++++++++
clj-parse-test.el | 6 +++++-
clj-parse.el | 12 +++++++++++-
4 files changed, 32 insertions(+), 3 deletions(-)
diff --git a/clj-lex-test.el b/clj-lex-test.el
index 3710ad2945..99cea11c28 100644
--- a/clj-lex-test.el
+++ b/clj-lex-test.el
@@ -125,7 +125,14 @@
(should (equal (clj-lex-next) (clj-lex-token :keyword ":count" 2)))
(should (equal (clj-lex-next) (clj-lex-token :whitespace " " 8)))
(should (equal (clj-lex-next) (clj-lex-token :number "123" 9)))
- (should (equal (clj-lex-next) (clj-lex-token :rbrace "}" 12)))))
+ (should (equal (clj-lex-next) (clj-lex-token :rbrace "}" 12))))
+
+ (with-temp-buffer
+ (insert "#{:x}")
+ (goto-char 1)
+ (should (equal (clj-lex-next) (clj-lex-token :set "#{" 1)))
+ (should (equal (clj-lex-next) (clj-lex-token :keyword ":x" 3)))
+ (should (equal (clj-lex-next) (clj-lex-token :rbrace "}" 5)))))
(ert-deftest clj-lex-test-at-number? ()
(dolist (str '("123" ".9" "+1" "0" "-456"))
diff --git a/clj-lex.el b/clj-lex.el
index 94e5c5823d..4901667d3f 100644
--- a/clj-lex.el
+++ b/clj-lex.el
@@ -208,6 +208,14 @@
((equal char ?:)
(clj-lex-keyword))
+ ((equal char ?#)
+ (right-char)
+ (let ((char (char-after (point))))
+ (cl-case char
+ (?{
+ (right-char)
+ (clj-lex-token :set "#{" pos)))))
+
":("))))
(provide 'clj-lex)
diff --git a/clj-parse-test.el b/clj-parse-test.el
index 0554f5d1a5..ef06cb6d04 100644
--- a/clj-parse-test.el
+++ b/clj-parse-test.el
@@ -89,8 +89,12 @@
(with-temp-buffer
(insert "{:count 123}")
(goto-char 1)
- (should (equal (clj-parse) '(((:count . 123)))))))
+ (should (equal (clj-parse) '(((:count . 123))))))
+ (with-temp-buffer
+ (insert "#{:x}")
+ (goto-char 1)
+ (should (equal (clj-parse) '((:x))))))
(provide 'clj-parse-test)
diff --git a/clj-parse.el b/clj-parse.el
index 3c90cd302d..85cfd7db66 100644
--- a/clj-parse.el
+++ b/clj-parse.el
@@ -98,6 +98,7 @@
(:whitespace :ws)
(:number coll)
(:list (-butlast (cdr coll)))
+ (:set (-butlast (cdr coll)))
(:vector (apply #'vector (-butlast (cdr coll))))
(:map (mapcar (lambda (pair)
(cons (car pair) (cadr pair)))
@@ -138,7 +139,16 @@
(cl-case (clj-parse--token-type (car stack))
(:rparen (setf stack (clj-parse--reduce-coll stack :lparen :list
reduceN)))
(:rbracket (setf stack (clj-parse--reduce-coll stack :lbracket :vector
reduceN)))
- (:rbrace (setf stack (clj-parse--reduce-coll stack :lbrace :map
reduceN))))
+ (:rbrace
+ (let ((open-token (-find (lambda (token)
+ (member (clj-parse--token-type token)
'(:lbrace :set)))
+ stack)))
+
+ (cl-case (clj-parse--token-type open-token)
+ (:lbrace
+ (setf stack (clj-parse--reduce-coll stack :lbrace :map reduceN)))
+ (:set
+ (setf stack (clj-parse--reduce-coll stack :set :set
reduceN)))))))
(setq token (clj-lex-next)))