Skip to content

Commit cd09e67

Browse files
committed
feat(reader): set previous attribute on form for easy traversal
1 parent 081f01a commit cd09e67

File tree

3 files changed

+38
-6
lines changed

3 files changed

+38
-6
lines changed

elsa-form.el

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,14 @@
1515
(type :type elsa-type :initarg :type :initform (elsa-type-mixed))
1616
(narrow-types :initarg :narrow-type :initform nil)
1717
(reachable :type trinary :initarg :reachable :initform (trinary-true))
18-
(parent :type (or elsa-form nil) :initarg :parent)
18+
(parent
19+
:type (or elsa-form null)
20+
:initarg :parent
21+
:documentation "Parent form.")
22+
(previous
23+
:type (or elsa-form null)
24+
:initarg :previous
25+
:documentation "Previous form in a sequence.")
1926
(annotation :type list :initarg :annotation :initform nil))
2027
:abstract t)
2128

elsa-reader.el

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -656,17 +656,27 @@ for the analysis."
656656
(let ((cons-form (cond
657657
((elsa--quote-p (car form))
658658
(elsa--read-quote form state))
659-
(t (elsa--read-cons form state)))))
659+
(t (elsa--read-cons form state))))
660+
(previous nil))
660661
(elsa-form-foreach cons-form
661-
(lambda (f) (oset f parent cons-form)))
662+
(lambda (f)
663+
(oset f parent cons-form)
664+
;; first one is set to nil
665+
(oset f previous previous)
666+
(setq previous f)))
662667
cons-form))
663668
((integerp form) (elsa--read-integer form))
664669
((floatp form) (elsa--read-float form))
665670
((stringp form) (elsa--read-string form))
666671
((vectorp form)
667-
(let ((vector-form (elsa--read-vector form state)))
672+
(let ((vector-form (elsa--read-vector form state))
673+
(previous nil))
668674
(elsa-form-foreach vector-form
669-
(lambda (f) (oset f parent vector-form)))
675+
(lambda (f)
676+
(oset f parent vector-form)
677+
;; first one is set to nil
678+
(oset f previous previous)
679+
(setq previous f)))
670680
vector-form))
671681
((functionp form) (elsa--read-function form state))
672682
(t (error "Invalid form")))))

tests/test-reader.el

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -153,8 +153,23 @@
153153
(it "should read a list in dotted notation with quoted last cdr"
154154
(elsa-test-with-read-form "(foo . (quote . '(bar baz)))" form
155155
(expect (elsa-form-list-p form) :to-be-truthy)
156-
(expect (elsa-form-print form) :to-equal "(foo quote quote (bar baz))")))))
156+
(expect (elsa-form-print form) :to-equal "(foo quote quote (bar baz))"))))
157157

158+
(describe "setting parents"
159+
160+
(it "should set parent of forms in a list to the list form"
161+
(elsa-test-with-read-form "(a b c)" form
162+
(expect (oref (elsa-nth 0 form) parent) :to-be form)
163+
(expect (oref (elsa-nth 1 form) parent) :to-be form)
164+
(expect (oref (elsa-nth 2 form) parent) :to-be form))))
165+
166+
(describe "setting previous"
167+
168+
(it "should set previous of forms in a list to the previous form"
169+
(elsa-test-with-read-form "(a b c)" form
170+
(expect (oref (elsa-nth 0 form) previous) :to-be nil)
171+
(expect (oref (elsa-nth 1 form) previous) :to-be (elsa-nth 0 form))
172+
(expect (oref (elsa-nth 2 form) previous) :to-be (elsa-nth 1 form))))))
158173

159174
(describe "functions"
160175

0 commit comments

Comments
 (0)