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

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

[elpa] externals/javaimp 80d4a95: Add interface abstract methods to imen


From: Filipp Gunbin
Subject: [elpa] externals/javaimp 80d4a95: Add interface abstract methods to imenu support
Date: Fri, 27 Aug 2021 15:28:22 -0400 (EDT)

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

    Add interface abstract methods to imenu support
---
 javaimp-parse.el | 55 +++++++++++++++++++++++++++++++++++--------------------
 javaimp-tests.el | 18 +++++++++++++++---
 javaimp.el       | 17 ++++++++++-------
 3 files changed, 60 insertions(+), 30 deletions(-)

diff --git a/javaimp-parse.el b/javaimp-parse.el
index 130edff..21bda4b 100644
--- a/javaimp-parse.el
+++ b/javaimp-parse.el
@@ -390,26 +390,40 @@ non-nil.  Resets this variable after parsing is done."
   (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
-                         (parent (javaimp--parse-scopes nil)))
-                (setf (javaimp-scope-parent scope) (javaimp--copy-scope 
parent))
-                (push scope res)))))))
+        (let ((enclosing (nth 1 (syntax-ppss))))
+          (when (and enclosing
+                     (javaimp--parse-rsb-keyword ";" nil t -1)
+                     ;; are we 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
+                       (parent (javaimp--parse-scopes nil)))
+              (setf (javaimp-scope-parent scope) (javaimp--copy-scope parent))
+              (push scope res))))))
     res))
 
-(defun javaimp--parse-abstract-interface-methods ()
-  ;; TODO
-  )
-
+(defun javaimp--parse-abstract-interface-methods (int-scope)
+  (let ((start (1+ (javaimp-scope-open-brace int-scope)))
+        (end (ignore-errors
+               (1- (scan-lists (javaimp-scope-open-brace int-scope) 1 0))))
+        res)
+    (when (and start end)
+      (goto-char end)
+      (while (and (> (point) start)
+                  (javaimp--parse-rsb-keyword ";" start t))
+        ;; are we in the same nest?
+        (if (= (nth 1 (syntax-ppss)) (javaimp-scope-open-brace int-scope))
+            (save-excursion
+              ;; now parse as normal method scope
+              (when-let ((scope (javaimp--parse-scope-method-or-stmt (point))))
+                (setf (javaimp-scope-parent scope) int-scope)
+                (push scope res)))
+          ;; we've entered another nest, go back to its start
+          (goto-char (nth 1 (syntax-ppss))))))
+    res))
 
 
 ;; Functions intended to be called from other parts of javaimp.
@@ -445,12 +459,13 @@ them should move point."
             (push scope res)))
         res))))
 
-(defun javaimp--parse-abstract-methods ()
+(defun javaimp--parse-abstract-methods (interfaces)
   (save-excursion
     (save-restriction
       (widen)
       (append (javaimp--parse-abstract-class-methods)
-              (javaimp--parse-abstract-interface-methods)))))
+              (seq-mapcat #'javaimp--parse-abstract-interface-methods
+                          interfaces)))))
 
 (defun javaimp--parse-update-dirty-pos (beg _end _old-len)
   "Function to add to `after-change-functions' hook."
diff --git a/javaimp-tests.el b/javaimp-tests.el
index 93dfcc4..0ad3fd8 100644
--- a/javaimp-tests.el
+++ b/javaimp-tests.el
@@ -314,11 +314,15 @@ package commented.block;
            ("baz()" . 1281)))
          ("IInner1"
           ("foo()" . 1603)
+          ("abstract_method()" . 1715)
           ("IInner1_CInner1"
            ("foo()" . 1798))
+          ("baz()" . 1934)
           ("defaultMethod(String)" . 1963)
           ("IInner1_IInner1"
-           ("defaultMethod(String)" . 2157)))
+           ("foo()" . 2122)
+           ("defaultMethod(String)" . 2157)
+           ("baz()" . 2258)))
          ("EnumInner1"
           ("EnumInner1()" . 2353)
           ("foo()" . 2399)
@@ -342,13 +346,17 @@ package commented.block;
     (javaimp-test--imenu-method-list
      '("foo() [Top.CInner1]"
        "foo() [Top.CInner1.CInner1_CInner1]"
-       "abstract_method()"
+       "abstract_method() [Top.CInner1.CInner1_CInner1]"
        "bar()"
-       "baz()"
+       "baz() [Top.CInner1.CInner1_CInner1]"
        "foo() [Top.IInner1]"
+       "abstract_method() [Top.IInner1]"
        "foo() [Top.IInner1.IInner1_CInner1]"
+       "baz() [Top.IInner1]"
        "defaultMethod(String) [Top.IInner1]"
+       "foo() [Top.IInner1.IInner1_IInner1]"
        "defaultMethod(String) [Top.IInner1.IInner1_IInner1]"
+       "baz() [Top.IInner1.IInner1_IInner1]"
        "EnumInner1()"
        "foo() [Top.EnumInner1]"
        "foo() [ColocatedTop]"
@@ -364,9 +372,13 @@ package commented.block;
        "Top.CInner1.CInner1_CInner1.bar()"
        "Top.CInner1.CInner1_CInner1.baz()"
        "Top.IInner1.foo()"
+       "Top.IInner1.abstract_method()"
        "Top.IInner1.IInner1_CInner1.foo()"
+       "Top.IInner1.baz()"
        "Top.IInner1.defaultMethod(String)"
+       "Top.IInner1.IInner1_IInner1.foo()"
        "Top.IInner1.IInner1_IInner1.defaultMethod(String)"
+       "Top.IInner1.IInner1_IInner1.baz()"
        "Top.EnumInner1.EnumInner1()"
        "Top.EnumInner1.foo()"
        "ColocatedTop.foo()"
diff --git a/javaimp.el b/javaimp.el
index cf77216..f4a4693 100644
--- a/javaimp.el
+++ b/javaimp.el
@@ -679,12 +679,11 @@ done in mode functions automatically."
             forest)))))
 
 (defun javaimp-imenu--get-forest ()
-  (let* ((scopes
-          (javaimp--parse-get-all-scopes
-           (lambda (scope)
-             (javaimp-test-scope-type scope
-               '(class interface enum method)
-               javaimp--classlike-scope-types))))
+  (let* ((scopes (javaimp--parse-get-all-scopes
+                  (lambda (scope)
+                    (javaimp-test-scope-type scope
+                      '(class interface enum method)
+                      javaimp--classlike-scope-types))))
          (methods (seq-filter
                    (lambda (scope)
                      (eq (javaimp-scope-type scope) 'method))
@@ -696,7 +695,11 @@ done in mode functions automatically."
          (top-classes (seq-filter (lambda (s)
                                     (null (javaimp-scope-parent s)))
                                   classes))
-         (abstract-methods (javaimp--parse-abstract-methods)))
+         (abstract-methods (javaimp--parse-abstract-methods
+                            (seq-filter
+                             (lambda (scope)
+                               (eq (javaimp-scope-type scope) 'interface))
+                             scopes))))
     (mapcar
      (lambda (top-class)
        (message "Building tree for top-level class-like scope: %s"



reply via email to

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