org-element: Auto-undefer deferred properties that depend on buffer positions

* lisp/org-element.el (org-element--get-node-properties):
(org-element--headline-parse-title):
(org-element--headline-parse-title-raw):
(org-element--headline-parse-title-parse):
(org-element-comment-block-parser):
(org-element-example-block-parser):
(org-element-export-block-parser):
(org-element-latex-environment-parser):
(org-element-src-block-parser):
(org-element-table-parser):
(org-element--parse-generic-emphasis):
(org-element-export-snippet-parser):
(org-element-inline-babel-call-parser):
(org-element-latex-fragment-parser): Auto-undefer node properties that
are calculated based on buffer position of the node.  This will make
the return value of `org-element-at-point' a little more robust once
the buffer is modified.  The :begin/:end, and other positional
properties may not be up-to-date, but at least some other properties
may be "frozen" if they are undeferred early.  Auto-undefer is still
disabled for properties that do not depend on buffer positions and may
benefit from dynamic calculation that takes into account syntax
changes that are influenced by global variables.
This commit is contained in:
Ihor Radchenko 2024-06-14 16:22:00 +02:00
parent fd8ddf2874
commit 55fd660b4e
No known key found for this signature in database
GPG Key ID: 6470762A7DA11D8B
1 changed files with 14 additions and 14 deletions

View File

@ -1188,7 +1188,7 @@ parse properties for property drawer at point."
(property-name-symbol (intern property-name)) (property-name-symbol (intern property-name))
(property-value (property-value
(org-element-deferred-create (org-element-deferred-create
nil #'org-element--substring t #'org-element--substring
(- (match-beginning 3) begin) (- (match-beginning 3) begin)
(- (match-end 3) begin)))) (- (match-end 3) begin))))
(cond (cond
@ -1355,7 +1355,7 @@ Throw `:org-element-deferred-retry' signal at the end."
(title-end (point)) (title-end (point))
(raw-value (raw-value
(org-element-deferred-create (org-element-deferred-create
nil #'org-element--headline-raw-value t #'org-element--headline-raw-value
(- title-start begin) (- title-end begin)))) (- title-start begin) (- title-end begin))))
(org-element-put-property headline :raw-value raw-value) (org-element-put-property headline :raw-value raw-value)
(org-element-put-property headline :level level) (org-element-put-property headline :level level)
@ -1386,12 +1386,12 @@ Throw `:org-element-deferred-retry' signal at the end."
(defconst org-element--headline-parse-title-raw (defconst org-element--headline-parse-title-raw
(org-element-deferred-create (org-element-deferred-create
nil #'org-element--headline-parse-title t) t #'org-element--headline-parse-title t)
"Constant holding deferred value for raw headline `:title' property.") "Constant holding deferred value for raw headline `:title' property.")
(defconst org-element--headline-parse-title-parse (defconst org-element--headline-parse-title-parse
(org-element-deferred-create (org-element-deferred-create
nil #'org-element--headline-parse-title nil) t #'org-element--headline-parse-title nil)
"Constant holding deferred value for parsed headline `:title' property.") "Constant holding deferred value for parsed headline `:title' property.")
(defconst org-element--headline-deferred (defconst org-element--headline-deferred
@ -2414,7 +2414,7 @@ Assume point is at comment block beginning."
(if (eobp) (point) (line-beginning-position)))) (if (eobp) (point) (line-beginning-position))))
(value (value
(org-element-deferred-create (org-element-deferred-create
nil #'org-element--substring t #'org-element--substring
(- contents-begin begin) (- contents-begin begin)
(- contents-end begin)))) (- contents-end begin))))
(org-element-create (org-element-create
@ -2532,7 +2532,7 @@ Return a new syntax node of `example-block' type containing `:begin',
(contents-begin (line-beginning-position 2)) (contents-begin (line-beginning-position 2))
(value (value
(org-element-deferred-create (org-element-deferred-create
nil #'org-element--unescape-substring t #'org-element--unescape-substring
(- contents-begin begin) (- contents-begin begin)
(- contents-end begin))) (- contents-end begin)))
(pos-before-blank (progn (goto-char contents-end) (pos-before-blank (progn (goto-char contents-end)
@ -2612,7 +2612,7 @@ Assume point is at export-block beginning."
(if (eobp) (point) (line-beginning-position)))) (if (eobp) (point) (line-beginning-position))))
(value (value
(org-element-deferred-create (org-element-deferred-create
nil #'org-element--unescape-substring t #'org-element--unescape-substring
(- contents-begin begin) (- contents-begin begin)
(- contents-end begin)))) (- contents-end begin))))
(org-element-create (org-element-create
@ -2800,7 +2800,7 @@ Assume point is at the beginning of the latex environment."
(begin (car affiliated)) (begin (car affiliated))
(value (value
(org-element-deferred-create (org-element-deferred-create
nil #'org-element--substring t #'org-element--substring
(- code-begin begin) (- code-begin begin)
(- code-end begin))) (- code-end begin)))
(end (progn (skip-chars-forward " \r\t\n" limit) (end (progn (skip-chars-forward " \r\t\n" limit)
@ -3059,7 +3059,7 @@ Assume point is at the beginning of the block."
;; Retrieve code. ;; Retrieve code.
(value (value
(org-element-deferred-create (org-element-deferred-create
nil #'org-element--unescape-substring t #'org-element--unescape-substring
(- (line-beginning-position 2) begin) (- (line-beginning-position 2) begin)
(- contents-end begin))) (- contents-end begin)))
(pos-before-blank (progn (goto-char contents-end) (pos-before-blank (progn (goto-char contents-end)
@ -3159,7 +3159,7 @@ Assume point is at the beginning of the table."
:contents-end (and (eq type 'org) table-end) :contents-end (and (eq type 'org) table-end)
:value (and (eq type 'table.el) :value (and (eq type 'table.el)
(org-element-deferred-create (org-element-deferred-create
nil #'org-element--substring t #'org-element--substring
(- table-begin begin) (- table-begin begin)
(- table-end begin))) (- table-end begin)))
:post-blank (count-lines pos-before-blank end) :post-blank (count-lines pos-before-blank end)
@ -3322,7 +3322,7 @@ Assume point is at first MARK."
(list :value (list :value
(and (memq type '(code verbatim)) (and (memq type '(code verbatim))
(org-element-deferred-create (org-element-deferred-create
nil #'org-element--substring t #'org-element--substring
(- contents-begin origin) (- contents-begin origin)
(- contents-end origin)))) (- contents-end origin))))
(list :contents-begin contents-begin (list :contents-begin contents-begin
@ -3572,7 +3572,7 @@ Assume point is at the beginning of the snippet."
(value (value
(when contents-end (when contents-end
(org-element-deferred-create (org-element-deferred-create
nil #'org-element--substring t #'org-element--substring
(- contents-begin begin) (- contents-begin begin)
(- contents-end begin)))) (- contents-end begin))))
(post-blank (skip-chars-forward " \t")) (post-blank (skip-chars-forward " \t"))
@ -3667,7 +3667,7 @@ Assume point is at the beginning of the babel call."
(replace-regexp-in-string "\n[ \t]*" " " (org-trim p))))) (replace-regexp-in-string "\n[ \t]*" " " (org-trim p)))))
(value (value
(org-element-deferred-create (org-element-deferred-create
nil #'org-element--substring t #'org-element--substring
0 (- (point) begin))) 0 (- (point) begin)))
(post-blank (skip-chars-forward " \t")) (post-blank (skip-chars-forward " \t"))
(end (point))) (end (point)))
@ -3801,7 +3801,7 @@ Assume point is at the beginning of the LaTeX fragment."
'latex-fragment 'latex-fragment
(list :value (list :value
(org-element-deferred-create (org-element-deferred-create
nil #'org-element--substring t #'org-element--substring
0 (- after-fragment begin)) 0 (- after-fragment begin))
:begin begin :begin begin
:end end :end end