diff options
Diffstat (limited to 'lisp/emacs-lisp/syntax.el')
-rw-r--r-- | lisp/emacs-lisp/syntax.el | 45 |
1 files changed, 22 insertions, 23 deletions
diff --git a/lisp/emacs-lisp/syntax.el b/lisp/emacs-lisp/syntax.el index f290db42c04..0937076a7f4 100644 --- a/lisp/emacs-lisp/syntax.el +++ b/lisp/emacs-lisp/syntax.el @@ -53,12 +53,20 @@ (nth 0 ppss)) (defun syntax-ppss-toplevel-pos (ppss) - "Return the last preceding position at toplevel. -\"At toplevel\" means that it is outside of any syntactic entity: -outside of any parentheses, or comments, or strings. -Returns nil iff PPSS itself corresponds to a toplevel position." + "Get the latest syntactically outermost position found in a syntactic scan. +PPSS is a scan state, as returned by `partial-parse-sexp' or `syntax-ppss'. +An \"outermost position\" means one that it is outside of any syntactic entity: +outside of any parentheses, comments, or strings encountered in the scan. +If no such position is recorded in PPSS (because the end of the scan was +itself at the outermost level), return nil." + ;; BEWARE! We rely on the undocumented 9th field. The 9th field currently + ;; contains the list of positions of the enclosing open-parens. + ;; I.e. those positions are outside of any string/comment and the first of + ;; those is outside of any paren (i.e. corresponds to a nil ppss). + ;; If this list is empty but we are in a string or comment, then the 8th + ;; field contains a similar "toplevel" position. (or (car (nth 9 ppss)) - (nth 8 ppss))) + (nth 8 ppss))) (defsubst syntax-ppss-context (ppss) (cond @@ -95,8 +103,7 @@ point (where the PPSS is equivalent to nil).") ;; depend on the text after BEG (which is presumably changed). So if ;; BEG=(car (nth 10 syntax-ppss-last)) don't reuse that data because the ;; assumed nil state at BEG may not be valid any more. - (if (<= beg (or (car (nth 10 syntax-ppss-last)) - (nth 9 syntax-ppss-last) + (if (<= beg (or (syntax-ppss-toplevel-pos (cdr syntax-ppss-last)) (nth 3 syntax-ppss-last) 0)) (setq syntax-ppss-last nil) @@ -144,22 +151,14 @@ Point is at POS when this function returns." (cond ;; Use OLD-PPSS if possible and close enough. ((and (not old-pos) old-ppss - ;; BEWARE! We rely on the undocumented 9th field. The 9th - ;; field currently contains the list of positions of - ;; open-parens of the enclosing parens. I.e. those - ;; positions are outside of any string/comment - ;; and the first of those is outside of any paren - ;; (i.e. corresponds to a nil ppss). If this list is empty - ;; but we are in a string or comment, then the 8th field - ;; contains a similar "toplevel" position. If `pt-min' is - ;; too far from `pos', we could try to use other positions - ;; in (nth 9 old-ppss), but that doesn't seem to happen in - ;; practice and it would complicate this code (and the - ;; before-change-function code even more). But maybe it - ;; would be useful in "degenerate" cases such as when the - ;; whole file is wrapped in a set of parenthesis. - (setq pt-min (or (car (nth 9 old-ppss)) - (nth 8 old-ppss) + ;; If `pt-min' is too far from `pos', we could try to use + ;; other positions in (nth 9 old-ppss), but that doesn't + ;; seem to happen in practice and it would complicate this + ;; code (and the before-change-function code even more). + ;; But maybe it would be useful in "degenerate" cases such + ;; as when the whole file is wrapped in a set + ;; of parentheses. + (setq pt-min (or (syntax-ppss-toplevel-pos old-ppss) (nth 2 old-ppss))) (<= pt-min pos) (< (- pos pt-min) syntax-ppss-max-span)) (incf (car (aref syntax-ppss-stats 1))) |