branch: externals/javaimp commit 80d4a95f7244904ff6eb7a9ec024c91abfe68579 Author: Filipp Gunbin <fgun...@fastmail.fm> Commit: Filipp Gunbin <fgun...@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"