branch: externals/phps-mode commit dbd2825dffdd773f8ca3b4fbd07d3eab781a80bb Author: Christian Johansson <christ...@cvj.se> Commit: Christian Johansson <christ...@cvj.se>
Added unit test for multiple level namespaces and added support for it --- README.md | 2 +- phps-mode-functions.el | 15 +++++++-------- phps-mode-test-functions.el | 14 +++++++------- phps-mode.el | 4 ++-- 4 files changed, 17 insertions(+), 18 deletions(-) diff --git a/README.md b/README.md index 279e20c..cc4b280 100644 --- a/README.md +++ b/README.md @@ -16,12 +16,12 @@ This mode does not require PHP installed on your computer because it has a built * Lexer based on official PHP re2c lexer (100%) * Syntax coloring based on lexer tokens (100%) * PSR-1 and PSR-2 indentation based on lexer tokens (100%) -* Imenu support (90%) * Integration with `(electric-pair)` (100%) * Incremental lexer and syntax coloring after buffer changes (100%) * Incremental indentation and imenu calculation after buffer changes (100%) * Supports `(comment-region)` and `(uncomment-region)` (100%) * Travis support (100%) +* Imenu support (90%) * A set of heuristics to improve large-file incremental change handling (50%) * Wisent LALR parser based on official PHP yacc parser automatically converted grammar (50%) * Full integration with Emacs Semantic subsystem (30%) diff --git a/phps-mode-functions.el b/phps-mode-functions.el index 033de69..c85e366 100644 --- a/phps-mode-functions.el +++ b/phps-mode-functions.el @@ -250,17 +250,16 @@ ((string= token "{") (setq imenu-open-namespace-level imenu-nesting-level) - (setq imenu-in-namespace-declaration nil)) + (setq imenu-in-namespace-declaration nil) + (push `(,imenu-in-namespace-name . ,token-start) imenu-index)) ((string= token ";") - (setq imenu-in-namespace-declaration nil)) + (setq imenu-in-namespace-declaration nil) + (push `(,imenu-in-namespace-name . ,token-start) imenu-index)) - ((and (equal token 'T_STRING) - (not imenu-in-namespace-name)) - (let ((imenu-index-name (format "\\%s" (buffer-substring-no-properties token-start token-end))) - (imenu-index-pos token-start)) - (setq imenu-in-namespace-name imenu-index-name) - (push `(,imenu-index-name . ,imenu-index-pos) imenu-index))))) + ((and (or (equal token 'T_STRING) + (equal token 'T_NS_SEPARATOR)) + (setq imenu-in-namespace-name (concat imenu-in-namespace-name (buffer-substring-no-properties token-start token-end))))))) (imenu-in-class-declaration (cond diff --git a/phps-mode-test-functions.el b/phps-mode-test-functions.el index 4bea144..d613710 100644 --- a/phps-mode-test-functions.el +++ b/phps-mode-test-functions.el @@ -835,32 +835,32 @@ (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 with namespace, class and function" - (should (equal (phps-mode-functions-get-imenu) '(("\\myNamespace" . 17) ("\\myNamespace\\myClass" . 41) ("\\myNamespace\\myClass->myFunctionA()" . 75) ("\\myNamespace\\myClass->myFunctionB()" . 119))))) + (should (equal (phps-mode-functions-get-imenu) '(("myNamespace" . 29) ("myNamespace\\myClass" . 41) ("myNamespace\\myClass->myFunctionA()" . 75) ("myNamespace\\myClass->myFunctionB()" . 119))))) (phps-mode-test-with-buffer "<?php\nnamespace myNamespace;\nclass myClass {\n public function myFunctionA() {}\n protected function myFunctionB() {}\n}\n" "Imenu object-oriented file with bracket-less namespace, class and function" - (should (equal (phps-mode-functions-get-imenu) '(("\\myNamespace" . 17) ("\\myNamespace\\myClass" . 36) ("\\myNamespace\\myClass->myFunctionA()" . 66) ("\\myNamespace\\myClass->myFunctionB()" . 106))))) + (should (equal (phps-mode-functions-get-imenu) '(("myNamespace" . 28) ("myNamespace\\myClass" . 36) ("myNamespace\\myClass->myFunctionA()" . 66) ("myNamespace\\myClass->myFunctionB()" . 106))))) (phps-mode-test-with-buffer "<?php\nnamespace myNamespace {\n class myClass extends myAbstract {\n public function myFunctionA() {}\n protected function myFunctionB() {}\n }\n}\n" "Imenu object-oriented file with namespace, class that extends and functions" - (should (equal (phps-mode-functions-get-imenu) '(("\\myNamespace" . 17) ("\\myNamespace\\myClass" . 41) ("\\myNamespace\\myClass->myFunctionA()" . 94) ("\\myNamespace\\myClass->myFunctionB()" . 138))))) + (should (equal (phps-mode-functions-get-imenu) '(("myNamespace" . 29) ("myNamespace\\myClass" . 41) ("myNamespace\\myClass->myFunctionA()" . 94) ("myNamespace\\myClass->myFunctionB()" . 138))))) (phps-mode-test-with-buffer "<?php\nnamespace myNamespace;\nclass myClass extends myAbstract implements myInterface {\n public function myFunctionA() {}\n protected function myFunctionB() {}\n}\n" "Imenu object-oriented file with bracket-less namespace, class that extends and implements and functions" - (should (equal (phps-mode-functions-get-imenu) '(("\\myNamespace" . 17) ("\\myNamespace\\myClass" . 36) ("\\myNamespace\\myClass->myFunctionA()" . 108) ("\\myNamespace\\myClass->myFunctionB()" . 148))))) + (should (equal (phps-mode-functions-get-imenu) '(("myNamespace" . 28) ("myNamespace\\myClass" . 36) ("myNamespace\\myClass->myFunctionA()" . 108) ("myNamespace\\myClass->myFunctionB()" . 148))))) (phps-mode-test-with-buffer "<?php\nnamespace myNamespace;\nclass myClass extends myAbstract implements myInterface {\n public function myFunctionA($myArg = null) {}\n protected function myFunctionB($myArg = 'abc') {}\n}\n" "Imenu object-oriented file with bracket-less namespace, class that extends and implements and functions with optional arguments" - (should (equal (phps-mode-functions-get-imenu) '(("\\myNamespace" . 17) ("\\myNamespace\\myClass" . 36) ("\\myNamespace\\myClass->myFunctionA()" . 108) ("\\myNamespace\\myClass->myFunctionB()" . 161))))) + (should (equal (phps-mode-functions-get-imenu) '(("myNamespace" . 28) ("myNamespace\\myClass" . 36) ("myNamespace\\myClass->myFunctionA()" . 108) ("myNamespace\\myClass->myFunctionB()" . 161))))) (phps-mode-test-with-buffer "<?php\nnamespace myNamespace\\myNamespace2;\nclass myClass extends myAbstract implements myInterface {\n public function myFunctionA($myArg = null) {}\n protected function myFunctionB($myArg = 'abc') {}\n}\n" - "Imenu object-oriented file with bracket-less namespace, class that extends and implements and functions with optional arguments" - (should (equal (phps-mode-functions-get-imenu) '(("\\myNamespace\\myNamespace2" . 17) ("\\myNamespace\\myClass" . 50) ("\\myNamespace\\myClass->myFunctionA()" . 122) ("\\myNamespace\\myClass->myFunctionB()" . 175))))) + "Imenu object-oriented file with bracket-less namespace with multiple levels, class that extends and implements and functions with optional arguments" + (should (equal (phps-mode-functions-get-imenu) '(("myNamespace\\myNamespace2" . 41) ("myNamespace\\myNamespace2\\myClass" . 49) ("myNamespace\\myNamespace2\\myClass->myFunctionA()" . 121) ("myNamespace\\myNamespace2\\myClass->myFunctionB()" . 174))))) ) diff --git a/phps-mode.el b/phps-mode.el index d41b57f..ddd08ac 100644 --- a/phps-mode.el +++ b/phps-mode.el @@ -3,8 +3,8 @@ ;; Author: Christian Johansson <github.com/cjohansson> ;; Maintainer: Christian Johansson <github.com/cjohansson> ;; Created: 3 Mar 2018 -;; Modified: 20 Apr 2019 -;; Version: 0.2 +;; Modified: 4 May 2019 +;; Version: 0.2.1 ;; Keywords: tools, convenience ;; URL: https://github.com/cjohansson/emacs-phps-mode