From 27a41d418d4558b511f4ab74bf26dde0b72d2526 Mon Sep 17 00:00:00 2001 From: Ihor Radchenko Date: Wed, 16 Aug 2023 11:41:31 +0300 Subject: [PATCH] org-element--cache-before-change: Fix edge case creating heading * lisp/org-element.el (org-element--cache-before-change): Fix edge case when a heading is created because we insert a newline right before ****. * testing/lisp/test-org-element.el (test-org-element/cache-headline): Add tests. Reported-by: Rodrigo Morales Link: https://orgmode.org/list/CAGxMbPbbqc33iaqJ=EceyKrLaf4maJAxaUmJGaPOvG_Rpw+xcQ@mail.gmail.com --- lisp/org-element.el | 16 ++-------------- testing/lisp/test-org-element.el | 27 ++++++++++++++++++++++++++- 2 files changed, 28 insertions(+), 15 deletions(-) diff --git a/lisp/org-element.el b/lisp/org-element.el index ffd492d72..0debd1a68 100644 --- a/lisp/org-element.el +++ b/lisp/org-element.el @@ -6705,20 +6705,8 @@ The function returns the new value of `org-element--cache-change-warning'." (setq org-element--cache-change-tic (buffer-chars-modified-tick)) (setq org-element--cache-last-buffer-size (buffer-size)) (goto-char beg) - (beginning-of-line) - (let ((bottom (save-excursion - (goto-char end) - (if (and (bolp) - ;; When beg == end, still extent to eol. - (> (point) beg)) - ;; FIXME: Potential pitfall. - ;; We are appending to an element end. - ;; Unless the last inserted char is not - ;; newline, the next element is not broken - ;; and does not need to be purged from the - ;; cache. - end - (line-end-position))))) + (forward-line 0) + (let ((bottom (save-excursion (goto-char end) (line-end-position)))) (prog1 ;; Use the worst change warning to not miss important edits. ;; This function is called before edit and after edit by diff --git a/testing/lisp/test-org-element.el b/testing/lisp/test-org-element.el index 8c97371bb..6e7658759 100644 --- a/testing/lisp/test-org-element.el +++ b/testing/lisp/test-org-element.el @@ -4372,7 +4372,32 @@ paragraph (let ((org-element-use-cache t)) (org-element-at-point (point-max)) (delete-region (point) (point-max)) - (should (eq 'paragraph (org-element-type (org-element-at-point))))))) + (should (eq 'paragraph (org-element-type (org-element-at-point)))))) + ;; Remove/re-introduce heading. + (org-test-with-temp-text + " +* 1 +** 1-1 +a +** 1-2 +a +" + (let ((org-element-use-cache t)) + (org-element-at-point (point-max)) + (insert "FOO") + (should + (equal + "1-1" + (org-element-property + :title + (org-element-lineage (org-element-at-point) '(headline))))) + (insert "\n") + (should + (equal + "1" + (org-element-property + :title + (org-element-lineage (org-element-at-point) '(headline)))))))) (provide 'test-org-element)