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

    More fighting the AST
---
 phps-mode-parser-sdt.el | 244 +++++++++++++++++++++++-------------------------
 1 file changed, 118 insertions(+), 126 deletions(-)

diff --git a/phps-mode-parser-sdt.el b/phps-mode-parser-sdt.el
index b58268f7e4..f2754a8277 100644
--- a/phps-mode-parser-sdt.el
+++ b/phps-mode-parser-sdt.el
@@ -878,7 +878,7 @@
   (when
       phps-mode-parser-sdt-symbol-imenu--namespace
     (message "phps-mode-parser-sdt-symbol-imenu--namespace: %S" 
phps-mode-parser-sdt-symbol-imenu--namespace)
-    (let ((imenu-nail (format "namespace %s" 
phps-mode-parser-sdt-symbol-imenu--namespace)))
+    (let ((imenu-nail (format "namespace %s" (nth 0 
phps-mode-parser-sdt-symbol-imenu--namespace))))
       (unless
           (gethash
            imenu-nail
@@ -888,10 +888,11 @@
          (make-hash-table :test 'equal)
          phps-mode-parser-sdt-symbol-imenu--table))))
 
+    (message "\nphps-mode-parser-sdt-symbol-imenu--stack: %S" 
phps-mode-parser-sdt-symbol-imenu--stack)
   (when phps-mode-parser-sdt-symbol-imenu--stack
     ;; Go through imenu stack and add new items to imenu index
-    (message "phps-mode-parser-sdt-symbol-imenu--stack: %S" 
phps-mode-parser-sdt-symbol-imenu--stack)
-    (let ((imenu-namespace)
+    (let ((imenu-namespace
+           phps-mode-parser-sdt-symbol-imenu--namespace)
           (imenu-class)
           (imenu-trait)
           (imenu-interface)
@@ -1132,6 +1133,8 @@
                phps-mode-parser-sdt-symbol-imenu--table)))))))
     (setq phps-mode-parser-sdt-symbol-imenu--stack nil))
 
+  (message "phps-mode-parser-sdt-symbol-imenu--table: %S" 
phps-mode-parser-sdt-symbol-imenu--table)
+
   ;; Parse bookkeeping writes and reads at every statement terminus
   (when phps-mode-parser-sdt--bookkeeping-symbol-assignment-stack
     ;; Declare variables
@@ -1164,6 +1167,9 @@
           (setq symbol-interface (car (nth 7 (nth 1 symbol-uri-object)))))
         (when (nth 9 (nth 1 symbol-uri-object))
           (setq symbol-function (car (nth 9 (nth 1 symbol-uri-object)))))
+
+        (message "symbol-name: %S" symbol-name)
+        (message "symbol-scope: %S" symbol-scope)
         (message "symbol-namespace: %S" symbol-namespace)
         (message "symbol-class: %S" symbol-class)
         (message "symbol-trait: %S" symbol-trait)
@@ -1889,7 +1895,8 @@
 ;; 83 ((top_statement_list) (top_statement_list top_statement))
 (puthash
  83
- (lambda(args _terminals) (if (car args) (append (car args) (cdr args)) (cdr 
args)))
+ (lambda(args _terminals)
+   (if (car args) (append (car args) (cdr args)) (cdr args)))
  phps-mode-parser--table-translations)
 
 ;; 84 ((top_statement_list) (%empty))
@@ -1899,11 +1906,65 @@
 (puthash
  85
  (lambda(args terminals)
-   args)
+   (let ((name args)
+         (index (car (cdr terminals))))
+
+     ;; Add to imenu if not there already
+     (let ((imenu-nail (format "namespace %s" name)))
+       (unless (gethash
+                imenu-nail
+                phps-mode-parser-sdt-symbol-imenu--table)
+         (let ((namespace-table (make-hash-table :test 'equal)))
+           (puthash
+            'declaration
+            index
+            namespace-table)
+           (puthash
+            imenu-nail
+            namespace-table
+            phps-mode-parser-sdt-symbol-imenu--table))))
+
+     (push
+      (list 'namespace name index)
+      phps-mode-parser-sdt--bookkeeping-namespace)
+     (setq
+      phps-mode-parser-sdt-symbol-imenu--namespace
+      (list name (car (cdr terminals))))
+
+     args))
  phps-mode-parser--table-translations)
 
 ;; 86 ((namespace_declaration_name) (T_NAME_QUALIFIED))
-(puthash 86 (lambda(_args terminals) terminals) 
phps-mode-parser--table-translations)
+(puthash
+ 86
+ (lambda(args terminals)
+   (let ((name args)
+         (index (car (cdr terminals))))
+
+     ;; Add to imenu if not there already
+     (let ((imenu-nail (format "namespace %s" name)))
+       (unless (gethash
+                imenu-nail
+                phps-mode-parser-sdt-symbol-imenu--table)
+         (let ((namespace-table (make-hash-table :test 'equal)))
+           (puthash
+            'declaration
+            index
+            namespace-table)
+           (puthash
+            imenu-nail
+            namespace-table
+            phps-mode-parser-sdt-symbol-imenu--table))))
+
+     (push
+      (list 'namespace name index)
+      phps-mode-parser-sdt--bookkeeping-namespace)
+     (setq
+      phps-mode-parser-sdt-symbol-imenu--namespace
+      (list name (car (cdr terminals))))
+
+     args))
+ phps-mode-parser--table-translations)
 
 ;; 87 ((namespace_name) (T_STRING))
 (puthash 87 (lambda(args _terminals) args) 
phps-mode-parser--table-translations)
@@ -2037,7 +2098,7 @@
    args)
  phps-mode-parser--table-translations)
 
-;; 109 ((top_statement) (attributed_statement))
+;; 109 ((top_statement) (attributes attributed_statement))
 (puthash
  109
  (lambda(args _terminals)
@@ -2057,131 +2118,44 @@
 (puthash
  111
  (lambda(args terminals)
-   (let ((name (nth 1 args))
-         (index (car (cdr (nth 1 terminals))))
-         (start (car (cdr (nth 2 terminals))))
-         (end (point-max)))
-
-     ;; Add to imenu if not there already
-     (let ((imenu-nail (format "namespace %s" name)))
-       (unless (gethash
-                imenu-nail
-                phps-mode-parser-sdt-symbol-imenu--table)
-         (let ((namespace-table (make-hash-table :test 'equal)))
-           (puthash
-            'declaration
-            index
-            namespace-table)
-           (puthash
-            imenu-nail
-            namespace-table
-            phps-mode-parser-sdt-symbol-imenu--table))))
-
-     (phps-mode-parser-sdt--parse-top-statement)
-     (push
-      (list 'namespace namespace-name start end)
-      phps-mode-parser-sdt--bookkeeping-namespace)
-     (setq
-      phps-mode-parser-sdt-symbol-imenu--namespace
-      name)
-     `(
-       ast-type
-       namespace
-       ast-name
-       ,name
-       ast-index
-       ,index
-       ast-start
-       ,start
-       ast-end
-       ,end)))
+   (phps-mode-parser-sdt--parse-top-statement)
+   `(
+     ast-type
+     namespace
+     ast-name
+     ,name
+     ast-index
+     ,index
+     ast-start
+     ,start
+     ast-end
+     ,end))
  phps-mode-parser--table-translations)
 
 ;; 112 top_statement -> (T_NAMESPACE namespace_declaration_name "{" 
top_statement_list "}")
 (puthash
  112
  (lambda(args terminals)
-   (let ((name (nth 1 args))
-         (index (car (cdr (nth 1 terminals))))
-         (start (car (cdr (nth 2 terminals))))
-         (end (car (cdr (nth 4 terminals)))))
-
-     ;; Add to imenu if not there already
-     (let ((imenu-nail (format "namespace %s" name)))
-       (unless (gethash
-                imenu-nail
-                phps-mode-parser-sdt-symbol-imenu--table)
-         (let ((namespace-table (make-hash-table :test 'equal)))
-           (puthash
-            'declaration
-            index
-            namespace-table)
-           (puthash
-            imenu-nail
-            namespace-table
-            phps-mode-parser-sdt-symbol-imenu--table))))
-
-     ;; Add namespace to all imenu stack items
-     (when phps-mode-parser-sdt-symbol-imenu--stack
-       (dolist (item phps-mode-parser-sdt-symbol-imenu--stack)
-         (let ((item-start (nth 2 item))
-               (item-end (nth 3 item)))
-           (when (and
-                  (>= item-start start)
-                  (<= item-end end))
-             (setcar
-              (list 'namespace name start end)
-              item)))))
-
-     ;; Add namespace to all symbols in scope (start, end) here
-     (when phps-mode-parser-sdt--bookkeeping-symbol-assignment-stack
-       (dolist (
-                symbol-list
-                phps-mode-parser-sdt--bookkeeping-symbol-assignment-stack)
-         (let ((symbol-name (car symbol-list)))
-           (unless (gethash
-                    symbol-name
-                    phps-mode-parser-sdt--bookkeeping--superglobal-variable-p)
-             (let ((symbol-scope (car (cdr symbol-list))))
-               (push
-                (list 'namespace name start end)
-                symbol-scope)
-               (setcar
-                (cdr symbol-list)
-                symbol-scope))))))
-
-     (when phps-mode-parser-sdt--bookkeeping-symbol-stack
-       (dolist (
-                symbol-list
-                phps-mode-parser-sdt--bookkeeping-symbol-stack)
-         (let ((symbol-name (car symbol-list))
-               (symbol-scope (car (cdr symbol-list))))
-           (unless (gethash
-                    symbol-name
-                    phps-mode-parser-sdt--bookkeeping--superglobal-variable-p)
-             (let ((symbol-scope (car (cdr symbol-list))))
-               (push
-                (list 'namespace name start end)
-                symbol-scope)
-               (setcar
-                (cdr symbol-list)
-                symbol-scope))))))
-
-     (phps-mode-parser-sdt--parse-top-statement)
-     (setq phps-mode-parser-sdt--bookkeeping-namespace nil)
-     `(
-       ast-type
-       namespace
-       ast-name
-       ,name
-       ast-index
-       ,index
-       ast-start
-       ,start
-       ast-end
-       ,end
-       top-statement-list
-       ,(nth 3 args))))
+   (phps-mode-parser-sdt--parse-top-statement)
+   (setq
+    phps-mode-parser-sdt-symbol-imenu--namespace
+    nil)
+   (setq
+    phps-mode-parser-sdt--bookkeeping-namespace
+    nil)
+   `(
+     ast-type
+     namespace
+     ast-name
+     ,name
+     ast-index
+     ,index
+     ast-start
+     ,start
+     ast-end
+     ,end
+     top-statement-list
+     ,(nth 3 args)))
  phps-mode-parser--table-translations)
 
 ;; 113 top_statement -> (T_NAMESPACE "{" top_statement_list "}")
@@ -3145,6 +3119,24 @@
    (let ((class-name (nth 1 args))
          (class-start (car (cdr (nth 1 terminals))))
          (class-end (cdr (cdr (nth 7 terminals)))))
+
+     ;; Add class scope to all functions in class
+     (when phps-mode-parser-sdt-symbol-imenu--stack
+       (dolist (item phps-mode-parser-sdt-symbol-imenu--stack)
+         (let ((item-start (nth 2 item))
+               (item-end (nth 3 item)))
+           (when (and
+                  (>= item-start class-start)
+                  (<= item-end class-end))
+             (setcar
+              item
+              (list 'class class-name class-start class-end))))))
+
+     ;; Add class to imenu stack
+     (push
+      (list 'class class-name class-start class-end)
+      phps-mode-parser-sdt-symbol-imenu--stack)
+
      (when phps-mode-parser-sdt--bookkeeping-symbol-assignment-stack
        (dolist (
                 symbol-list

Reply via email to