branch: externals/idlwave
commit e364df9db041913790074a1c3dcafe0f2ef08c67
Author: JD Smith <jdtsm...@gmail.com>
Commit: JD Smith <jdtsm...@gmail.com>

    Optimize long continue statement indentation.
    Overly permissive regexp in skip-multi-commands
    Eliminate multiple re-computation of end-of-statement in 
start-of-substatement
    and callees.
---
 idlwave.el | 21 ++++++++++++---------
 1 file changed, 12 insertions(+), 9 deletions(-)

diff --git a/idlwave.el b/idlwave.el
index 4a21b9dab1..8af69d3641 100644
--- a/idlwave.el
+++ b/idlwave.el
@@ -2616,13 +2616,13 @@ If not in a statement just moves to end of line.  
Returns position."
   (end-of-line)
   (point))
 
-(defun idlwave-next-statement ()
+(defun idlwave-next-statement (&optional eos)
   "Move point to beginning of the next IDL statement.
 Returns t if that statement is the last non-comment IDL statement
 in the file, and nil otherwise."
   (interactive)
   (let (last-statement)
-    (idlwave-end-of-statement)
+    (if eos (goto-char eos) (idlwave-end-of-statement))
     ;; skip blank lines, label lines, include lines and line comments
     (while (and (= (forward-line 1) 0)
                 ;; The current statement is the last statement until
@@ -2638,7 +2638,7 @@ in the file, and nil otherwise."
 (defun idlwave-skip-multi-commands (&optional lim)
   "Skip past multiple commands on a line (or multiple lines) (with `&')."
   (let ((save-point (point)))
-    (while (re-search-forward "[^&]*?\\(&\\)[^&]" lim t)
+    (while (re-search-forward "\\s-\\(&\\)[^&]" lim t)
       (backward-char)
       (if (and (not (idlwave-quoted))
               (not (eq (char-before (- (point) 1)) ?&)))
@@ -2646,7 +2646,7 @@ in the file, and nil otherwise."
     (goto-char save-point)
     save-point))
 
-(defun idlwave-skip-label-or-case ()
+(defun idlwave-skip-label-or-case (&optional eos)
   "Skip label or case statement element.
 Returns position after label.
 If there is no label point is not moved and nil is returned."
@@ -2660,7 +2660,7 @@ If there is no label point is not moved and nil is 
returned."
   ;; As many in this mode, this function is heuristic and not an exact
   ;; parser. 
   (let* ((start (point))
-        (eos (save-excursion (idlwave-end-of-statement) (point)))
+        (eos (or eos (save-excursion (idlwave-end-of-statement) (point))))
         (end (idlwave-find-key ":" 1 'nomark eos)))
     (if (and end
              (= (nth 0 (parse-partial-sexp start end)) 0)
@@ -2680,11 +2680,14 @@ Returns point at start of substatement modulo 
whitespace.
 If optional argument is non-nil move to beginning of current
 substatement."
   (let ((orig (point))
-        (eos (idlwave-end-of-statement))
-        (ifnest 0)
+        (eos (save-excursion (idlwave-end-of-statement) (point)))
+       (ifnest 0)
         st nst last)
     (idlwave-beginning-of-statement)
-    (idlwave-skip-label-or-case)
+    (setq last (point))
+    (idlwave-skip-label-or-case eos)
+    (if (and pre (> (point) orig)) ;; Previous statement isn't beyond point!
+       (goto-char last))
     (if (< (point) orig)
        (idlwave-skip-multi-commands orig))
     (setq last (point))
@@ -2700,7 +2703,7 @@ substatement."
              (setq ifnest (1- ifnest))
              (goto-char (match-end 0)))
             (t (setq ifnest 0)
-               (idlwave-next-statement))))
+               (idlwave-next-statement eos))))
     (if pre (goto-char last))
     ;; If a continuation line starts here, move to next line
     (when (looking-at "[ \t]*\\$\\([ \t]*\\(;\\|$\\)\\)")

Reply via email to