emacs-diffs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Emacs-diffs] scratch/widen-less a4ba846: Replace prog-widen with consol


From: Dmitry Gutov
Subject: [Emacs-diffs] scratch/widen-less a4ba846: Replace prog-widen with consolidating widen calls
Date: Wed, 29 Nov 2017 18:32:38 -0500 (EST)

branch: scratch/widen-less
commit a4ba8464c15cf62d40d72f35ce031ff9234f31d7
Author: Dmitry Gutov <address@hidden>
Commit: Dmitry Gutov <address@hidden>

    Replace prog-widen with consolidating widen calls
---
 doc/lispref/text.texi       | 45 +++++----------------------------------------
 etc/NEWS                    |  8 ++++----
 lisp/indent.el              | 12 +++++++++---
 lisp/progmodes/prog-mode.el | 28 ++--------------------------
 lisp/progmodes/python.el    | 34 ++++++++--------------------------
 lisp/progmodes/ruby-mode.el |  1 -
 lisp/vc/add-log.el          |  4 +++-
 7 files changed, 31 insertions(+), 101 deletions(-)

diff --git a/doc/lispref/text.texi b/doc/lispref/text.texi
index 1e19f75..5a63e5b 100644
--- a/doc/lispref/text.texi
+++ b/doc/lispref/text.texi
@@ -2407,42 +2407,17 @@ such multi-mode indentation.
 This variable, when address@hidden, holds the indentation context for
 the sub-mode's indentation engine provided by the superior major mode.
 The value should be a list of the form @code{(@var{first-column}
address@hidden(@var{start} . @var{end})} @code{prev-chunk})}.  The members of 
the
-list have the following meaning:
address@hidden)}.  The members of the list have the following meaning:
 
 @table @var
 @item first-column
 The column to be used for top-level constructs.  This replaces the
 default value of the top-level column used by the sub-mode, usually
 zero.
address@hidden start
address@hidden end
-The region of the code chunk to be indented by the sub-mode.  The
-value of @var{end} can be @code{nil}, which stands for the value of
address@hidden
address@hidden prev-chunk
-If this is address@hidden, it should provide the sub-mode's
-indentation engine with a virtual context of the code chunk.  Valid
-values include:
-
address@hidden @minus
address@hidden
-A string whose contents is the text the sub-mode's indentation engine
-should consider to precede the code chunk.  The sub-mode's indentation
-engine can add text properties to that string, to be reused in
-repeated calls with the same string, thus using it as a cache.  An
-example where this is useful is code chunks that need to be indented
-as function bodies, but lack the function's preamble---the string
-could then include that missing preamble.
address@hidden
-A function.  It is expected to be called with the start position of
-the current chunk, and should return a cons cell
address@hidden@code{(@var{prev-start} . @var{prev-end})}} that specifies the
-region of the previous code chunk, or @code{nil} if there is no previous
-chunk.  This is useful in literate-programming sources, where code is
-split into chunks, and correct indentation needs to access previous
-chunks.
address@hidden itemize
address@hidden rest
+Reserved for future use.  The intent is to provide the sub-mode's
+indentation engine with a virtual context of the code chunk.  Working
+patches that use this in a significant fashion are welcome.
 @end table
 @end defvar
 
@@ -2457,16 +2432,6 @@ function's value is the column number to use for 
top-level constructs.
 When no superior mode is in effect, this function returns zero.
 @end defun
 
address@hidden prog-widen
-Call this function instead of @code{widen} to remove any restrictions
-imposed by the mode's indentation engine and restore the restrictions
-recorded in @code{prog-indentation-context}.  This prevents the
-indentation engine of a sub-mode from inadvertently operating on text
-outside of the chunk it was supposed to indent, and preserves the
-restriction imposed by the superior mode.  When no superior mode is in
-effect, this function just calls @code{widen}.
address@hidden defun
-
 
 @node Region Indent
 @subsection Indenting an Entire Region
diff --git a/etc/NEWS b/etc/NEWS
index 4ccf468..6e1561d 100644
--- a/etc/NEWS
+++ b/etc/NEWS
@@ -1108,10 +1108,10 @@ programming languages in the same buffer, like literate 
programming
 environments or ANTLR programs with embedded Python code.
 
 A major mode can provide indentation context for a sub-mode through
-the 'prog-indentation-context' variable.  To support this, modes that
-provide indentation should use 'prog-widen' instead of 'widen' and
-'prog-first-column' instead of a literal zero.  See the node
-"(elisp) Mode-Specific Indent" in the ELisp manual for more details.
+the 'prog-indentation-context' variable.  To support this, modes
+should use 'prog-first-column' instead of a literal zero and never
+call 'widen' in their indentation functions.  See the node "(elisp)
+Mode-Specific Indent" in the ELisp manual for more details.
 
 ** ERC
 
diff --git a/lisp/indent.el b/lisp/indent.el
index d5ba0bd..ccf0e99 100644
--- a/lisp/indent.el
+++ b/lisp/indent.el
@@ -69,6 +69,8 @@ variable is `indent-relative' or `indent-relative-maybe', 
handle
 it specially (since those functions are used for tabbing); in
 that case, indent by aligning to the previous non-blank line."
   (interactive)
+  (save-restriction
+    (widen)
   (syntax-propertize (line-end-position))
   (if (memq indent-line-function
            '(indent-relative indent-relative-maybe))
@@ -84,7 +86,7 @@ that case, indent by aligning to the previous non-blank line."
            (indent-line-to column)
          (save-excursion (indent-line-to column))))
     ;; The normal case.
-    (funcall indent-line-function)))
+    (funcall indent-line-function))))
 
 (defun indent--default-inside-comment ()
   (unless (or (> (current-column) (current-indentation))
@@ -144,7 +146,9 @@ prefix argument is ignored."
           (indent--default-inside-comment)
           (when (or (<= (current-column) (current-indentation))
                     (not (eq tab-always-indent 'complete)))
-            (funcall (default-value 'indent-line-function))))
+            (save-restriction
+              (widen)
+              (funcall (default-value 'indent-line-function)))))
 
       (cond
        ;; If the text was already indented right, try completion.
@@ -538,7 +542,9 @@ column to indent to; if it is nil, use one of the three 
methods above."
          (forward-line 1)))))
    ;; Use indent-region-function is available.
    (indent-region-function
-    (funcall indent-region-function start end))
+    (save-restriction
+      (widen)
+      (funcall indent-region-function start end)))
    ;; Else, use a default implementation that calls indent-line-function on
    ;; each line.
    (t (indent-region-line-by-line start end)))
diff --git a/lisp/progmodes/prog-mode.el b/lisp/progmodes/prog-mode.el
index f727e45..b36d242 100644
--- a/lisp/progmodes/prog-mode.el
+++ b/lisp/progmodes/prog-mode.el
@@ -64,37 +64,13 @@ mode, it should bind this variable to non-nil around the 
call.
 
 The non-nil value should be a list of the form:
 
-   (FIRST-COLUMN (START . END) PREVIOUS-CHUNKS)
+   (FIRST-COLUMN ...REST)
 
 FIRST-COLUMN is the column the indentation engine of the sub-mode
 should use for top-level language constructs inside the code
 chunk (instead of 0).
 
-START and END specify the region of the code chunk.  END can be
-nil, which stands for the value of `point-max'.  The function
-`prog-widen' uses this to restore restrictions imposed by the
-sub-mode's indentation engine.
-
-PREVIOUS-CHUNKS, if non-nil, provides the indentation engine of
-the sub-mode with the virtual context of the code chunk.  Valid
-values are:
-
- - A string containing text which the indentation engine can
-   consider as standing in front of the code chunk.  To cache the
-   string's calculated syntactic information for repeated calls
-   with the same string, the sub-mode can add text-properties to
-   the string.
-
-   A typical use case is for grammars with code chunks which are
-   to be indented like function bodies -- the string would contain
-   the corresponding function preamble.
-
- - A function, to be called with the start position of the current
-   chunk.  It should return either the region of the previous chunk
-   as (PREV-START . PREV-END), or nil if there is no previous chunk.
-
-   A typical use case are literate programming sources -- the
-   function would successively return the previous code chunks.")
+REST is currently unused, but can be defined in future versions.")
 
 (defun prog-indent-sexp (&optional defun)
   "Indent the expression after point.
diff --git a/lisp/progmodes/python.el b/lisp/progmodes/python.el
index d4226e5..104889a 100644
--- a/lisp/progmodes/python.el
+++ b/lisp/progmodes/python.el
@@ -287,10 +287,6 @@
 ;;; 24.x Compat
 
 
-(unless (fboundp 'prog-widen)
-  (defun prog-widen ()
-    (widen)))
-
 (unless (fboundp 'prog-first-column)
   (defun prog-first-column ()
     0))
@@ -785,7 +781,7 @@ work on `python-indent-calculate-indentation' instead."
   (interactive)
   (save-excursion
     (save-restriction
-      (prog-widen)
+      (widen)
       (goto-char (point-min))
       (let ((block-end))
         (while (and (not block-end)
@@ -883,8 +879,6 @@ keyword
 :at-dedenter-block-start
  - Point is on a line starting a dedenter block.
  - START is the position where the dedenter block starts."
-  (save-restriction
-    (prog-widen)
     (let ((ppss (save-excursion
                   (beginning-of-line)
                   (syntax-ppss))))
@@ -1022,7 +1016,7 @@ keyword
                       (looking-at (python-rx block-ender)))
                     :after-block-end)
                    (t :after-line))
-             (point)))))))))
+             (point))))))))
 
 (defun python-indent--calculate-indentation ()
   "Internal implementation of `python-indent-calculate-indentation'.
@@ -1030,8 +1024,6 @@ May return an integer for the maximum possible 
indentation at
 current context or a list of integers.  The latter case is only
 happening for :at-dedenter-block-start context since the
 possibilities can be narrowed to specific indentation points."
-  (save-restriction
-    (prog-widen)
     (save-excursion
       (pcase (python-indent-context)
         (`(:no-indent . ,_) (prog-first-column)) ; usually 0
@@ -1081,7 +1073,7 @@ possibilities can be narrowed to specific indentation 
points."
         (`(,(or :inside-paren-newline-start-from-block) . ,start)
          ;; Add two indentation levels to make the suite stand out.
          (goto-char start)
-         (+ (current-indentation) (* python-indent-offset 2)))))))
+         (+ (current-indentation) (* python-indent-offset 2))))))
 
 (defun python-indent--calculate-levels (indentation)
   "Calculate levels list given INDENTATION.
@@ -4589,8 +4581,6 @@ To this:
 Optional argument INCLUDE-TYPE indicates to include the type of the defun.
 This function can be used as the value of `add-log-current-defun-function'
 since it returns nil if point is not inside a defun."
-  (save-restriction
-    (prog-widen)
     (save-excursion
       (end-of-line 1)
       (let ((names)
@@ -4644,7 +4634,7 @@ since it returns nil if point is not inside a defun."
             (and (= (current-indentation) 0) (throw 'exit t))))
         (and names
              (concat (and type (format "%s " type))
-                     (mapconcat 'identity names ".")))))))
+                     (mapconcat 'identity names "."))))))
 
 (defun python-info-current-symbol (&optional replace-self)
   "Return current symbol using dotty syntax.
@@ -4788,12 +4778,10 @@ likely an invalid python file."
   "Message the first line of the block the current statement closes."
   (let ((point (python-info-dedenter-opening-block-position)))
     (when point
-      (save-restriction
-        (prog-widen)
         (message "Closes %s" (save-excursion
                                (goto-char point)
                                (buffer-substring
-                                (point) (line-end-position))))))))
+                                (point) (line-end-position)))))))
 
 (defun python-info-dedenter-statement-p ()
   "Return point if current statement is a dedenter.
@@ -4809,8 +4797,6 @@ statement."
   "Return non-nil if current line ends with backslash.
 With optional argument LINE-NUMBER, check that line instead."
   (save-excursion
-    (save-restriction
-      (prog-widen)
       (when line-number
         (python-util-goto-line line-number))
       (while (and (not (eobp))
@@ -4819,14 +4805,12 @@ With optional argument LINE-NUMBER, check that line 
instead."
                   (not (equal (char-before (point)) ?\\)))
         (forward-line 1))
       (when (equal (char-before) ?\\)
-        (point-marker)))))
+        (point-marker))))
 
 (defun python-info-beginning-of-backslash (&optional line-number)
   "Return the point where the backslashed line start.
 Optional argument LINE-NUMBER forces the line number to check against."
   (save-excursion
-    (save-restriction
-      (prog-widen)
       (when line-number
         (python-util-goto-line line-number))
       (when (python-info-line-ends-backslash-p)
@@ -4835,15 +4819,13 @@ Optional argument LINE-NUMBER forces the line number to 
check against."
                  (python-syntax-context 'paren))
           (forward-line -1))
         (back-to-indentation)
-        (point-marker)))))
+        (point-marker))))
 
 (defun python-info-continuation-line-p ()
   "Check if current line is continuation of another.
 When current line is continuation of another return the point
 where the continued line ends."
   (save-excursion
-    (save-restriction
-      (prog-widen)
       (let* ((context-type (progn
                              (back-to-indentation)
                              (python-syntax-context-type)))
@@ -4869,7 +4851,7 @@ where the continued line ends."
                (python-util-forward-comment -1)
                (when (and (equal (1- line-start) (line-number-at-pos))
                           (python-info-line-ends-backslash-p))
-                 (point-marker))))))))
+                 (point-marker)))))))
 
 (defun python-info-block-continuation-line-p ()
   "Return non-nil if current line is a continuation of a block."
diff --git a/lisp/progmodes/ruby-mode.el b/lisp/progmodes/ruby-mode.el
index dc1b0f8..7c10114 100644
--- a/lisp/progmodes/ruby-mode.el
+++ b/lisp/progmodes/ruby-mode.el
@@ -1364,7 +1364,6 @@ delimiter."
                                              "\\)\\>")))
                     (eq (ruby-deep-indent-paren-p t) 'space)
                     (not (bobp)))
-                   (widen)
                    (goto-char (or begin parse-start))
                    (skip-syntax-forward " ")
                    (current-column))
diff --git a/lisp/vc/add-log.el b/lisp/vc/add-log.el
index 392147b..9da8abc 100644
--- a/lisp/vc/add-log.el
+++ b/lisp/vc/add-log.el
@@ -1133,6 +1133,8 @@ identifiers followed by `:' or `='.  See variables
 Has a preference of looking backwards."
   (condition-case nil
       (save-excursion
+        (save-restriction
+          (widen)
        (if add-log-current-defun-function
            (funcall add-log-current-defun-function)
          ;; If all else fails, try heuristics
@@ -1147,7 +1149,7 @@ Has a preference of looking backwards."
              (when (string-match "\\([^ \t\n\r\f].*[^ \t\n\r\f]\\)"
                                  result)
                (setq result (match-string-no-properties 1 result)))
-             result))))
+             result)))))
     (error nil)))
 
 (defvar change-log-get-method-definition-md)



reply via email to

[Prev in Thread] Current Thread [Next in Thread]