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

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

[elpa] externals/phps-mode be00689e6f 119/135: Fixed sorting of imenu


From: Christian Johansson
Subject: [elpa] externals/phps-mode be00689e6f 119/135: Fixed sorting of imenu
Date: Sun, 29 Jan 2023 03:11:10 -0500 (EST)

branch: externals/phps-mode
commit be00689e6f2f654c45d39152f739f72b6d7ca0e4
Author: Christian Johansson <christian@cvj.se>
Commit: Christian Johansson <christian@cvj.se>

    Fixed sorting of imenu
---
 phps-mode-ast.el           | 92 ++++++++++++++++++++++++++++++++--------------
 phps-mode-parser-sdt.el    | 24 ++++--------
 test/phps-mode-test-ast.el |  2 +-
 3 files changed, 74 insertions(+), 44 deletions(-)

diff --git a/phps-mode-ast.el b/phps-mode-ast.el
index a6d9994243..7d4c4f18eb 100644
--- a/phps-mode-ast.el
+++ b/phps-mode-ast.el
@@ -82,38 +82,76 @@
       (maphash
        (lambda (k v)
          (if (hash-table-p v)
-             (let ((v-list))
+             (let ((v-list)
+                   (v-index))
                (maphash
                 (lambda (k2 v2)
                   (if (hash-table-p v2)
-                    (let ((v2-list))
-                      (maphash
-                       (lambda (k3 v3)
-                         (push
-                          `(,k3 . ,v3)
-                          v2-list))
-                       v2)
-                      (setq
-                       v2-list
-                       (sort
-                        v2-list
-                        (lambda (a b)
-                          (< (cdr a) (cdr b)))))
-                      (push
-                       `(,k2 ,v2-list)
-                       v-list))
-                    (push
-                     `(,k2 . ,v2)
-                     v-list)))
+                      (let ((v2-list)
+                            (v2-index))
+                        (maphash
+                         (lambda (k3 v3)
+                           (if (symbolp k3)
+                               (setq v2-index v3))
+                           (push
+                            `(,k3 . ,v3)
+                            v2-list))
+                         v2)
+
+                        ;; Sort level 3
+                        (setq
+                         v2-list
+                         (sort
+                          v2-list
+                          (lambda (a b)
+                            (< (cdr a) (cdr b)))))
+                        (push `(declaration . ,v2-index) v2-list)
+                        (push `(,k2 ,v2-list) v-list))
+                    (if (symbolp k2)
+                      (setq v-index v2)
+                      (push `(,k2 . ,v2) v-list))))
                 v)
-               ;; TODO Sort by index here
-               (push
-                `(,k ,v-list)
-                imenu-index))
-           (push
-            `(,k . ,v)
-            imenu-index)))
+
+               ;; Sort level 2
+               (setq
+                v-list
+                (sort
+                 v-list
+                 (lambda (a b)
+                   (cond
+                    ((and
+                      (listp (cdr a))
+                      (listp (cdr b)))
+                     (< (cdr (car (car (cdr a)))) (cdr (car (car (cdr b))))))
+                    ((listp (cdr a))
+                     (< (cdr (car (car (cdr a))) (cdr b))))
+                    ((listp (cdr b))
+                     (< (cdr a) (cdr (car (car (cdr b))))))
+                    (t
+                     (< (cdr a) (cdr b)))))))
+               (push `(declaration . ,v-index) v-list)
+               (push `(,k ,v-list) imenu-index))
+           (push `(,k . ,v) imenu-index)))
        phps-mode-parser-sdt-symbol-imenu--table)
+
+      ;; Sort level 1
+      (setq
+       imenu-index
+       (sort
+        imenu-index
+        (lambda (a b)
+          (cond
+           ((and
+             (listp (cdr a))
+             (listp (cdr b)))
+            (< (cdr (car (car (cdr a)))) (cdr (car (car (cdr b))))))
+           ((listp (cdr a))
+            (< (cdr (car (car (cdr a))) (cdr b))))
+           ((listp (cdr b))
+            (< (cdr a) (cdr (car (car (cdr b))))))
+           (t
+            (< (cdr a) (cdr b)))))))
+
       ;; TODO sort imenu-index here
       ;; (setq
       ;;  imenu-index
diff --git a/phps-mode-parser-sdt.el b/phps-mode-parser-sdt.el
index 2a471daf99..b58268f7e4 100644
--- a/phps-mode-parser-sdt.el
+++ b/phps-mode-parser-sdt.el
@@ -661,7 +661,9 @@
   (if (gethash
        name
        phps-mode-parser-sdt--bookkeeping--superglobal-variable-p)
-      name
+      (list
+       name
+       (list 'namespace nil 'class nil 'trait nil 'interface nil 'function nil 
'superglobal t))
     (let ((potential-uris (list ""))
           (scope-namespace)
           (scope-class)
@@ -1524,12 +1526,7 @@
                      (format
                       "%s (%d)"
                       symbol-uri
-                      (1+ (length (gethash symbol-uri 
phps-mode-parser-sdt-symbol-table-by-uri))))))
-                ;; TODO Place symbol in the correct place of the hierarchy here
-                ;; (push
-                ;;  `(,symbol-uri-duplicate . ,symbol-start)
-                ;;  phps-mode-parser-sdt-symbol-imenu)
-                )
+                      (1+ (length (gethash symbol-uri 
phps-mode-parser-sdt-symbol-table-by-uri)))))))
 
               (puthash
                phps-mode-parser-sdt-symbol-table-index
@@ -1545,11 +1542,6 @@
                 (list phps-mode-parser-sdt-symbol-table-index))
                phps-mode-parser-sdt-symbol-table-by-uri))
 
-          ;; TODO Place symbol at the correct place of the hierarchy here
-          ;; (push
-          ;;  `(,symbol-uri . ,symbol-start)
-          ;;  phps-mode-parser-sdt-symbol-imenu)
-
           (puthash
            phps-mode-parser-sdt-symbol-table-index
            (list
@@ -1570,10 +1562,10 @@
     (dolist (
              symbol-list
              phps-mode-parser-sdt--bookkeeping-symbol-stack)
-      (let* ((symbol-name (car symbol-list))
-             (symbol-scope (car (cdr symbol-list)))
-             (symbol-start (car (cdr (cdr symbol-list))))
-             (symbol-end (car (cdr (cdr (cdr symbol-list)))))
+      (let* ((symbol-name (nth 0 symbol-list))
+             (symbol-scope (nth 1 symbol-list))
+             (symbol-start (nth 2 symbol-list))
+             (symbol-end (nth 3 symbol-list))
              (symbol-uri-object
               (phps-mode-parser-sdt--get-symbol-uri
                symbol-name
diff --git a/test/phps-mode-test-ast.el b/test/phps-mode-test-ast.el
index 2d7d9ca4c4..1168b5f0fb 100644
--- a/test/phps-mode-test-ast.el
+++ b/test/phps-mode-test-ast.el
@@ -151,7 +151,7 @@
    "<?php\n\n$var2 = 4;\n\nfunction myFunction($var)\n{\n    $var3 = 3;\n    
if ($var) {\n        echo 'Hit';\n    }\n    if ($var2) {\n        echo 
'Miss';\n    }\n    if ($var3) {\n        echo 'Hit';\n    }\n}\n\nfunction 
myFunction2($abc)\n{\n    if ($var) {\n        echo 'Miss';\n    }\n    if 
($abc) {\n        echo 'Hit';\n    }\n}\n\nif ($var) {\n    echo 'Miss';\n}\nif 
($var2) {\n    echo 'Hit';\n}"
    "Bookkeeping in function level with variable assignments"
    '(((8 13) 1) ((40 44) 3) ((52 57) 2) ((71 75) 3) ((113 118) 0) ((157 162) 
2) ((216 220) 4) ((232 236) 0) ((275 279) 4) ((316 320) 0) ((347 352) 1))
-   '(("id $var2" . 8) ("function myFunction" ((declaration . 29) ("id $var" . 
40) ("id $var3" . 52)) ("function myFunction2" . ((declaration . 204) ("id 
$abc" . 216))))))
+   '(("$var2" . 8) ("function myFunction" ((declaration . 29) ("$var" . 40) 
("$var3" . 52))) ("function myFunction2" ((declaration . 204) ("$abc" . 216)))))
 
   (phps-mode-test-ast--should-bookkeep
    "<?php\n\n// Super-globals\n\nif ($_GET) {\n    echo 'Hit';\n}\nif ($_POST) 
{\n    echo 'Hit';\n}\nif ($_COOKIE) {\n    echo 'Hit';\n}\nif ($_SESSION) {\n  
  echo 'Hit';\n}\nif ($_REQUEST) {\n    echo 'Hit';\n}\nif ($GLOBALS) {\n    
echo 'Hit';\n}\nif ($_SERVER) {\n    echo 'Hit';\n}\nif ($_FILES) {\n    echo 
'Hit';\n}\nif ($_ENV) {\n    echo 'Hit';\n}\nif ($argc) {\n    echo 
'Hit';\n}\nif ($argv) {\n    echo 'Hit';\n}\nif ($http_​response_​header) {\n   
 echo 'Hit';\n}"



reply via email to

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