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

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

[elpa] externals/javaimp d7d4c72 1/2: Add class abstract methods to imen


From: Filipp Gunbin
Subject: [elpa] externals/javaimp d7d4c72 1/2: Add class abstract methods to imenu support
Date: Fri, 27 Aug 2021 13:48:23 -0400 (EDT)

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

    Add class abstract methods to imenu support
---
 javaimp-parse.el | 82 +++++++++++++++++++++++++++++++++++++-------------------
 javaimp-tests.el | 77 +++++++++++++++++++++++++---------------------------
 2 files changed, 91 insertions(+), 68 deletions(-)

diff --git a/javaimp-parse.el b/javaimp-parse.el
index d543a62..460e615 100644
--- a/javaimp-parse.el
+++ b/javaimp-parse.el
@@ -165,7 +165,7 @@ as for `re-search-backward'."
          (= (scan-lists (match-end 0) (or skip-count 1) -1)
             (1+ scope-start)))))
 
-(defun javaimp--parse-decl-suffix (regexp state &optional bound)
+(defun javaimp--parse-decl-suffix (regexp brace-pos &optional bound)
   "Attempts to parse declaration suffix backwards from point (but
 not farther than BOUND), returning non-nil on success.  More
 precisely, the value is the end of the match for REGEXP.  Point
@@ -178,10 +178,10 @@ is unchanged."
           (with-syntax-table javaimp--arglist-syntax-table
             ;; Skip over any number of lists, which may be exceptions
             ;; in "throws", or something like that
-            (while (and scan-pos (<= scan-pos (nth 1 state)))
+            (while (and scan-pos (<= scan-pos brace-pos))
               (if (ignore-errors
                     (= (scan-lists scan-pos 1 -1) ;As in 
javaimp--parse-preceding
-                       (1+ (nth 1 state))))
+                       (1+ brace-pos)))
                   (progn
                     (goto-char (match-beginning 0))
                     (throw 'found (match-end 0)))
@@ -203,21 +203,23 @@ is unchanged."
     javaimp--parse-scope-simple-stmt
     javaimp--parse-scope-method-or-stmt
     javaimp--parse-scope-unknown
-    ))
+    )
+  "List of parser functions, each of which is called with BRACE-POS,
+the position of opening brace.")
 
-(defun javaimp--parse-scope-class (state)
+(defun javaimp--parse-scope-class (brace-pos)
   "Attempts to parse 'class' / 'interface' / 'enum' scope.  Some of
 those may later become 'local-class' (see `javaimp--parse-scopes')."
   (save-excursion
-    (if (javaimp--parse-preceding (regexp-opt 
javaimp--parse-classlike-keywords 'words)
-                                  (nth 1 state))
+    (if (javaimp--parse-preceding (regexp-opt 
javaimp--parse-classlike-keywords 'symbols)
+                                  brace-pos)
         (let* ((keyword-start (match-beginning 1))
                (keyword-end (match-end 1))
                arglist)
-          (goto-char (nth 1 state))
-          (or (javaimp--parse-decl-suffix "\\<extends\\>" state keyword-end)
-              (javaimp--parse-decl-suffix "\\<implements\\>" state keyword-end)
-              (javaimp--parse-decl-suffix "\\<permits\\>" state keyword-end))
+          (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))
@@ -227,9 +229,9 @@ those may later become 'local-class' (see 
`javaimp--parse-scopes')."
                                         keyword-start keyword-end))
                                 :name (javaimp--parse-substr-before-< (caar 
arglist))
                                 :start keyword-start
-                                :open-brace (nth 1 state)))))))
+                                :open-brace brace-pos))))))
 
-(defun javaimp--parse-scope-simple-stmt (state)
+(defun javaimp--parse-scope-simple-stmt (brace-pos)
   "Attempts to parse 'simple-statement' scope."
   (save-excursion
     (and (javaimp--parse-skip-back-until)
@@ -243,9 +245,9 @@ those may later become 'local-class' (see 
`javaimp--parse-scopes')."
                     "lambda")
           :start (or (match-beginning 1)
                      (- (point) 2))
-          :open-brace (nth 1 state)))))
+          :open-brace brace-pos))))
 
-(defun javaimp--parse-scope-anonymous-class (state)
+(defun javaimp--parse-scope-anonymous-class (brace-pos)
   "Attempts to parse 'anonymous-class' scope."
   (save-excursion
     ;; skip arg-list and ws
@@ -257,16 +259,16 @@ those may later become 'local-class' (see 
`javaimp--parse-scopes')."
                   (scan-lists (point) -1 0))))
       (let ((end (point))
             start arglist)
-        (when (javaimp--parse-preceding "\\<new\\>" (nth 1 state) 2)
+        (when (javaimp--parse-preceding "\\_<new\\_>" brace-pos 2)
           (setq start (match-beginning 0)
                 arglist (javaimp--parse-arglist (match-end 0) end t))
           (when (= (length arglist) 1)
             (make-javaimp-scope :type 'anonymous-class
                                 :name (javaimp--parse-substr-before-< (caar 
arglist))
                                 :start start
-                                :open-brace (nth 1 state))))))))
+                                :open-brace brace-pos)))))))
 
-(defun javaimp--parse-scope-method-or-stmt (state)
+(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
@@ -276,9 +278,9 @@ those may later become 'local-class' (see 
`javaimp--parse-scopes')."
       (when search-bound
         (let ((throws-args
                (let ((pos (javaimp--parse-decl-suffix
-                           "\\<throws\\>" state search-bound)))
+                           "\\_<throws\\_>" brace-pos search-bound)))
                  (when pos
-                   (or (javaimp--parse-arglist pos (nth 1 state) t)
+                   (or (javaimp--parse-arglist pos brace-pos t)
                        t)))))
           (when (and (not (eq throws-args t))
                      (progn
@@ -312,9 +314,9 @@ those may later become 'local-class' (see 
`javaimp--parse-scopes')."
                                                           (cdr arglist-region))
                                   throws-args))
                  :start (point)
-                 :open-brace (nth 1 state))))))))))
+                 :open-brace brace-pos)))))))))
 
-(defun javaimp--parse-scope-array (state)
+(defun javaimp--parse-scope-array (brace-pos)
   "Attempts to parse 'array' scope."
   (save-excursion
     (and (javaimp--parse-skip-back-until)
@@ -322,14 +324,14 @@ those may later become 'local-class' (see 
`javaimp--parse-scopes')."
          (make-javaimp-scope :type 'array
                              :name ""
                              :start nil
-                             :open-brace (nth 1 state)))))
+                             :open-brace brace-pos))))
 
-(defun javaimp--parse-scope-unknown (state)
+(defun javaimp--parse-scope-unknown (brace-pos)
   "Catch-all parser which produces 'unknown' scope."
   (make-javaimp-scope :type 'unknown
                       :name "unknown"
                       :start nil
-                      :open-brace (nth 1 state)))
+                      :open-brace brace-pos))
 
 (defun javaimp--parse-scopes (count)
   "Attempts to parse COUNT enclosing scopes at point.  If COUNT is
@@ -347,7 +349,7 @@ nil then goes all the way up.  Examines and sets property
           (let ((scope (get-text-property (point) 'javaimp-parse-scope)))
             (unless scope
               (setq scope (run-hook-with-args-until-success
-                           'javaimp--parse-scope-hook state))
+                           'javaimp--parse-scope-hook (nth 1 state)))
               (put-text-property (point) (1+ (point))
                                  'javaimp-parse-scope scope))
             (push scope res)
@@ -390,6 +392,26 @@ non-nil.  Resets this variable after parsing is done."
               (javaimp--parse-scopes nil)))))
       (setq javaimp--parse-dirty-pos nil))))
 
+(defun javaimp--parse-abstract-class-methods ()
+  (goto-char (point-max))
+  (let (res)
+    (while (javaimp--parse-rsb-keyword "\\_<abstract\\_>" nil t)
+      (save-excursion
+        (save-match-data
+          (let ((enclosing (nth 1 (syntax-ppss))))
+            (when (and enclosing
+                       (javaimp--parse-rsb-keyword ";" nil t -1)
+                       ;; we're in the same nest
+                       (= (nth 1 (syntax-ppss)) enclosing))
+              (backward-char)     ;skip semicolon
+              ;; now parse as normal method scope
+              (when-let ((scope (javaimp--parse-scope-method-or-stmt (point)))
+                         ;; note that an abstract method with no parents
+                         ;; will be ignored
+                         (parents (javaimp--parse-scopes nil)))
+                (setf (javaimp-scope-parent scope) (car (last parents)))
+                (push scope res)))))))
+    res))
 
 
 ;; Functions intended to be called from other parts of javaimp.
@@ -418,12 +440,16 @@ non-nil.  Resets this variable after parsing is done."
          (classes (javaimp--parse-get-all-scopes #'javaimp--is-classlike))
          (top-classes (seq-filter (lambda (s)
                                     (null (javaimp-scope-parent s)))
-                                  classes)))
+                                  classes))
+         (ac-methods (javaimp--parse-abstract-class-methods)))
     (mapcar
      (lambda (top-class)
        (message "Building tree for top-level class-like scope: %s"
                 (javaimp-scope-name top-class))
-       (javaimp--build-tree top-class (append methods classes)
+       (javaimp--build-tree top-class
+                            (append methods
+                                    classes
+                                    ac-methods)
                             (lambda (el tested)
                               (equal el (javaimp-scope-parent tested)))
                             nil
diff --git a/javaimp-tests.el b/javaimp-tests.el
index cee91a2..06162fa 100644
--- a/javaimp-tests.el
+++ b/javaimp-tests.el
@@ -328,7 +328,9 @@ package commented.block;
           ("foo()" . 98)
           ("CInner1_CInner1"
            ("foo()" . 1099)
-           ("bar()" . 1192)))
+           ("abstract_method()" . 1148)
+           ("bar()" . 1192)
+           ("baz()" . 1281)))
          ("IInner1"
           ("foo()" . 1603)
           ("IInner1_CInner1"
@@ -353,42 +355,43 @@ package commented.block;
         (setcdr elt (nth 1 elt))
       (javaimp-test--imenu-simplify-entries (cdr elt)))))
 
-
 (ert-deftest javaimp-test--imenu-simple ()
   (let ((javaimp-format-method-name #'javaimp-format-method-name-types)
         (javaimp-imenu-group-methods nil))
-    (javaimp-test--imenu-method-list 0)))
+    (javaimp-test--imenu-method-list
+     '("foo() [Top.CInner1]"
+       "foo() [Top.CInner1.CInner1_CInner1]"
+       "abstract_method()"
+       "bar()"
+       "baz()"
+       "foo() [Top.IInner1]"
+       "foo() [Top.IInner1.IInner1_CInner1]"
+       "defaultMethod(String) [Top.IInner1]"
+       "defaultMethod(String) [Top.IInner1.IInner1_IInner1]"
+       "EnumInner1()"
+       "foo() [Top.EnumInner1]"
+       "foo() [ColocatedTop]"
+       "bar(String, String)"))))
 
 (ert-deftest javaimp-test--imenu-qualified ()
   (let ((javaimp-format-method-name #'javaimp-format-method-name-types)
         (javaimp-imenu-group-methods 'qualified))
-    (javaimp-test--imenu-method-list 1)))
-
-(defconst javaimp-test--imenu-method-list-expected
-  '(("foo() [Top.CInner1]"
-     "Top.CInner1.foo()" 98)
-    ("foo() [Top.CInner1.CInner1_CInner1]"
-     "Top.CInner1.CInner1_CInner1.foo()" 1099)
-    ("bar()"
-     "Top.CInner1.CInner1_CInner1.bar()" 1192)
-    ("foo() [Top.IInner1]"
-     "Top.IInner1.foo()" 1603)
-    ("foo() [Top.IInner1.IInner1_CInner1]"
-     "Top.IInner1.IInner1_CInner1.foo()" 1798)
-    ("defaultMethod(String) [Top.IInner1]"
-     "Top.IInner1.defaultMethod(String)" 1963)
-    ("defaultMethod(String) [Top.IInner1.IInner1_IInner1]"
-     "Top.IInner1.IInner1_IInner1.defaultMethod(String)" 2157)
-    ("EnumInner1()"
-     "Top.EnumInner1.EnumInner1()" 2353)
-    ("foo() [Top.EnumInner1]"
-     "Top.EnumInner1.foo()" 2399)
-    ("foo() [ColocatedTop]"
-     "ColocatedTop.foo()" 2554)
-    ("bar(String, String)"
-     "ColocatedTop.bar(String, String)" 2578)))
-
-(defun javaimp-test--imenu-method-list (exp-name-idx)
+    (javaimp-test--imenu-method-list
+     '("Top.CInner1.foo()"
+       "Top.CInner1.CInner1_CInner1.foo()"
+       "Top.CInner1.CInner1_CInner1.abstract_method()"
+       "Top.CInner1.CInner1_CInner1.bar()"
+       "Top.CInner1.CInner1_CInner1.baz()"
+       "Top.IInner1.foo()"
+       "Top.IInner1.IInner1_CInner1.foo()"
+       "Top.IInner1.defaultMethod(String)"
+       "Top.IInner1.IInner1_IInner1.defaultMethod(String)"
+       "Top.EnumInner1.EnumInner1()"
+       "Top.EnumInner1.foo()"
+       "ColocatedTop.foo()"
+       "ColocatedTop.bar(String, String)"))))
+
+(defun javaimp-test--imenu-method-list (expected-names)
   (let ((actual
          (with-temp-buffer
            (insert-file-contents
@@ -396,15 +399,9 @@ package commented.block;
            (setq syntax-ppss-table javaimp-syntax-table)
            (setq javaimp--parse-dirty-pos (point-min))
            (let ((imenu-use-markers nil))
-             (javaimp-imenu-create-index))))
-        (expected javaimp-test--imenu-method-list-expected))
-    (should (= (length expected) (length actual)))
-    (dotimes (i (length expected))
-      (let ((exp (nth i expected))
-            (act (nth i actual)))
-        ;; name
-        (should (equal (nth exp-name-idx exp) (nth 0 act)))
-        ;; pos
-        (should (= (nth 2 exp) (nth 1 act)))))))
+             (javaimp-imenu-create-index)))))
+    (should (= (length expected-names) (length actual)))
+    (dotimes (i (length expected-names))
+      (should (equal (nth i expected-names) (car (nth i actual)))))))
 
 (provide 'javaimp-tests)



reply via email to

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