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

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

[elpa] scratch/javaimp-wip 86cd3b9: wip


From: Filipp Gunbin
Subject: [elpa] scratch/javaimp-wip 86cd3b9: wip
Date: Fri, 30 Jul 2021 19:07:49 -0400 (EDT)

branch: scratch/javaimp-wip
commit 86cd3b9b9eb8f0da4d873cac2ead1475d2ed986f
Author: Filipp Gunbin <fgunbin@fastmail.fm>
Commit: Filipp Gunbin <fgunbin@fastmail.fm>

    wip
---
 javaimp-parse.el | 101 +++++++++++++++++++++++++++++++++++++------------------
 javaimp.el       |  20 +++++++++--
 2 files changed, 87 insertions(+), 34 deletions(-)

diff --git a/javaimp-parse.el b/javaimp-parse.el
index fca0369..db58e0e 100644
--- a/javaimp-parse.el
+++ b/javaimp-parse.el
@@ -335,6 +335,7 @@ those may later become 'local-class' (see 
`javaimp--parse-scopes')."
                    (javaimp--parse-skip-back-until)
                    (= (char-before) ?\)))
                  (ignore-errors
+                   ;; for method this is arglist
                    (goto-char
                     (scan-lists (point) -1 0))))
         (let* (;; leave open/close parens out
@@ -367,14 +368,14 @@ those may later become 'local-class' (see 
`javaimp--parse-scopes')."
   "Attempts to parse 'array' scope."
   (save-excursion
     (and (javaimp--parse-skip-back-until)
-         (member (char-before) '(?, ?{ ?\]))
+         (member (char-before) '(?, ?\]))
          (make-javaimp-scope :type 'array
                              :name ""
                              :start nil
                              :open-brace (nth 1 state)))))
 
 (defun javaimp--parse-scope-unknown (state)
-  "Catch-all parser which produces `unknown' scope."
+  "Catch-all parser which produces 'unknown' scope."
   (make-javaimp-scope :type 'unknown
                       :name "unknown"
                       :start nil
@@ -382,34 +383,50 @@ those may later become 'local-class' (see 
`javaimp--parse-scopes')."
 
 (defun javaimp--parse-scopes (count)
   "Attempts to parse COUNT enclosing scopes at point.  If COUNT is
-nil then goes all the way up."
-  (let ((state (syntax-ppss)) res)
+nil then goes all the way up.  Examines and sets property
+'javaimp-parse-scope' at each scope's open brace."
+  (let ((state (syntax-ppss))
+        res)
     (unless (syntax-ppss-context state)
-      (save-excursion
-        (while (and (nth 1 state)
-                    (or (not count)
-                        (>= (setq count (1- count)) 0)))
-          ;; find innermost enclosing open-bracket
-          (goto-char (nth 1 state))
-          (when (= (char-after) ?{)
-            (let ((scope (run-hook-with-args-until-success
-                          'javaimp--parse-scope-hook state)))
-              (push scope res)
-              (if (javaimp-scope-start scope)
-                  (goto-char (javaimp-scope-start scope)))))
-          (setq state (syntax-ppss)))))
+      (while (and (nth 1 state)
+                  (or (not count)
+                      (>= (setq count (1- count)) 0)))
+        ;; find innermost enclosing open-bracket
+        (goto-char (nth 1 state))
+        (when (= (char-after) ?{)
+          (let ((scope (get-text-property 'javaimp-parse-scope)))
+            (unless scope
+              (setq scope (run-hook-with-args-until-success
+                           'javaimp--parse-scope-hook state))
+              (put-text-property (point) (1+ (point))
+                                 'javaimp--parse-scope scope))
+            (push scope res)
+            (if (javaimp-scope-start scope)
+                (goto-char (javaimp-scope-start scope)))))
+        (setq state (syntax-ppss))))
     ;; if a class is enclosed in anything other than a class, then it
     ;; should be local
     (let ((tmp res)
           in-local)
       (while tmp
         (if (javaimp--parse-is-class (car tmp))
-            (if in-local
-                (setf (javaimp-scope-type (car tmp)) 'local-class))
+            (when in-local
+              (setf (javaimp-scope-type (car tmp)) 'local-class))
           (setq in-local t))
         (setq tmp (cdr tmp))))
     res))
 
+(defun javaimp--parse-all-scopes ()
+  "Parses all scopes in a buffer."
+  (goto-char (point-max))
+  (let ((parse-sexp-ignore-comments t)  ; FIXME remove with major mode
+        (parse-sexp-lookup-properties nil))
+    (while (javaimp--parse-rsb-keyword "{" nil t)
+      (save-excursion
+        (forward-char)
+        ;; Set props at this brace and all the way up
+        (javaimp--parse-scopes nil)))))
+
 
 
 ;; Main
@@ -422,18 +439,38 @@ nil then goes all the way up."
 
 (defun javaimp--parse-get-file-classes ()
   (goto-char (point-max))
-  (let (res)
-    (while (javaimp--parse-rsb-keyword
-            (regexp-opt javaimp--parse-class-keywords 'words) nil t)
-      (save-excursion
-        (let ((parse-sexp-ignore-comments t) ; FIXME remove with major mode
-              (parse-sexp-lookup-properties nil))
-          (when (and (ignore-errors
-                       (goto-char (scan-lists (point) 1 -1)))
-                     (= (char-before) ?{))
-            (let ((scopes (javaimp--parse-scopes nil)))
-              (when (seq-every-p #'javaimp--parse-is-class scopes)
-                (push (mapconcat #'javaimp-scope-name scopes ".") res)))))))
-    res))
+  (let (match res)
+    (while (setq match (text-property-search-backward
+                        'javaimp-parse-scope nil nil))
+      (when (javaimp--parse-is-class (prop-match-value match))
+        (push (mapconcat #'javaimp-scope-name
+                         (javaimp--parse-scopes nil)
+                         ".")
+              res)))))
+
+;; Imenu support
+
+(defun javaimp-imenu-create-index ()
+  (goto-char (point-max))
+  (let (match methods top-classes)
+    (while (setq match (text-property-search-backward
+                        'javaimp-parse-scope nil nil))
+      (let* ((scope (prop-match-value match))
+             (parent (javaimp--parse-scopes 1)))
+        (cond ((and (eq (javaimp-scope-type scope) 'method)
+                    (and parent (javaimp--parse-is-class parent)))
+               ;; TODO store parent location in scope?; reuse
+               ;; javaimp--build-tree; collect top-level classes
+               )
+               ;; TODO javaimp-imenu-group-methods - t / nil / qualified
+
+              ;; create sub-alist for each enclosing scope, which must be
+              ;; a class
+              ;;
+              ;; (INDEX-NAME . INDEX-POSITION)
+              ;; (MENU-TITLE . SUB-ALIST)
+
+              ;; TODO imenu function - to javaimp-scope-start, and 
back-to-indentation
+              )))))
 
 (provide 'javaimp-parse)
diff --git a/javaimp.el b/javaimp.el
index 8309d50..eb996f3 100644
--- a/javaimp.el
+++ b/javaimp.el
@@ -148,6 +148,18 @@ files in the current project and add their fully-qualified 
names
 to the completion alternatives list."
   :type 'boolean)
 
+(defcustom javaimp-imenu-group-methods t
+  "How to lay out methods in Imenu index.
+If t (the default), methods are grouped in their enclosing
+scopes.  nil means use just flat list of simple method names.
+`qualified' means use flat list where each method name is
+prepended with nested scopes.  See also
+`javaimp-parse-format-method-name'."
+  :type '(choice :tag "Group methods"
+                (const :tag "Group into enclosing scopes" t)
+                (const :tag "Flat list of simple name" nil)
+                (const :tag "Flat list of qualified names" qualified)))
+
 
 ;; Variables
 
@@ -423,13 +435,16 @@ prefix arg is given, don't do this filtering."
                               (directory-files-recursively dir 
"\\.java\\'")))))
 
 (defun javaimp--get-file-classes (file)
+  ;; TODO per-file cache (check file modification ts)
   (with-temp-buffer
     (insert-file-contents file)
     (let ((package (javaimp--parse-get-package)))
       (mapcar (lambda (class)
                 (if package
                     (concat package "." class)))
-              (javaimp--parse-get-file-classes)))))
+              (progn
+                (javaimp--parse-all-scopes)
+                (javaimp--parse-get-file-classes))))))
 
 
 ;; Organizing imports
@@ -603,7 +618,8 @@ which is first cleared."
   (interactive)
   (let* ((parse-sexp-ignore-comments t) ; FIXME remove with major mode
          (parse-sexp-lookup-properties nil)
-         (scopes (javaimp--parse-scopes nil))
+         (scopes (save-excursion
+                   (javaimp--parse-scopes nil)))
          (file buffer-file-name)
          (pos (point))
          (buf (get-buffer-create "*javaimp-scopes*")))



reply via email to

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