branch: externals/phps-mode commit 67233effe39071fc3ba94aad123cda6f1ca5a53e Author: Christian Johansson <christ...@cvj.se> Commit: Christian Johansson <christ...@cvj.se>
Fixed indent algorithm for multi-line strings --- phps-mode-functions.el | 68 ++++++++++++++++++++++++++------------------- phps-mode-test-functions.el | 4 +-- 2 files changed, 41 insertions(+), 31 deletions(-) diff --git a/phps-mode-functions.el b/phps-mode-functions.el index 8f08c29..4340359 100644 --- a/phps-mode-functions.el +++ b/phps-mode-functions.el @@ -394,6 +394,16 @@ (setq column-level-start column-level) + ;; Indent token-less lines here in between last tokens if distance is more than 1 line + (when (and (> next-token-start-line-number (1+ token-start-line-number)) + (not (equal token 'T_CLOSE_TAG))) + (let ((token-line-number-diff (1- (- token-start-line-number next-token-start-line-number)))) + (while (>= token-line-number-diff 0) + (puthash (- token-start-line-number token-line-number-diff) `(,column-level-start ,tuning-level) line-indents) + ;; (message "Saved line %s indent %s %s" (- token-end-line-number token-line-number-diff) column-level tuning-level) + (setq token-line-number-diff (1- token-line-number-diff))))) + + ;; Support temporarily pre-indent (when temp-pre-indent (setq column-level-start temp-pre-indent) @@ -406,49 +416,22 @@ in-heredoc-ended-this-line) (setq column-level-start 0)) + ;; Save line indent (when phps-mode-functions-verbose (message "Process line ending. nesting: %s-%s, line-number: %s-%s, indent: %s.%s, token: %s" nesting-start nesting-end token-start-line-number token-end-line-number column-level-start tuning-level token)) (when (> token-start-line-number 0) - - ;; Save line indentation (puthash token-start-line-number `(,column-level-start ,tuning-level) line-indents)) - ;; Indent token-less lines here in between last tokens if distance is more than 1 line - (when (and (> next-token-start-line-number (1+ token-start-line-number)) - (not (equal token 'T_CLOSE_TAG))) - (let ((token-line-number-diff (1- (- token-start-line-number next-token-start-line-number)))) - (while (>= token-line-number-diff 0) - (puthash (- token-start-line-number token-line-number-diff) `(,column-level-start ,tuning-level) line-indents) - ;; (message "Saved line %s indent %s %s" (- token-end-line-number token-line-number-diff) column-level tuning-level) - (setq token-line-number-diff (1- token-line-number-diff))))) - - - ;; Does token span over several lines? - (when (> token-end-line-number token-start-line-number) - ;; (message "Token %s starts at %s and ends at %s indent %s %s" next-token token-start-line-number token-end-line-number column-level tuning-level) - - ;; Indent doc-comment lines with 1 tuning - (when (equal token 'T_DOC_COMMENT) - (setq tuning-level 1)) - - (let ((token-line-number-diff (1- (- token-end-line-number token-start-line-number)))) - (while (>= token-line-number-diff 0) - (puthash (- token-end-line-number token-line-number-diff) `(,column-level-start ,tuning-level) line-indents) - ;; (message "Saved line %s indent %s %s" (- token-end-line-number token-line-number-diff) column-level tuning-level) - (setq token-line-number-diff (1- token-line-number-diff)))) - - ;; Rest tuning-level used for comments - (setq tuning-level 0)) - ;; Support trailing indent decrements (when temp-post-indent (setq column-level temp-post-indent) (setq temp-post-indent nil)) + ;; Increase indentation (when (and (> nesting-end 0) (or (not nesting-stack) @@ -472,6 +455,33 @@ ;; (message "New stack %s, start: %s end: %s\n" nesting-stack (car (car nesting-stack)) (car (cdr (car nesting-stack)))) ))) + + ;; Does token span over several lines? + (when (> token-end-line-number token-start-line-number) + (let ((column-level-end column-level)) + + ;; HEREDOC lines should have zero indent + (when (or (and in-heredoc + (not in-heredoc-started-this-line)) + in-heredoc-ended-this-line) + (setq column-level-end 0)) + + ;; (message "Token %s starts at %s and ends at %s indent %s %s" next-token token-start-line-number token-end-line-number column-level-end tuning-level) + + ;; Indent doc-comment lines with 1 tuning + (when (equal token 'T_DOC_COMMENT) + (setq tuning-level 1)) + + (let ((token-line-number-diff (1- (- token-end-line-number token-start-line-number)))) + (while (>= token-line-number-diff 0) + (puthash (- token-end-line-number token-line-number-diff) `(,column-level-end ,tuning-level) line-indents) + ;; (message "Saved line %s indent %s %s" (- token-end-line-number token-line-number-diff) column-level tuning-level) + (setq token-line-number-diff (1- token-line-number-diff)))) + + ;; Rest tuning-level used for comments + (setq tuning-level 0))) + + ;; ;; When nesting decreases but ends with a nesting increase, increase indent by one ;; (when (and (< nesting-end nesting-start) ;; line-contained-nesting-increase) diff --git a/phps-mode-test-functions.el b/phps-mode-test-functions.el index 41e46be..cda2fad 100644 --- a/phps-mode-test-functions.el +++ b/phps-mode-test-functions.el @@ -74,13 +74,13 @@ "<?php\n$var = \"A line\nmore text here\nlast line here\";" "Multi-line double-quoted string" ;; (message "Tokens: %s" phps-mode-lexer-tokens) - (should (equal '((1 (0 0)) (2 (1 0)) (3 (1 0)) (4 (1 0))) (phps-mode-test-functions--hash-to-list (phps-mode-functions-get-lines-indent))))) + (should (equal '((1 (0 0)) (2 (0 0)) (3 (1 0)) (4 (1 0))) (phps-mode-test-functions--hash-to-list (phps-mode-functions-get-lines-indent))))) (phps-mode-test-with-buffer "<?php\n$var = 'A line\nmore text here\nlast line here';" "Multi-line single-quoted string" ;; (message "Tokens: %s" phps-mode-lexer-tokens) - (should (equal '((1 (0 0)) (2 (1 0)) (3 (1 0)) (4 (1 0))) (phps-mode-test-functions--hash-to-list (phps-mode-functions-get-lines-indent))))) + (should (equal '((1 (0 0)) (2 (0 0)) (3 (1 0)) (4 (1 0))) (phps-mode-test-functions--hash-to-list (phps-mode-functions-get-lines-indent))))) (phps-mode-test-with-buffer "<?php\necho \"A line\" .\n \"more text here\" .\n \"last line here\";"