org-element-cache: Fix when edit extends previous element

* lisp/org-element.el (org-element--cache-after-change): Always extend
changed region to bol.
* testing/lisp/test-org-element.el (test-org-element/cache): Add test
checking the new fix.  Amend some tests around making sure that cache
is active during testing.
This commit is contained in:
Ihor Radchenko 2021-12-17 20:23:50 +08:00
parent d6e6a9a3bc
commit e2a8e95576
No known key found for this signature in database
GPG Key ID: 6470762A7DA11D8B
2 changed files with 22 additions and 13 deletions

View File

@ -6602,10 +6602,8 @@ that range. See `after-change-functions' for more information."
;; sure that we capture preceding element.
(setq beg (save-excursion
(goto-char beg)
(skip-chars-backward " \t")
(if (not (bolp)) beg
(cl-incf pre (- beg (point)))
(point))))
(cl-incf pre (- beg (line-beginning-position)))
(line-beginning-position)))
;; Store synchronization request.
(let ((offset (- end beg pre)))
(save-match-data

View File

@ -4080,19 +4080,30 @@ Text
;; Test edits near :end of element
(should-not (eq 'headline
(org-test-with-temp-text "* H1\nP1\n<point>*H2\n"
(org-element-cache-map #'ignore :granularity 'element)
(insert "Blah")
(org-element-type (org-element-at-point)))))
(let ((org-element-use-cache t))
(org-element-cache-map #'ignore :granularity 'element)
(insert "Blah")
(org-element-type (org-element-at-point))))))
(should-not (eq 'headline
(org-test-with-temp-text "* H1\nP1\n<point>*H2\n"
(org-element-cache-map #'ignore :granularity 'element)
(backward-delete-char 1)
(org-element-type (org-element-at-point)))))
(let ((org-element-use-cache t))
(org-element-cache-map #'ignore :granularity 'element)
(backward-delete-char 1)
(org-element-type (org-element-at-point))))))
(org-test-with-temp-text "Paragraph.\n #<point> comment"
(let ((org-element-use-cache t))
(org-element-cache-map #'ignore :granularity 'element)
(should (eq 'comment (org-element-type (org-element-at-point))))
(insert "not comment anymore")
(org-element-cache-map #'ignore :granularity 'element)
(should-not (eq 'comment (org-element-type (org-element-at-point))))
(should (eq (org-element-at-point) (org-element-at-point 1)))))
(should (eq 'headline
(org-test-with-temp-text "* H1\nP1\n<point*H2\n"
(org-element-cache-map #'ignore :granularity 'element)
(insert "Blah\n")
(org-element-type (org-element-at-point)))))
(let ((org-element-use-cache t))
(org-element-cache-map #'ignore :granularity 'element)
(insert "Blah\n")
(org-element-type (org-element-at-point))))))
;; Corner case: watch out drawers named "PROPERTIES" as they are
;; fragile, unlike to other drawers.
(should