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

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

[elpa] externals/phps-mode f7186a1 239/405: Preparations for hierarchica


From: Stefan Monnier
Subject: [elpa] externals/phps-mode f7186a1 239/405: Preparations for hierarchical imenu
Date: Sat, 13 Jul 2019 10:00:23 -0400 (EDT)

branch: externals/phps-mode
commit f7186a116a270eca77c4154def800827e878f48a
Author: Christian Johansson <address@hidden>
Commit: Christian Johansson <address@hidden>

    Preparations for hierarchical imenu
---
 phps-mode-functions.el      | 48 ++++++++++++++++++++++++++++++++++++++++-----
 phps-mode-test-functions.el | 11 +++++++++++
 2 files changed, 54 insertions(+), 5 deletions(-)

diff --git a/phps-mode-functions.el b/phps-mode-functions.el
index 798aee0..08b8604 100644
--- a/phps-mode-functions.el
+++ b/phps-mode-functions.el
@@ -626,47 +626,85 @@
     (when (boundp 'phps-mode-lexer-tokens)
       (let ((tokens phps-mode-lexer-tokens)
             (in-namespace-declaration nil)
+            (in-namespace-name nil)
+            (open-namespace-level nil)
             (in-class-declaration nil)
-            (in-function-declaration nil))
+            (open-class-level nil)
+            (in-class-name nil)
+            (in-function-declaration nil)
+            (open-function-level nil)
+            (nesting-level 0))
         (dolist (token tokens)
           (let ((token-symbol (car token))
                 (token-start (car (cdr token)))
                 (token-end (cdr (cdr token))))
+
+            (cond
+             ((string= token-symbol "{")
+              (setq nesting-level (1+ nesting-level)))
+             ((string= token-symbol "}")
+
+              (when (and open-namespace-level
+                         (= open-namespace-level nesting-level)
+                         in-namespace-name)
+                (setq in-namespace-name nil))
+
+              (when (and open-class-level
+                         (= open-class-level nesting-level)
+                         in-class-name)
+                (setq in-class-name nil))
+
+              (setq nesting-level (1- nesting-level))))
+            
             (cond
 
              (in-namespace-declaration
               (cond
 
-               ((or (string= token-symbol "{")
-                    (string= token-symbol ";"))
+               ((string= token-symbol "{")
+                (setq open-namespace-level nesting-level))
+
+               ((string= token-symbol ";")
                 (setq in-namespace-declaration nil))
 
                ((equal token-symbol 'T_STRING)
                 (let ((index-name (format "namespace %s" 
(buffer-substring-no-properties token-start token-end)))
                       (index-pos token-start))
+                  (setq in-namespace-name index-name)
                   (push `(,index-name . ,index-pos) index)))))
 
              (in-class-declaration
               (cond
 
                ((string= token-symbol "{")
+                (setq open-class-level nesting-level)
                 (setq in-class-declaration nil))
 
                ((equal token-symbol 'T_STRING)
                 (let ((index-name (format "class %s" 
(buffer-substring-no-properties token-start token-end)))
                       (index-pos token-start))
+                  (setq in-class-name index-name)
+                  (when in-namespace-name
+                    (setq index-name (concat in-namespace-name " | " 
index-name)))
                   (push `(,index-name . ,index-pos) index)))))
 
              (in-function-declaration
               (cond
 
-               ((or (string= token-symbol "{")
-                    (string= token-symbol ";"))
+               ((string= token-symbol "{")
+                (setq open-function-level nesting-level)
+                (setq in-function-declaration nil))
+
+               ((string= token-symbol ";")
                 (setq in-function-declaration nil))
 
                ((equal token-symbol 'T_STRING)
                 (let ((index-name (format "function %s" 
(buffer-substring-no-properties token-start token-end)))
                       (index-pos token-start))
+                  (when in-class-name
+                    (setq index-name (concat in-class-name " | " index-name)))
+                  (when in-namespace-name
+                    (setq index-name (concat in-namespace-name " | " 
index-name)))
                   (push `(,index-name . ,index-pos) index)))))
 
              (t
diff --git a/phps-mode-test-functions.el b/phps-mode-test-functions.el
index c889176..aca76ad 100644
--- a/phps-mode-test-functions.el
+++ b/phps-mode-test-functions.el
@@ -590,6 +590,17 @@
    "<?php\nfunction myFunctionA() {}\nfunction myFunctionB() {}\n"
    "Imenu function-oriented file"
    (should (equal (phps-mode-functions-imenu-create-index-function) 
'(("function myFunctionA" . 16) ("function myFunctionB" . 42)))))
+
+  (phps-mode-test-with-buffer
+   "<?php\nclass myClass {\n    public function myFunctionA() {}\n    
protected function myFunctionB() {}\n}\n"
+   "Imenu object-oriented file"
+   (should (equal (phps-mode-functions-imenu-create-index-function) '(("class 
myClass" . 13) ("class myClass | function myFunctionA" . 43) ("class myClass | 
function myFunctionB" . 83)))))
+
+  (phps-mode-test-with-buffer
+   "<?php\nnamespace myNamespace {\n    class myClass {\n        public 
function myFunctionA() {}\n        protected function myFunctionB() {}\n    
}\n}\n"
+   "Imenu object-oriented file"
+   (should (equal (phps-mode-functions-imenu-create-index-function) '(("class 
myClass" . 13) ("class myClass | function myFunctionA" . 43) ("class myClass | 
function myFunctionB" . 83)))))
+
   
   )
 



reply via email to

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