branch: externals/phps-mode commit 8f3ada6f51c0a45f37009fb3957567005fcebf4b Author: Christian Johansson <christ...@cvj.se> Commit: Christian Johansson <christ...@cvj.se>
Improved indentation in two edge cases --- Makefile | 2 +- README.md | 3 +- phps-mode-lex-analyzer.el | 55 +++++++++-------------- phps-mode.el | 8 ++-- test/phps-mode-test-lex-analyzer.el | 87 +++++++++++++++++++++++-------------- 5 files changed, 81 insertions(+), 74 deletions(-) diff --git a/Makefile b/Makefile index 87b19f8..137a3f9 100644 --- a/Makefile +++ b/Makefile @@ -23,7 +23,7 @@ test-integration: $(EMACS_CMD) -l test/phps-mode-test-integration.el .PHONY: test-lex-analyzer -test-functions: +test-lex-analyzer: $(EMACS_CMD) -l test/phps-mode-test-lex-analyzer.el diff --git a/README.md b/README.md index d46cf2c..7108627 100644 --- a/README.md +++ b/README.md @@ -62,13 +62,13 @@ For flycheck support run `(phps-mode-flycheck-setup)`. ### Asynchronous lexer Enable with `(setq phps-mode-async-process t)` +Disable with `(setq phps-mode-async-process nil)` ### Asynchronous lexer via async.el processes Enable with: ``` emacs-lisp -(setq phps-mode-async-process t) (setq phps-mode-async-process-using-async-el t) ``` @@ -77,7 +77,6 @@ Enable with: Enable with: ``` emacs-lisp -(setq phps-mode-async-process t) (setq phps-mode-async-process-using-async-el nil) ``` diff --git a/phps-mode-lex-analyzer.el b/phps-mode-lex-analyzer.el index 2f57e83..74f4a3d 100644 --- a/phps-mode-lex-analyzer.el +++ b/phps-mode-lex-analyzer.el @@ -55,9 +55,6 @@ (defvar-local phps-mode-lex-analyzer--processed-buffer-p nil "Flag whether current buffer is processed or not.") -(defvar-local phps-mode-lex-analyzer--process-on-indent-and-imenu-p nil - "Whether to automatically process buffer when using indent or imenu.") - ;; VARIABLES @@ -350,12 +347,12 @@ (when (get-buffer buffer-name) (with-current-buffer buffer-name - ;; Move variables into this buffers variables + ;; Move variables into this buffers local variables + (setq phps-mode-lex-analyzer--processed-buffer-p nil) (setq phps-mode-lex-analyzer--tokens (nth 0 result)) (setq phps-mode-lex-analyzer--states (nth 1 result)) (setq phps-mode-lex-analyzer--state (nth 2 result)) (setq phps-mode-lex-analyzer--state-stack (nth 3 result)) - (setq phps-mode-lex-analyzer--processed-buffer-p nil) (phps-mode-lex-analyzer--reset-imenu) ;; Apply syntax color on tokens @@ -643,26 +640,17 @@ (phps-mode-debug-message (message "Found no head states")) - ;; Reset processed buffer flag - (phps-mode-lex-analyzer--reset-processed-buffer) - (setq run-full-lexer t))) (push (list 'FOUND-NO-HEAD-TOKENS incremental-start-new-buffer) log) (phps-mode-debug-message (message "Found no head tokens")) - ;; Reset processed buffer flag - (phps-mode-lex-analyzer--reset-processed-buffer) - (setq run-full-lexer t)))) (push (list 'FOUND-NO-CHANGE-POINT-MINIMUM) log) (phps-mode-debug-message (message "Found no change point minimum")) - ;; Reset processed buffer flag - (phps-mode-lex-analyzer--reset-processed-buffer) - (setq run-full-lexer t)) (when run-full-lexer @@ -673,28 +661,19 @@ log))) -(defun phps-mode-lex-analyzer--get-processed-buffer () - "Get flag for whether buffer is processed or not." - phps-mode-lex-analyzer--processed-buffer-p) - -(defun phps-mode-lex-analyzer--reset-processed-buffer () - "Reset flag for whether buffer is processed or not." - (setq phps-mode-lex-analyzer--processed-buffer-p nil)) - -(defun phps-mode-lex-analyzer--process-current-buffer () +(defun phps-mode-lex-analyzer--process-current-buffer (&optional force) "Process current buffer, generate indentations and Imenu, trigger incremental lexer if we have change." (interactive) (phps-mode-debug-message (message "Process current buffer")) (when phps-mode-lex-analyzer--idle-timer (phps-mode-debug-message (message "Flag buffer as not processed since changes are detected")) - (setq phps-mode-lex-analyzer--processed-buffer-p nil) - (when phps-mode-lex-analyzer--process-on-indent-and-imenu-p - (phps-mode-debug-message (message "Trigger incremental lexer")) - (phps-mode-lex-analyzer--process-changes))) - (if (and - (not phps-mode-lex-analyzer--processed-buffer-p) - (not phps-mode-lex-analyzer--idle-timer)) + (setq phps-mode-lex-analyzer--processed-buffer-p nil)) + (if (or + force + (and + (not phps-mode-lex-analyzer--processed-buffer-p) + (not phps-mode-lex-analyzer--idle-timer))) (progn (phps-mode-debug-message (message "Buffer is not processed")) (let ((processed @@ -939,6 +918,7 @@ SQUARE-BRACKET-LEVEL and ROUND-BRACKET-LEVEL." (in-concatenation-round-bracket-level nil) (in-concatenation-square-bracket-level nil) (in-concatenation-level 0) + (in-double-quotes nil) (column-level 0) (column-level-start 0) (tuning-level 0) @@ -1167,6 +1147,7 @@ SQUARE-BRACKET-LEVEL and ROUND-BRACKET-LEVEL." ;; INDENTATION LOGIC + ;; Keep track of round bracket level (when (string= token "(") (setq round-bracket-level (1+ round-bracket-level))) @@ -1175,10 +1156,17 @@ SQUARE-BRACKET-LEVEL and ROUND-BRACKET-LEVEL." (when first-token-on-line (setq first-token-is-nesting-decrease t))) + ;; Keep track of opened double quotes + (when (string= token "\"") + (setq in-double-quotes (not in-double-quotes))) + ;; Keep track of square bracket level (when (string= token "[") (setq square-bracket-level (1+ square-bracket-level))) - (when (string= token "]") + (when (and + (string= token "]") + (not in-double-quotes)) + ;; You can have stuff like this $var = "abc $b[test]"; and only the closing square bracket will be tokenized (setq square-bracket-level (1- square-bracket-level)) (when first-token-on-line (setq first-token-is-nesting-decrease t))) @@ -2010,8 +1998,7 @@ SQUARE-BRACKET-LEVEL and ROUND-BRACKET-LEVEL." current-line-string (buffer-substring-no-properties (line-beginning-position) - (line-end-position) - ) + (line-end-position)) ) (when (> line-number 1) (while (and @@ -2122,7 +2109,7 @@ SQUARE-BRACKET-LEVEL and ROUND-BRACKET-LEVEL." (defun phps-mode-lex-analyzer--string-starts-with-closing-bracket-p (string) "Get bracket count for STRING." - (string-match-p "^[\r\t ]*\\([\]{}()[]\\|<[a-zA-Z]+\\|</[a-zA-Z]+\\|/>\\)" string)) + (string-match-p "^[\r\t ]*\\([\]})[]\\|</[a-zA-Z]+\\|/>\\)" string)) (defun phps-mode-lex-analyzer--string-ends-with-assignment-p (string) "Get bracket count for STRING." diff --git a/phps-mode.el b/phps-mode.el index ee5dd10..99cf923 100644 --- a/phps-mode.el +++ b/phps-mode.el @@ -5,8 +5,8 @@ ;; Author: Christian Johansson <christ...@cvj.se> ;; Maintainer: Christian Johansson <christ...@cvj.se> ;; Created: 3 Mar 2018 -;; Modified: 14 Feb 2020 -;; Version: 0.3.32 +;; Modified: 17 Feb 2020 +;; Version: 0.3.33 ;; Keywords: tools, convenience ;; URL: https://github.com/cjohansson/emacs-phps-mode @@ -125,9 +125,9 @@ ;; All PHP files MUST end with a non-blank line, terminated with a single LF. (phps-mode-add-trailing-newline)) - + (phps-mode-lex-analyzer--process-changes nil t) - (phps-mode-lex-analyzer--process-current-buffer) + (phps-mode-lex-analyzer--process-current-buffer t) (indent-region (point-min) (point-max))) (let ((old-buffer-contents (buffer-substring-no-properties (point-min) (point-max))) diff --git a/test/phps-mode-test-lex-analyzer.el b/test/phps-mode-test-lex-analyzer.el index 5e9b46f..6bafa62 100644 --- a/test/phps-mode-test-lex-analyzer.el +++ b/test/phps-mode-test-lex-analyzer.el @@ -29,7 +29,7 @@ (require 'phps-mode) (require 'phps-mode-test) -(defun phps-mode-test-lex-analyzer-process-changes () +(defun phps-mode-test-lex-analyzer--process-changes () "Test `phps-mode-lex-analyzer--process-changes'." (phps-mode-test--with-buffer @@ -59,7 +59,7 @@ ) -(defun phps-mode-test-lex-analyzer-alternative-indentation () +(defun phps-mode-test-lex-analyzer--alternative-indentation () "Test `phps-mode-lex-analyzer--alternative-indentation'." (phps-mode-test--with-buffer @@ -254,9 +254,21 @@ buffer-contents "$var =\n 'abc';\n$var =\n 'abc'\n . 'def';\n// Comment\n")))) + (phps-mode-test--with-buffer + "<?php\nif ($here) {\n if ($wasHere)\n{\n \n }\n}\n\n" + "Alternative indentation on line after condition" + (goto-char 38) + (should (equal + (phps-mode-lex-analyzer--alternative-indentation) + 4)) + (let ((buffer-contents (buffer-substring-no-properties (point-min) (point-max)))) + (should (equal + buffer-contents + "<?php\nif ($here) {\n if ($wasHere)\n {\n \n }\n}\n\n")))) + ) -(defun phps-mode-test-lex-analyzer-move-lines-indent () +(defun phps-mode-test-lex-analyzer--move-lines-indent () "Test `phps-mode-functions-move-lines-indent'." (phps-mode-test--with-buffer @@ -291,7 +303,7 @@ ) -(defun phps-mode-test-lex-analyzer-get-lines-indent () +(defun phps-mode-test-lex-analyzer--get-lines-indent () "Test `phps-mode-lex-analyzer--get-lines-indent' function." (phps-mode-test--with-buffer @@ -514,7 +526,7 @@ ) -(defun phps-mode-test-lex-analyzer-get-lines-indent-psr-2 () +(defun phps-mode-test-lex-analyzer--get-lines-indent-psr-2 () "Test PSR-2 examples from: https://www.php-fig.org/psr/psr-2/." (phps-mode-test--with-buffer @@ -633,7 +645,7 @@ ) -(defun phps-mode-test-lex-analyzer-get-lines-indent-multi-line-assignments () +(defun phps-mode-test-lex-analyzer--get-lines-indent-multi-line-assignments () "Test for multi-line assignments." (phps-mode-test--with-buffer @@ -686,7 +698,7 @@ ) -(defun phps-mode-test-lex-analyzer-get-lines-indent-inline-if () +(defun phps-mode-test-lex-analyzer--get-lines-indent-inline-if () "Test for inline if indentations." (phps-mode-test--with-buffer @@ -706,7 +718,7 @@ ) -(defun phps-mode-test-lex-analyzer-get-lines-indent-alternative-if () +(defun phps-mode-test-lex-analyzer--get-lines-indent-alternative-if () "Test for alternative if indentations." (phps-mode-test--with-buffer @@ -726,7 +738,7 @@ ) -(defun phps-mode-test-lex-analyzer-get-lines-indent-classes () +(defun phps-mode-test-lex-analyzer--get-lines-indent-classes () "Test for class indent." (phps-mode-test--with-buffer @@ -759,7 +771,7 @@ ) -(defun phps-mode-test-lex-analyzer-get-lines-indent-if () +(defun phps-mode-test-lex-analyzer--get-lines-indent-if () "Test for multi-line if expressions." (phps-mode-test--with-buffer @@ -818,7 +830,7 @@ ) -(defun phps-mode-test-lex-analyzer-get-lines-indent-switch-case () +(defun phps-mode-test-lex-analyzer--get-lines-indent-switch-case () "Test for switch-case indentation." (phps-mode-test--with-buffer @@ -845,7 +857,7 @@ ) -(defun phps-mode-test-lex-analyzer-indent-line () +(defun phps-mode-test-lex-analyzer--indent-line () "Test for indentation." ;; Curly bracket tests @@ -1100,9 +1112,18 @@ (let ((buffer-contents (buffer-substring-no-properties (point-min) (point-max)))) (should (equal buffer-contents "<html>\n <head>\n <title><?php $myTitle; ?></title>\n </head>\n <body>\n <?php echo 'test'; ?>\n <h1>My title</h1>\n <?php if ($myTest): ?>\n <div>\n A lot of other stuff.\n </div>\n <?php endif; ?>\n </body>\n</html>")))) + (phps-mode-test--with-buffer + "<?php\nif ($here) {\n $var = \"abc $b[abc] def\";\n// Was here\n}\n\n" + "Indentation after line with square brackets inside double quoted string" + (indent-region (point-min) (point-max)) + (let ((buffer-contents (buffer-substring-no-properties (point-min) (point-max)))) + (should (equal + buffer-contents + "<?php\nif ($here) {\n $var = \"abc $b[abc] def\";\n // Was here\n}\n\n")))) + ) -(defun phps-mode-test-lex-analyzer-imenu () +(defun phps-mode-test-lex-analyzer--imenu () "Test for imenu." (phps-mode-test--with-buffer @@ -1182,7 +1203,7 @@ ) -(defun phps-mode-test-lex-analyzer-get-moved-imenu () +(defun phps-mode-test-lex-analyzer--get-moved-imenu () "Test for moving imenu index." ;; (message "Moved imenu %s" (phps-mode-lex-analyzer--get-moved-imenu '(("myNamespace" ("myClass" ("myFunctionA" . 108) ("myFunctionB" . 161)))) 0 2)) @@ -1205,7 +1226,7 @@ ) -(defun phps-mode-test-lex-analyzer-comment-uncomment-region () +(defun phps-mode-test-lex-analyzer--comment-uncomment-region () "Test (comment-region) and (uncomment-region)." (phps-mode-test--with-buffer @@ -1270,7 +1291,7 @@ ) -(defun phps-mode-test-lex-analyzer-get-inline-html-indentation () +(defun phps-mode-test-lex-analyzer--get-inline-html-indentation () "Test function." (should (equal @@ -1324,23 +1345,23 @@ (defun phps-mode-test-lex-analyzer () "Run test for functions." ;; (setq debug-on-error t) - (phps-mode-test-lex-analyzer-process-changes) - (phps-mode-test-lex-analyzer-alternative-indentation) - (phps-mode-test-lex-analyzer-move-lines-indent) - (phps-mode-test-lex-analyzer-get-inline-html-indentation) - (phps-mode-test-lex-analyzer-get-lines-indent-if) - (phps-mode-test-lex-analyzer-get-lines-indent-classes) - (phps-mode-test-lex-analyzer-get-lines-indent-inline-if) - (phps-mode-test-lex-analyzer-get-lines-indent-alternative-if) - (phps-mode-test-lex-analyzer-get-lines-indent-multi-line-assignments) - (phps-mode-test-lex-analyzer-get-lines-indent-switch-case) - (phps-mode-test-lex-analyzer-get-lines-indent-psr-2) - (phps-mode-test-lex-analyzer-get-lines-indent) - (phps-mode-test-lex-analyzer-indent-line) - (phps-mode-test-lex-analyzer-imenu) - (phps-mode-test-lex-analyzer-get-moved-imenu) - (phps-mode-test-lex-analyzer-comment-uncomment-region) - (phps-mode-test-lex-analyzer-move-lines-indent)) + (phps-mode-test-lex-analyzer--process-changes) + (phps-mode-test-lex-analyzer--alternative-indentation) + (phps-mode-test-lex-analyzer--move-lines-indent) + (phps-mode-test-lex-analyzer--get-inline-html-indentation) + (phps-mode-test-lex-analyzer--get-lines-indent-if) + (phps-mode-test-lex-analyzer--get-lines-indent-classes) + (phps-mode-test-lex-analyzer--get-lines-indent-inline-if) + (phps-mode-test-lex-analyzer--get-lines-indent-alternative-if) + (phps-mode-test-lex-analyzer--get-lines-indent-multi-line-assignments) + (phps-mode-test-lex-analyzer--get-lines-indent-switch-case) + (phps-mode-test-lex-analyzer--get-lines-indent-psr-2) + (phps-mode-test-lex-analyzer--get-lines-indent) + (phps-mode-test-lex-analyzer--indent-line) + (phps-mode-test-lex-analyzer--imenu) + (phps-mode-test-lex-analyzer--get-moved-imenu) + (phps-mode-test-lex-analyzer--comment-uncomment-region) + (phps-mode-test-lex-analyzer--move-lines-indent)) (phps-mode-test-lex-analyzer)