[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[elpa] externals/yasnippet 7c02bc1 2/8: Fix failure on depth 2+ nested s
From: |
Stefan Monnier |
Subject: |
[elpa] externals/yasnippet 7c02bc1 2/8: Fix failure on depth 2+ nested snippets |
Date: |
Mon, 15 Mar 2021 22:25:52 -0400 (EDT) |
branch: externals/yasnippet
commit 7c02bc142c3b157699ab8c4f24ff98da94401248
Author: Noam Postavsky <npostavs@users.sourceforge.net>
Commit: Noam Postavsky <npostavs@users.sourceforge.net>
Fix failure on depth 2+ nested snippets
* yasnippet.el (yas--advance-end-maybe-previous-fields): New function.
(yas--commit-snippet, yas--on-field-overlay-modification)
(yas-expand-snippet): Use it, so that all active fields will be
extended properly, even in case of deeply nested snippet expansion.
* yasnippet-tests.el (nested-snippet-expansion-depth-2): New test.
---
yasnippet-tests.el | 18 ++++++++++++++++++
yasnippet.el | 25 +++++++++++++++----------
2 files changed, 33 insertions(+), 10 deletions(-)
diff --git a/yasnippet-tests.el b/yasnippet-tests.el
index f7ca2bb..578125b 100644
--- a/yasnippet-tests.el
+++ b/yasnippet-tests.el
@@ -1099,6 +1099,24 @@ hello ${1:$(when (stringp yas-text) (funcall func
yas-text))} foo${1:$$(concat \
(should (= (length (yas--snippet-fields (nth 0 snippets))) 2))
(should (= (length (yas--snippet-fields (nth 1 snippets))) 1))))))
+(ert-deftest nested-snippet-expansion-depth-2 ()
+ (with-temp-buffer
+ (yas-with-snippet-dirs
+ '((".emacs.d/snippets"
+ ("text-mode"
+ ("nest" . "( $1"))))
+ (let ((yas-triggers-in-field t))
+ (yas-reload-all)
+ (text-mode)
+ (yas-minor-mode +1)
+ (dotimes (_ 3)
+ (yas-mock-insert "nest")
+ (ert-simulate-command '(yas-expand)))
+ (dotimes (_ 3)
+ (yas-mock-insert ")")
+ (ert-simulate-command '(yas-next-field-or-maybe-expand)))
+ ))))
+
(ert-deftest nested-snippet-expansion-2 ()
(let ((yas-triggers-in-field t))
(yas-with-snippet-dirs
diff --git a/yasnippet.el b/yasnippet.el
index e0b5537..bf15b31 100644
--- a/yasnippet.el
+++ b/yasnippet.el
@@ -3501,7 +3501,8 @@ This renders the snippet as ordinary text."
;;
(let ((previous-field (yas--snippet-previous-active-field snippet)))
(when (and yas-snippet-end previous-field)
- (yas--advance-end-maybe previous-field yas-snippet-end)))
+ (yas--advance-end-maybe-previous-fields
+ previous-field yas-snippet-end (cdr yas--active-snippets))))
;; Convert all markers to points,
;;
@@ -3849,14 +3850,9 @@ field start. This hook does nothing if an undo is in
progress."
(setf (yas--field-modified-p field) t)
;; Adjust any pending active fields in case of stacked
;; expansion.
- (let ((pfield field)
- (psnippets (yas--gather-active-snippets
- overlay beg end t)))
- (while (and pfield psnippets)
- (let ((psnippet (pop psnippets)))
- (cl-assert (memq pfield (yas--snippet-fields
psnippet)))
- (yas--advance-end-maybe pfield (overlay-end overlay))
- (setq pfield (yas--snippet-previous-active-field
psnippet)))))
+ (yas--advance-end-maybe-previous-fields
+ field (overlay-end overlay)
+ (yas--gather-active-snippets overlay beg end t))
;; Update fields now, but delay auto indentation until
;; post-command. We don't want to run indentation on
;; the intermediate state where field text might be
@@ -4110,7 +4106,9 @@ for normal snippets, and a list for command snippets)."
(overlay-get yas--active-field-overlay
'yas--field))))
(when existing-field
(setf (yas--snippet-previous-active-field snippet)
existing-field)
- (yas--advance-end-maybe existing-field (overlay-end
yas--active-field-overlay))))
+ (yas--advance-end-maybe-previous-fields
+ existing-field (overlay-end yas--active-field-overlay)
+ (cdr yas--active-snippets))))
;; Exit the snippet immediately if no fields.
(unless (yas--snippet-fields snippet)
@@ -4336,6 +4334,13 @@ exit-marker have identical start and end markers."
((yas--exit-p fom)
(yas--advance-start-maybe (yas--fom-next fom) newend))))
+(defun yas--advance-end-maybe-previous-fields (field end snippets)
+ "Call `yas--advance-end-maybe' on FIELD, and previous fields on SNIPPETS."
+ (dolist (snippet snippets)
+ (cl-assert (memq field (yas--snippet-fields snippet)))
+ (yas--advance-end-maybe field end)
+ (setq field (yas--snippet-previous-active-field snippet))))
+
(defun yas--advance-start-maybe (fom newstart)
"Maybe advance FOM's start to NEWSTART if it needs it.
- [elpa] externals/yasnippet updated (3bf9a3b -> 5cbdbf0), Stefan Monnier, 2021/03/15
- [elpa] externals/yasnippet 5b1217a 6/8: ; Add some notes about narrowing, font-lock cc-mode issues, Stefan Monnier, 2021/03/15
- [elpa] externals/yasnippet 1cc1996 5/8: Don't bind inhibit-modification-hooks in yas--snippet-create, Stefan Monnier, 2021/03/15
- [elpa] externals/yasnippet d3d6d70 7/8: Correct manual call to after-change-functions, Stefan Monnier, 2021/03/15
- [elpa] externals/yasnippet 291873e 4/8: ; .travis.yml: Clean up validator warnings/infos, Stefan Monnier, 2021/03/15
- [elpa] externals/yasnippet ac03c2f 1/8: ; Test on Emacs 27, Stefan Monnier, 2021/03/15
- [elpa] externals/yasnippet 170d13d 3/8: Scan nested fields properly, Stefan Monnier, 2021/03/15
- [elpa] externals/yasnippet 7c02bc1 2/8: Fix failure on depth 2+ nested snippets,
Stefan Monnier <=
- [elpa] externals/yasnippet 5cbdbf0 8/8: Handle errors during evaluation properly, Stefan Monnier, 2021/03/15