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

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

[elpa] scratch/javaimp-wip 52c6c71b93: *** empty log message ***


From: Filipp Gunbin
Subject: [elpa] scratch/javaimp-wip 52c6c71b93: *** empty log message ***
Date: Thu, 14 Apr 2022 22:06:58 -0400 (EDT)

branch: scratch/javaimp-wip
commit 52c6c71b93ee165b757aa7b22c6044621377d68f
Author: Filipp Gunbin <fgunbin@okko.tv>
Commit: Filipp Gunbin <fgunbin@okko.tv>

    *** empty log message ***
---
 javaimp-parse.el | 45 +++++++++++++++++++++++++++++++++---
 javaimp.el       | 69 +++++++++++++++++++++++++++++++++++++-------------------
 2 files changed, 88 insertions(+), 26 deletions(-)

diff --git a/javaimp-parse.el b/javaimp-parse.el
index 65a31cb422..a07c059267 100644
--- a/javaimp-parse.el
+++ b/javaimp-parse.el
@@ -374,6 +374,7 @@ it's set to 'unknown' too."
                        (javaimp-scope-start scope))
               (goto-char (javaimp-scope-start scope)))))
         (setq state (syntax-ppss))))
+    ;; FIXME don't do this every time
     (let (parent reset-tail)
       (while res
         (if reset-tail
@@ -391,9 +392,9 @@ it's set to 'unknown' too."
       parent)))
 
 (defun javaimp--parse-all-scopes ()
-  "Entry point to the scope parsing.  Parses scopes in this buffer
-which are after `javaimp--parse-dirty-pos', if it points
-anywhere.  Makes it point nowhere when done."
+  "Parses 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
     (setq javaimp--parse-dirty-pos (point-min-marker))
     (javaimp--parse-setup-buffer))
@@ -419,6 +420,33 @@ anywhere.  Makes it point nowhere when done."
   (setq-local multibyte-syntax-as-symbol t)
   (add-hook 'after-change-functions #'javaimp--parse-update-dirty-pos))
 
+(defun javaimp--parse-enclosing-scope (&optional pred)
+  "Return innermost enclosing scope matching PRED.  This function
+is intended to use already set properties."
+  (when (or (not javaimp--parse-dirty-pos)
+            (marker-position javaimp--parse-dirty-pos))
+    (error "Call javaimp--parse-all-scopes first"))
+  (with-syntax-table javaimp-syntax-table
+    (let ((state (syntax-ppss)))
+      ;; Move out of any comment/string
+      (when (nth 8 ppss)
+       (goto-char (nth 8 ppss))
+       (setq state (syntax-ppss)))
+      ;; Go up until we get something
+      (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))
+            (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))
   (let (res)
@@ -518,6 +546,17 @@ them should move point."
         (push scope res)))
     res))
 
+(defun javaimp--parse-get-enclosing-scope (&optional pred parent-pred)
+  "Return innermost enclosing scope at point which satisfies PRED,
+with parents filtered by PARENT-PRED."
+  (save-excursion
+    (javaimp--parse-all-scopes))
+  (when-let ((scope (javaimp--parse-enclosing-scope pred)))
+    (setq scope (javaimp--copy-scope scope))
+    (when parent-pred
+      (javaimp--filter-scope-parents scope parent-pred))
+    scope))
+
 (defun javaimp--parse-get-class-abstract-methods ()
   (javaimp--parse-all-scopes)
   (javaimp--parse-class-abstract-methods))
diff --git a/javaimp.el b/javaimp.el
index 43b9cbd38b..81d9d6d11d 100644
--- a/javaimp.el
+++ b/javaimp.el
@@ -573,11 +573,7 @@ If there's no such directive, then the last resort is just
   "Return fully-qualified names of all class-like scopes in the
 current buffer."
   (let ((package (javaimp--parse-get-package))
-        (scopes (javaimp--parse-get-all-scopes
-                 (lambda (scope)
-                   (javaimp-test-scope-type scope
-                     javaimp--classlike-scope-types
-                     javaimp--classlike-scope-types)))))
+        (scopes (javaimp--get-defun-scopes t)))
     (mapcar (lambda (class)
               (if package
                   (concat package "." class)
@@ -721,19 +717,15 @@ in a major mode hook."
               entries)))))
 
 (defun javaimp-imenu--get-forest ()
-  (let* ((scopes (javaimp--parse-get-all-scopes
-                  (lambda (scope)
-                    (javaimp-test-scope-type scope
-                      `(,@ javaimp--classlike-scope-types method)
-                      javaimp--classlike-scope-types))))
+  (let* ((defun-scopes (javaimp--get-defun-scopes))
          (methods (seq-filter
                    (lambda (scope)
                      (eq (javaimp-scope-type scope) 'method))
-                   scopes))
+                   defun-scopes))
          (classes (seq-filter
                    (lambda (scope)
                      (not (eq (javaimp-scope-type scope) 'method)))
-                   scopes))
+                   defun-scopes))
          (top-classes (seq-filter (lambda (s)
                                     (null (javaimp-scope-parent s)))
                                   classes))
@@ -816,22 +808,14 @@ opening brace."
 (define-derived-mode javaimp-show-scopes-mode special-mode "Javaimp Show 
Scopes"
   (setq next-error-function #'javaimp-show-scopes-next-error))
 
-(defun javaimp-show-scopes (&optional show-all)
-  "Show scopes in *javaimp-scopes* buffer, with clickable text.
-By default, the scopes are only those which appear in
-Imenu (`javaimp-imenu-create-index' is responsible for that), but
-with prefix arg, show all scopes."
+(defun javaimp-show-scopes ()
+  "Show scopes in *javaimp-scopes* buffer."
   (interactive "P")
   (let ((scopes
          (save-excursion
            (save-restriction
              (widen)
-             (javaimp--parse-get-all-scopes
-              (unless show-all
-                (lambda (scope)
-                  (javaimp-test-scope-type scope
-                    `(,@ javaimp--classlike-scope-types method)
-                    javaimp--classlike-scope-types)))))))
+             (javaimp--get-defun-scopes))))
         (source-buf (current-buffer))
         (source-default-dir default-directory)
         (buf (get-buffer-create "*javaimp-scopes*")))
@@ -890,6 +874,35 @@ with prefix arg, show all scopes."
 
 
 
+;; Navigation
+
+(defun javaimp-beginning-of-defun (arg)
+  "Function to be used as `beginning-of-defun-function'."
+  (unless (zerop arg)
+    (let (enclosing scopes)
+      (save-excursion
+        (save-restriction
+          (widen)
+          ;; TODO pass pred
+          (setq enclosing (javaimp--parse-get-enclosing-scope)
+                ;; TODO leave only enclosing's siblings
+                scopes (javaimp--get-defun-scopes))))
+      ;; TODO leave siblings from enclosing in scopes; take ARGth
+      ;; relative sibling;
+
+      ;; ? if not found
+      (goto-char (if (< 0 arg)
+                     (point-min)
+                   (point-max)))
+    (zerop arg))))
+
+(defun javaimp-end-of-defun ()
+  "Function to be used as `end-of-defun-function'."
+  ;; TODO where we start?
+  )
+
+
+
 ;; Misc
 
 (defun javaimp-flush-cache ()
@@ -898,6 +911,16 @@ with prefix arg, show all scopes."
   (setq javaimp-jar-file-cache nil
         javaimp-source-file-cache nil))
 
+
+;; TODO cache
+(defun javaimp--get-defun-scopes (&optional only-classes)
+  (let ((types (append javaimp--classlike-scope-types
+                       (unless only-classes '(method)))))
+    (javaimp--parse-get-all-scopes
+     (lambda (scope)
+       (javaimp-test-scope-type scope
+         types javaimp--classlike-scope-types)))))
+
 (provide 'javaimp)
 
 ;;; javaimp.el ends here



reply via email to

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