emacs-elpa-diffs
[Top][All Lists]
Advanced

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

[elpa] externals/javaimp a3bfdc2352 1/2: Clean up syntax / parsing setti


From: Filipp Gunbin
Subject: [elpa] externals/javaimp a3bfdc2352 1/2: Clean up syntax / parsing settings
Date: Fri, 13 May 2022 19:06:09 -0400 (EDT)

branch: externals/javaimp
commit a3bfdc2352197065bfc396ae85b2515980410da4
Author: Filipp Gunbin <fgunbin@fastmail.fm>
Commit: Filipp Gunbin <fgunbin@fastmail.fm>

    Clean up syntax / parsing settings
---
 javaimp-parse.el | 171 ++++++++++++++++++++++++++-----------------------------
 javaimp-tests.el |  11 ++++
 javaimp.el       |  10 ++++
 tests/imenu.el   |   8 +--
 tests/parse.el   |  22 +++----
 tests/tests.el   |   5 +-
 6 files changed, 115 insertions(+), 112 deletions(-)

diff --git a/javaimp-parse.el b/javaimp-parse.el
index 984dfa5579..0e1cb1350e 100644
--- a/javaimp-parse.el
+++ b/javaimp-parse.el
@@ -70,21 +70,19 @@ regexp.  First group is directive, second group is 
identifier."
   (javaimp-parse--directive-regexp "import\\(?:[[:space:]]+static\\)?"))
 
 
-(defvar javaimp-syntax-table
-  (make-syntax-table java-mode-syntax-table) ;TODO don't depend on cc-mode
-  "Javaimp syntax table")
-
-(defvar javaimp--arglist-syntax-table
-  (let ((st (make-syntax-table javaimp-syntax-table)))
+(defvar javaimp--parse-syntax-table
+  ;; TODO don't depend on cc-mode
+  (let ((st (make-syntax-table java-mode-syntax-table)))
+    ;; To be able to skip over generic types as over lists
     (modify-syntax-entry ?< "(>" st)
     (modify-syntax-entry ?> ")<" st)
-    (modify-syntax-entry ?. "_" st) ; separates parts of fully-qualified type
-    ;; Override prefix syntax so that scan-sexps right after @ in
-    ;; annotation doesn't ignore it.
+    ;; Dot separates parts of fully-qualified type
+    (modify-syntax-entry ?. "_" st) ;
+    ;; Override prefix syntax so that scan-sexps backwards right after
+    ;; @ in annotation doesn't ignore it.
     (modify-syntax-entry ?@ "_" st)
     st)
-  "Enables parsing angle brackets as lists")
-
+  "Syntax table used in parsing.")
 
 (defvar-local javaimp-parse--dirty-pos nil
   "Marker which points to a buffer position after which all parsed
@@ -123,7 +121,7 @@ non-nil, then name parsing is skipped."
   (let ((substr (buffer-substring-no-properties beg end)))
     (with-temp-buffer
       (insert substr)
-      (with-syntax-table javaimp--arglist-syntax-table
+      (with-syntax-table javaimp--parse-syntax-table
         (ignore-errors
           (let (res)
             (while (progn
@@ -237,7 +235,7 @@ is unchanged."
     (catch 'found
       (while (javaimp-parse--rsb-keyword regexp bound t)
         (let ((scan-pos (match-end 0)))
-          (with-syntax-table javaimp--arglist-syntax-table
+          (with-syntax-table javaimp--parse-syntax-table
             ;; Skip over any number of lists, which may be exceptions
             ;; in "throws", or something like that
             (while (and scan-pos (<= scan-pos brace-pos))
@@ -259,38 +257,37 @@ point (but not farther than BOUND).  Matches inside 
comments /
 strings are skipped.  Return the beginning of the match (then the
 point is also at that position) or nil (then the point is left
 unchanged)."
-  (with-syntax-table javaimp-syntax-table
-    (let ((state (syntax-ppss))
-          prev-semi pos res)
-      ;; Move out of any comment/string
-      (when (nth 8 state)
-       (goto-char (nth 8 state))
-       (setq state (syntax-ppss)))
-      ;; If we skip a previous scope (including unnamed initializers),
-      ;; or reach enclosing scope start, we'll fail the check in the
-      ;; below loop.  But a semicolon, which delimits statements, will
-      ;; just be skipped by scan-sexps, so find it and use as bound.
-      ;; If it is in another scope, that's not a problem, for the same
-      ;; reasons as described above.
-      (setq prev-semi (save-excursion
-                        (javaimp-parse--rsb-keyword ";" bound t))
-            bound (when (or bound prev-semi)
-                    (apply #'max
-                           (delq nil
-                                 (list bound
-                                       (and prev-semi (1+ prev-semi)))))))
-      ;; Go back by sexps
-      (with-syntax-table javaimp--arglist-syntax-table
-        (while (and (ignore-errors
-                      (setq pos (scan-sexps (point) -1)))
-                    (or (not bound) (>= pos bound))
-                    (or (member (char-after pos)
-                                '(?@ ?\( ;annotation type / args
-                                     ?<)) ;generic type
-                        ;; keyword / identifier first char
-                        (= (syntax-class (syntax-after pos)) 2))) ;word
-          (goto-char (setq res pos))))
-      res)))
+  (let ((state (syntax-ppss))
+        prev-semi pos res)
+    ;; Move out of any comment/string
+    (when (nth 8 state)
+      (goto-char (nth 8 state))
+      (setq state (syntax-ppss)))
+    ;; If we skip a previous scope (including unnamed initializers),
+    ;; or reach enclosing scope start, we'll fail the check in the
+    ;; below loop.  But a semicolon, which delimits statements, will
+    ;; just be skipped by scan-sexps, so find it and use as bound.
+    ;; If it is in another scope, that's not a problem, for the same
+    ;; reasons as described above.
+    (setq prev-semi (save-excursion
+                      (javaimp-parse--rsb-keyword ";" bound t))
+          bound (when (or bound prev-semi)
+                  (apply #'max
+                         (delq nil
+                               (list bound
+                                     (and prev-semi (1+ prev-semi)))))))
+    ;; Go back by sexps
+    (with-syntax-table javaimp--parse-syntax-table
+      (while (and (ignore-errors
+                    (setq pos (scan-sexps (point) -1)))
+                  (or (not bound) (>= pos bound))
+                  (or (memql (char-after pos)
+                             '(?@ ?\(    ;annotation type / args
+                                  ?<))   ;generic type
+                      ;; keyword / identifier first char
+                      (= (syntax-class (syntax-after pos)) 2))) ;word
+        (goto-char (setq res pos))))
+    res))
 
 
 ;;; Scopes
@@ -490,7 +487,6 @@ lambdas are also recognized as such."
                            :start nil)))
 
 
-
 (defun javaimp-parse--scopes (count)
   "Attempts to parse COUNT enclosing scopes at point.
 Returns most nested one, with its parents sets accordingly.  If
@@ -545,57 +541,57 @@ nothing."
         (setq res (cdr res)))
       parent)))
 
+
 (defun javaimp-parse--all-scopes ()
-  "Parses all scopes in this buffer which are after
+  "Parse all scopes in this buffer which are after
 `javaimp-parse--dirty-pos', if it points anywhere.  Makes it
-point nowhere when done."
-  (unless javaimp-parse--dirty-pos      ;init on first use
-    (setq javaimp-parse--dirty-pos (point-min-marker))
-    (javaimp-parse--setup-buffer))
+point nowhere when done.  All entry-point functions will usually
+call this function first."
+  (unless javaimp-parse--dirty-pos
+    (setq javaimp-parse--dirty-pos (point-min-marker)))
   (when (marker-position javaimp-parse--dirty-pos)
     (with-silent-modifications          ;we update only private props
       (remove-text-properties javaimp-parse--dirty-pos (point-max)
                               '(javaimp-parse-scope nil))
       (goto-char (point-max))
-      (let ((parse-sexp-ignore-comments t)
-            ;; Can be removed when we no longer rely on cc-mode
+      (let (;; Can be removed when we no longer rely on cc-mode
             (parse-sexp-lookup-properties nil))
-        (with-syntax-table javaimp-syntax-table
-          (while (javaimp-parse--rsb-keyword "{" javaimp-parse--dirty-pos t)
-            (save-excursion
-              (forward-char)
-              ;; Set props at this brace and all the way up
-              (javaimp-parse--scopes nil))))))
+        (while (javaimp-parse--rsb-keyword "{" javaimp-parse--dirty-pos t)
+          (save-excursion
+            (forward-char)
+            ;; Set props at this brace and all the way up
+            (javaimp-parse--scopes nil)))))
     (set-marker javaimp-parse--dirty-pos nil)))
 
-(defun javaimp-parse--setup-buffer ()
-  ;; FIXME This may be done in major/minor mode setup
-  (setq syntax-ppss-table javaimp-syntax-table)
-  (setq-local multibyte-syntax-as-symbol t)
-  (add-hook 'after-change-functions #'javaimp-parse--update-dirty-pos))
+(defun javaimp-parse--update-dirty-pos (beg _end _old-len)
+  "Function to add to `after-change-functions' hook."
+  (when (and javaimp-parse--dirty-pos
+             (or (not (marker-position javaimp-parse--dirty-pos))
+                 (< beg javaimp-parse--dirty-pos)))
+    (set-marker javaimp-parse--dirty-pos beg)))
+
 
 (defun javaimp-parse--enclosing-scope (&optional pred)
   "Return innermost enclosing scope matching PRED."
-  (with-syntax-table javaimp-syntax-table
-    (let ((state (syntax-ppss)))
-      ;; Move out of any comment/string
-      (when (nth 8 state)
-       (goto-char (nth 8 state))
-       (setq state (syntax-ppss)))
-      (catch 'found
-        (while t
-          (let ((res (save-excursion
-                       (javaimp-parse--scopes nil))))
-            (when (and (javaimp-scope-p res)
-                       (or (null pred)
-                           (funcall pred res)))
-              (throw 'found res))
-            ;; Go up until we get something
-            (if (nth 1 state)
-                (progn
-                  (goto-char (nth 1 state))
-                  (setq state (syntax-ppss)))
-              (throw 'found nil))))))))
+  (let ((state (syntax-ppss)))
+    ;; Move out of any comment/string
+    (when (nth 8 state)
+      (goto-char (nth 8 state))
+      (setq state (syntax-ppss)))
+    (catch 'found
+      (while t
+        (let ((res (save-excursion
+                     (javaimp-parse--scopes nil))))
+          (when (and (javaimp-scope-p res)
+                     (or (null pred)
+                         (funcall pred res)))
+            (throw 'found res))
+          ;; Go up until we get something
+          (if (nth 1 state)
+              (progn
+                (goto-char (nth 1 state))
+                (setq state (syntax-ppss)))
+            (throw 'found nil)))))))
 
 (defun javaimp-parse--class-abstract-methods ()
   (goto-char (point-max))
@@ -637,13 +633,6 @@ point nowhere when done."
           (goto-char (nth 1 (syntax-ppss))))))
     res))
 
-(defun javaimp-parse--update-dirty-pos (beg _end _old-len)
-  "Function to add to `after-change-functions' hook."
-  (when (and javaimp-parse--dirty-pos
-             (or (not (marker-position javaimp-parse--dirty-pos))
-                 (< beg javaimp-parse--dirty-pos)))
-    (set-marker javaimp-parse--dirty-pos beg)))
-
 
 ;; Functions intended to be called from other parts of javaimp.  They
 ;; do not preserve excursion / restriction - it's the caller's
diff --git a/javaimp-tests.el b/javaimp-tests.el
index 9542ae2774..4ca01ad20f 100644
--- a/javaimp-tests.el
+++ b/javaimp-tests.el
@@ -21,4 +21,15 @@ supplying that directory name as the only arg."
           (funcall handler tmpdir)
         (error "Cannot untar test data file %s: %d" filename rc)))))
 
+(defmacro javaimp-with-temp-buffer (file &rest body)
+  "Execute BODY in temporary buffer with `javaimp-minor-mode'
+turned on.  If FILE is non-nil then its contents are inserted."
+  (declare (debug t) (indent 1))
+  `(with-temp-buffer
+     (when ,file
+       (insert-file-contents (ert-resource-file ,file)))
+     (java-mode)
+     (javaimp-minor-mode)
+     ,@body))
+
 (provide 'javaimp-tests)
diff --git a/javaimp.el b/javaimp.el
index b281c3b430..5e9b2fb7f5 100644
--- a/javaimp.el
+++ b/javaimp.el
@@ -129,6 +129,7 @@
 ;; presented in a nested fashion, instead of a flat list (default is
 ;; flat list).
 
+
 ;;; Code:
 
 (require 'javaimp-util)
@@ -1224,6 +1225,7 @@ PREV-INDEX gives the index of the method itself."
   "C-M-a" #'beginning-of-defun
   "C-M-e" #'end-of-defun)
 
+
 ;;;###autoload
 (define-minor-mode javaimp-minor-mode
   "Javaimp minor mode.
@@ -1247,7 +1249,12 @@ defun javadoc to be included in the narrowed region when 
using
                       #'javaimp-end-of-defun)
         (add-function :override (local 'add-log-current-defun-function)
                       #'javaimp-add-log-current-defun)
+        (add-hook 'after-change-functions #'javaimp-parse--update-dirty-pos 
nil t)
         (add-hook 'xref-backend-functions #'javaimp-xref--backend nil t)
+        (setq-local parse-sexp-ignore-comments t)
+        (setq-local multibyte-syntax-as-symbol t)
+        ;; Discard parse state, if any
+        (setq javaimp-parse--dirty-pos nil)
         ;; There're spaces within generic types, just show them
         (setq-local imenu-space-replacement nil))
     (remove-function (local 'imenu-create-index-function)
@@ -1258,7 +1265,10 @@ defun javadoc to be included in the narrowed region when 
using
                      #'javaimp-end-of-defun)
     (remove-function (local 'add-log-current-defun-function)
                      #'javaimp-add-log-current-defun)
+    (remove-hook 'after-change-functions #'javaimp-parse--update-dirty-pos t)
     (remove-hook 'xref-backend-functions #'javaimp-xref--backend t)
+    (kill-local-variable 'parse-sexp-ignore-comments)
+    (kill-local-variable 'multibyte-syntax-as-symbol)
     (kill-local-variable 'imenu-space-replacement)))
 
 
diff --git a/tests/imenu.el b/tests/imenu.el
index f1d5d9ed83..cbf7fb3639 100644
--- a/tests/imenu.el
+++ b/tests/imenu.el
@@ -6,8 +6,8 @@
 ;; Maintainer: Filipp Gunbin <fgunbin@fastmail.fm>
 
 (require 'ert)
-(require 'ert-x)
 (require 'javaimp)
+(require 'javaimp-tests)
 
 (defun javaimp-test-imenu--simplify-entries (alist)
   (dolist (elt alist)
@@ -18,8 +18,7 @@
 
 
 (ert-deftest javaimp-imenu-create-index ()
-  (let ((actual (with-temp-buffer
-                  (insert-file-contents (ert-resource-file "test1.java"))
+  (let ((actual (javaimp-with-temp-buffer "test1.java"
                   (let ((imenu-use-markers nil))
                     (javaimp-imenu-create-index))))
         (expected-names
@@ -45,8 +44,7 @@
       (should (equal (nth i expected-names) (car (nth i actual)))))))
 
 (ert-deftest javaimp-imenu-create-index-use-sub-alists ()
-  (let ((actual (with-temp-buffer
-                  (insert-file-contents (ert-resource-file "test1.java"))
+  (let ((actual (javaimp-with-temp-buffer "test1.java"
                   (let ((imenu-use-markers nil)
                         (javaimp-imenu-use-sub-alists t))
                     (javaimp-imenu-create-index))))
diff --git a/tests/parse.el b/tests/parse.el
index 62f6abd180..b4c0b99121 100644
--- a/tests/parse.el
+++ b/tests/parse.el
@@ -6,9 +6,8 @@
 ;; Maintainer: Filipp Gunbin <fgunbin@fastmail.fm>
 
 (require 'ert)
-(require 'ert-x)
-(require 'javaimp-parse)
-(require 'javaimp-util)
+(require 'javaimp)
+(require 'javaimp-tests)
 
 ;; Tests for parse helpers
 
@@ -35,7 +34,7 @@
                    ("int" . "i")
                    ("String[][]" . "arr"))
                   ))
-    (with-temp-buffer
+    (javaimp-with-temp-buffer nil
       (insert (car data))
       (should (equal (javaimp-parse--arglist (point-min) (point-max))
                      (cdr data))))))
@@ -57,19 +56,18 @@
 Exception4<? super Exception5>>")
                    ("Exception6")
                    ("Exception7<Exception8>"))))
-    (with-temp-buffer
+    (javaimp-with-temp-buffer nil
       (insert (car data))
       (should (equal (javaimp-parse--arglist (point-min) (point-max) t)
                      (cdr data))))))
 
-
 
 ;; Tests for scope parsers
 
 (defun javaimp-test-parse--scope (parser &rest test-items)
   (declare (indent 1))
   (dolist (item test-items)
-    (with-temp-buffer
+    (javaimp-with-temp-buffer nil
       (insert (nth 0 item))
       (let* ((javaimp-parse--scope-hook
               (lambda (arg)
@@ -281,7 +279,7 @@ throws E1 {"
     (nreverse res)))
 
 (ert-deftest javaimp-parse-get-package ()
-  (with-temp-buffer
+  (javaimp-with-temp-buffer nil
     (insert "
   package  foo.bar.baz  ;
 //package commented.line;
@@ -292,7 +290,7 @@ package commented.block;
     (should (equal (javaimp-parse-get-package) "foo.bar.baz"))))
 
 (ert-deftest javaimp-parse-get-imports ()
-  (with-temp-buffer
+  (javaimp-with-temp-buffer nil
     (insert "
   import  some.class1  ;
 import  static  some.class.fun1;
@@ -316,8 +314,7 @@ import static some_class.fun_2; // comment
                ("some_class.fun_2" . static))))))
 
 (ert-deftest javaimp-parse-get-all-scopes ()
-  (with-temp-buffer
-    (insert-file-contents (ert-resource-file "test1.java"))
+  (javaimp-with-temp-buffer "test1.java"
     (should-not javaimp-parse--dirty-pos)
     ;;
     ;; parse full buffer
@@ -363,8 +360,7 @@ import static some_class.fun_2; // comment
            ;; eob
            ((goto-char (point-max))))))
     (dolist (testcase testcases)
-      (with-temp-buffer
-        (insert-file-contents (ert-resource-file "test1.java"))
+      (javaimp-with-temp-buffer "test1.java"
         (eval (car testcase))           ;move
         (should
          (equal (cdr testcase)
diff --git a/tests/tests.el b/tests/tests.el
index 02ee0ccffc..f25b114049 100644
--- a/tests/tests.el
+++ b/tests/tests.el
@@ -6,12 +6,11 @@
 ;; Maintainer: Filipp Gunbin <fgunbin@fastmail.fm>
 
 (require 'ert)
-(require 'ert-x)
 (require 'javaimp)
+(require 'javaimp-tests)
 
 (ert-deftest javaimp-collect-idents ()
-  (with-temp-buffer
-    (insert-file-contents (ert-resource-file "test1.java"))
+  (javaimp-with-temp-buffer "test1.java"
     (should (equal (mapcar #'javaimp--ident-to-fqcn
                            (javaimp--collect-idents
                             (javaimp-scope-defun-p) (current-buffer) t))



reply via email to

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