Browse Source

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.
Ihor Radchenko 3 years ago
parent
commit
e2a8e95576
2 changed files with 22 additions and 13 deletions
  1. 2 4
      lisp/org-element.el
  2. 20 9
      testing/lisp/test-org-element.el

+ 2 - 4
lisp/org-element.el

@@ -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

+ 20 - 9
testing/lisp/test-org-element.el

@@ -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