branch: externals/javaimp
commit 4036f526952307d71c9eac18ae4f9414cf62ff92
Author: Filipp Gunbin <fgun...@okko.tv>
Commit: Filipp Gunbin <fgun...@okko.tv>

    javaimp-parse.el: Remove save-excursion from parsers
---
 javaimp-parse.el | 208 +++++++++++++++++++++++++++----------------------------
 1 file changed, 104 insertions(+), 104 deletions(-)

diff --git a/javaimp-parse.el b/javaimp-parse.el
index a779c68a39..65a31cb422 100644
--- a/javaimp-parse.el
+++ b/javaimp-parse.el
@@ -210,68 +210,70 @@ is unchanged."
 ;;; Scopes
 
 (defvar javaimp--parse-scope-hook
-  '(javaimp--parse-scope-array
-    ;; anonymous-class should be before method/stmt because it looks
-    ;; similar, but with "new" in front
-    javaimp--parse-scope-anonymous-class
-    javaimp--parse-scope-class
-    javaimp--parse-scope-simple-stmt
-    javaimp--parse-scope-method-or-stmt
-    )
-  "List of parser functions, each of which is called with BRACE-POS,
-the position of opening brace.")
+  (mapcar (lambda (parser)
+            (lambda (arg)
+              (save-excursion
+                (funcall parser arg))))
+          '(javaimp--parse-scope-array
+            ;; anonymous-class should be before method/stmt because it
+            ;; looks similar, but with "new" in front
+            javaimp--parse-scope-anonymous-class
+            javaimp--parse-scope-class
+            javaimp--parse-scope-simple-stmt
+            javaimp--parse-scope-method-or-stmt
+            ))
+  "List of parser functions, each of which is called in
+`save-excursion' and with one argument, the position of opening
+brace.")
 
 (defun javaimp--parse-scope-class (brace-pos)
   "Attempts to parse 'class' / 'interface' / 'enum' scope."
-  (save-excursion
-    (when (javaimp--parse-preceding
-           (regexp-opt javaimp--parse-classlike-keywords 'symbols)
-           brace-pos
-           ;; closest preceding closing paren is a good bound
-           ;; because there _will be_ such char in frequent case
-           ;; of method/stmt
-           (save-excursion
-             (when (javaimp--parse-rsb-keyword ")" nil t 1)
-               (1+ (point)))))
-      (let* ((keyword-start (match-beginning 1))
-             (keyword-end (match-end 1))
-             arglist)
-        (goto-char brace-pos)
-        (or (javaimp--parse-decl-suffix "\\_<extends\\_>" brace-pos 
keyword-end)
-            (javaimp--parse-decl-suffix "\\_<implements\\_>" brace-pos 
keyword-end)
-            (javaimp--parse-decl-suffix "\\_<permits\\_>" brace-pos 
keyword-end))
-        ;; we either skipped back over the valid declaration
-        ;; suffix(-es), or there wasn't any
-        (setq arglist (javaimp--parse-arglist keyword-end (point) t))
-        (when (= (length arglist) 1)
-          (make-javaimp-scope :type (intern
-                                     (buffer-substring-no-properties
-                                      keyword-start keyword-end))
-                              :name (javaimp--parse-substr-before-< (caar 
arglist))
-                              :start keyword-start
-                              :open-brace brace-pos))))))
+  (when (javaimp--parse-preceding
+         (regexp-opt javaimp--parse-classlike-keywords 'symbols)
+         brace-pos
+         ;; closest preceding closing paren is a good bound
+         ;; because there _will be_ such char in frequent case
+         ;; of method/stmt
+         (save-excursion
+           (when (javaimp--parse-rsb-keyword ")" nil t 1)
+             (1+ (point)))))
+    (let* ((keyword-start (match-beginning 1))
+           (keyword-end (match-end 1))
+           arglist)
+      (goto-char brace-pos)
+      (or (javaimp--parse-decl-suffix "\\_<extends\\_>" brace-pos keyword-end)
+          (javaimp--parse-decl-suffix "\\_<implements\\_>" brace-pos 
keyword-end)
+          (javaimp--parse-decl-suffix "\\_<permits\\_>" brace-pos keyword-end))
+      ;; we either skipped back over the valid declaration
+      ;; suffix(-es), or there wasn't any
+      (setq arglist (javaimp--parse-arglist keyword-end (point) t))
+      (when (= (length arglist) 1)
+        (make-javaimp-scope :type (intern
+                                   (buffer-substring-no-properties
+                                    keyword-start keyword-end))
+                            :name (javaimp--parse-substr-before-< (caar 
arglist))
+                            :start keyword-start
+                            :open-brace brace-pos)))))
 
 (defun javaimp--parse-scope-simple-stmt (brace-pos)
   "Attempts to parse 'simple-statement' scope."
-  (save-excursion
-    (and (javaimp--parse-skip-back-until)
-         (or (and (= (char-before (1- (point))) ?-) ; ->
-                  (= (char-before) ?>))
-             (looking-back (regexp-opt javaimp--parse-stmt-keywords 'words)
-                           (- (point) javaimp--parse-stmt-keyword-maxlen) nil))
-         (make-javaimp-scope
-          :type 'simple-statement
-          :name (or (match-string 1)
-                    "lambda")
-          :start (or (match-beginning 1)
-                     (- (point) 2))
-          :open-brace brace-pos))))
+  (and (javaimp--parse-skip-back-until)
+       (or (and (= (char-before (1- (point))) ?-) ; ->
+                (= (char-before) ?>))
+           (looking-back (regexp-opt javaimp--parse-stmt-keywords 'words)
+                         (- (point) javaimp--parse-stmt-keyword-maxlen) nil))
+       (make-javaimp-scope
+        :type 'simple-statement
+        :name (or (match-string 1)
+                  "lambda")
+        :start (or (match-beginning 1)
+                   (- (point) 2))
+        :open-brace brace-pos)))
 
 (defun javaimp--parse-scope-anonymous-class (brace-pos)
   "Attempts to parse 'anonymous-class' scope."
-  (save-excursion
-    ;; skip arg-list and ws
-    (when (and (progn
+  ;; skip arg-list and ws
+  (when (and (progn
                  (javaimp--parse-skip-back-until)
                  (= (char-before) ?\)))
                (ignore-errors
@@ -286,63 +288,61 @@ the position of opening brace.")
             (make-javaimp-scope :type 'anonymous-class
                                 :name (javaimp--parse-substr-before-< (caar 
arglist))
                                 :start start
-                                :open-brace brace-pos)))))))
+                                :open-brace brace-pos))))))
 
 (defun javaimp--parse-scope-method-or-stmt (brace-pos)
   "Attempts to parse 'method' or 'statement' scope."
-  (save-excursion
-    (let (;; take the closest preceding closing paren as the bound
-          (throws-search-bound (save-excursion
-                                 (when (javaimp--parse-rsb-keyword ")" nil t 1)
-                                   (1+ (point))))))
-      (when throws-search-bound
-        (let ((throws-args
-               (when-let ((pos (javaimp--parse-decl-suffix
-                                "\\_<throws\\_>" brace-pos 
throws-search-bound)))
-                 (or (javaimp--parse-arglist pos brace-pos t)
-                     t))))
-          (when (and (not (eq throws-args t))
-                     (progn
-                       (javaimp--parse-skip-back-until)
-                       (= (char-before) ?\)))
-                     (ignore-errors
-                       ;; for method this is arglist
-                       (goto-char
-                        (scan-lists (point) -1 0))))
-            (let* (;; leave open/close parens out
-                   (arglist-region (cons (1+ (point))
-                                         (1- (scan-lists (point) 1 0))))
-                   (count (progn
-                            (javaimp--parse-skip-back-until)
-                            (skip-syntax-backward "w_")))
-                   (name (and (< count 0)
-                              (buffer-substring-no-properties
-                               (point) (+ (point) (abs count)))))
-                   (type (when name
-                           (if (and (member name javaimp--parse-stmt-keywords)
-                                    (not throws-args))
-                               'statement 'method))))
-              (when type
-                (make-javaimp-scope
-                 :type type
-                 :name (if (eq type 'method)
-                           (let ((args (javaimp--parse-arglist
-                                        (car arglist-region)
-                                        (cdr arglist-region))))
-                             (concat name "(" (mapconcat #'car args ",") ")"))
-                         name)
-                 :start (point)
-                 :open-brace brace-pos)))))))))
+  (let (;; take the closest preceding closing paren as the bound
+        (throws-search-bound (save-excursion
+                               (when (javaimp--parse-rsb-keyword ")" nil t 1)
+                                 (1+ (point))))))
+    (when throws-search-bound
+      (let ((throws-args
+             (when-let ((pos (javaimp--parse-decl-suffix
+                              "\\_<throws\\_>" brace-pos throws-search-bound)))
+               (or (javaimp--parse-arglist pos brace-pos t)
+                   t))))
+        (when (and (not (eq throws-args t))
+                   (progn
+                     (javaimp--parse-skip-back-until)
+                     (= (char-before) ?\)))
+                   (ignore-errors
+                     ;; for method this is arglist
+                     (goto-char
+                      (scan-lists (point) -1 0))))
+          (let* (;; leave open/close parens out
+                 (arglist-region (cons (1+ (point))
+                                       (1- (scan-lists (point) 1 0))))
+                 (count (progn
+                          (javaimp--parse-skip-back-until)
+                          (skip-syntax-backward "w_")))
+                 (name (and (< count 0)
+                            (buffer-substring-no-properties
+                             (point) (+ (point) (abs count)))))
+                 (type (when name
+                         (if (and (member name javaimp--parse-stmt-keywords)
+                                  (not throws-args))
+                             'statement 'method))))
+            (when type
+              (make-javaimp-scope
+               :type type
+               :name (if (eq type 'method)
+                         (let ((args (javaimp--parse-arglist
+                                      (car arglist-region)
+                                      (cdr arglist-region))))
+                           (concat name "(" (mapconcat #'car args ",") ")"))
+                       name)
+               :start (point)
+               :open-brace brace-pos))))))))
 
 (defun javaimp--parse-scope-array (brace-pos)
   "Attempts to parse 'array' scope."
-  (save-excursion
-    (and (javaimp--parse-skip-back-until)
-         (member (char-before) '(?, ?\]))
-         (make-javaimp-scope :type 'array
-                             :name ""
-                             :start nil
-                             :open-brace brace-pos))))
+  (and (javaimp--parse-skip-back-until)
+       (member (char-before) '(?, ?\]))
+       (make-javaimp-scope :type 'array
+                           :name ""
+                           :start nil
+                           :open-brace brace-pos)))
 
 (defun javaimp--parse-scopes (count)
   "Attempts to parse COUNT enclosing scopes at point.  Returns most

Reply via email to