branch: externals/phps-mode commit 99d90d6af0edd0aaccc2ab4aac486503202345f9 Author: Christian Johansson <christ...@cvj.se> Commit: Christian Johansson <christ...@cvj.se>
Started on fix for indented heredoc and nowdocs --- phps-mode-lexer.el | 28 +++++++++++++++------------- test/phps-mode-test-lexer.el | 26 +++++++++++++++++--------- 2 files changed, 32 insertions(+), 22 deletions(-) diff --git a/phps-mode-lexer.el b/phps-mode-lexer.el index 6d55c6f629..9b29e7d1d8 100644 --- a/phps-mode-lexer.el +++ b/phps-mode-lexer.el @@ -124,12 +124,12 @@ (defvar phps-mode-lexer--lambdas-by-state #s(hash-table size 65 test equal rehash-size 1.5 rehash-threshold 0.8125 data (ST_IN_SCRIPTING (((lambda nil (looking-at "exit")) (lambda nil (phps-mode-lexer--return-token-with-indent 'T_EXIT))) ((lambda nil (looking-at "die")) (lambda nil (phps-mode-lexer--return-token-with-indent 'T_EXIT))) ((lambda nil (looking-at "fn")) (lambda nil (phps-mode-lexer--return-token-with-indent 'T_FN))) ((lambda nil (looking-at "function")) (lambda nil (phps-mod [...] ]*("))) (lambda nil (phps-mode-lexer--yyless (length "readonly")) (phps-mode-lexer--return-token-with-str 'T_STRING 0))) ((lambda nil (looking-at "unset")) (lambda nil (phps-mode-lexer--return-token-with-indent 'T_UNSET))) ((lambda nil (looking-at "=>")) (lambda nil (phps-mode-lexer--return-token 'T_DOUBLE_ARROW))) ((lambda nil (looking-at "list")) (lambda nil (phps-mode-lexer--return-token-with-indent 'T_LIST))) ((lambda nil (looking-at "array")) (lambda nil (phps-mode-lexer--return-tok [...] ]*" "\\(\\$\\|\\.\\.\\.\\)"))) (lambda nil (phps-mode-lexer--yyless 1) (phps-mode-lexer--return-token 'T_AMPERSAND_FOLLOWED_BY_VAR_OR_VARARG (match-beginning 0) (- (match-end 0) 1)))) ((lambda nil (looking-at "&")) (lambda nil (phps-mode-lexer--return-token 'T_AMPERSAND_NOT_FOLLOWED_BY_VAR_OR_VARARG))) ((lambda nil (looking-at (concat "\\(" "]" "\\|" ")" "\\)"))) (lambda nil (phps-mode-lexer--return-exit-nesting-token))) ((lambda nil (looking-at (concat "\\(" "\\[" "\\|" "(" "\\)"))) (la [...] -" phps-mode-lexer--heredoc-label ";? -\\|\\$" phps-mode-lexer--label "\\|{\\$" phps-mode-lexer--label "\\|\\${" phps-mode-lexer--label "\\)") nil t))) (if string-start (let* ((start (match-beginning 0)) (end (match-end 0)) (data (buffer-substring-no-properties start end))) (cond ((string-match (concat " -" phps-mode-lexer--heredoc-label ";? +[ ]*" phps-mode-lexer--heredoc-label ";? +\\|\\$" phps-mode-lexer--label "\\|{\\$" phps-mode-lexer--label "\\|\\${" phps-mode-lexer--label "\\)") nil t))) (if string-start (let* ((start (match-beginning 0)) (end (match-end 0)) (data (buffer-substring-no-properties start end))) (cond ((string-match-p (concat " +[ ]*" phps-mode-lexer--heredoc-label ";? ") data) (phps-mode-lexer--return-token-with-val 'T_ENCAPSED_AND_WHITESPACE old-end start) (phps-mode-lexer--begin 'ST_END_HEREDOC)) (t (phps-mode-lexer--return-token-with-val 'T_ENCAPSED_AND_WHITESPACE old-end start)))) (progn (signal 'phps-lexer-error (list (format "Found no ending of heredoc starting at %d" old-start) old-start))))))))) ST_LOOKING_FOR_VARNAME (((lambda nil (looking-at (concat phps-mode-lexer--label "[\\[}]"))) (lambda nil (let* ((start (match-beginning 0)) (end (1- (m [...] '#]"))) (lambda nil (phps-mode-lexer--yyless 0) (phps-mode-lexer--yy-pop-state) (phps-mode-lexer--return-token-with-val 'T_ENCAPSED_AND_WHITESPACE))) ((lambda nil (looking-at phps-mode-lexer--label)) (lambda nil (phps-mode-lexer--return-token-with-str 'T_STRING 0))) ((lambda nil (looking-at phps-mode-lexer--any-char)) (lambda nil (signal 'phps-lexer-error (list (format "Unexpected character at %d" (match-beginning 0)) (match-beginning 0)))))) quote (((lambda nil (looking-at (concat "#!.* [...] -" phps-mode-lexer--heredoc-label ";?\\ +[ ]*" phps-mode-lexer--heredoc-label ";?\\ ") nil t))) (if string-start (let* ((start (match-beginning 0)) (end (match-end 0)) (_data (buffer-substring-no-properties start end))) (phps-mode-lexer--return-token-with-val 'T_ENCAPSED_AND_WHITESPACE phps-mode-lexer--generated-new-tokens-index start) (phps-mode-lexer--begin 'ST_END_HEREDOC)) (progn (signal 'phps-lexer-error (list (format "Found no ending of nowdoc starting at %d" start) start))))))))))) "Hash-table of lex-analyzer rules organized by state.") @@ -1894,7 +1894,7 @@ (let ((string-start (search-forward-regexp (concat - "\\(\n" + "\\(\n[\t ]*" phps-mode-lexer--heredoc-label ";?\n\\|\\$" phps-mode-lexer--label @@ -1913,9 +1913,9 @@ (cond - ((string-match + ((string-match-p (concat - "\n" + "\n[\t ]*" phps-mode-lexer--heredoc-label ";?\n" ) @@ -1947,12 +1947,14 @@ ST_NOWDOC (looking-at phps-mode-lexer--any-char) (let ((start (car (cdr (car phps-mode-lexer--generated-tokens))))) - (let ((string-start (search-forward-regexp - (concat - "\n" - phps-mode-lexer--heredoc-label - ";?\\\n" - ) nil t))) + (let ((string-start + (search-forward-regexp + (concat + "\n[\t ]*" + phps-mode-lexer--heredoc-label + ";?\\\n") + nil + t))) (if string-start (let* ((start (match-beginning 0)) (end (match-end 0)) diff --git a/test/phps-mode-test-lexer.el b/test/phps-mode-test-lexer.el index 7f6d78694f..d123af88e9 100644 --- a/test/phps-mode-test-lexer.el +++ b/test/phps-mode-test-lexer.el @@ -365,7 +365,7 @@ (phps-mode-test--with-buffer "<?php echo \" Hello $variable[0], how are you?\";" - nil + "Simple interpolated string with indexed variable" (should (equal phps-mode-lex-analyzer--tokens @@ -373,14 +373,6 @@ ;; HEREDOC - (phps-mode-test--with-buffer - "<?php\nclass foo {\n public $bar = <<<EOT\nbar\n EOT;\n}\n// Identifier must not be indented\n?>\n" - "Example #1 Invalid example (HEREDOC)" - (should - (equal - phps-mode-lex-analyzer--tokens - nil))) - (phps-mode-test--with-buffer "<?php\nclass foo {\n public $bar = <<<EOT\nbar\nEOT;\n}\n?>\n" "Example #2 Valid example (HEREDOC)" @@ -422,6 +414,14 @@ phps-mode-lex-analyzer--tokens '((T_OPEN_TAG 1 . 7) (T_ECHO 7 . 11) (T_START_HEREDOC 12 . 24) (T_ENCAPSED_AND_WHITESPACE 24 . 36) (T_END_HEREDOC 36 . 43) (";" 43 . 44) (T_CLOSE_TAG 45 . 47) (T_INLINE_HTML 47 . 48))))) + (phps-mode-test--with-buffer + "<?php\n\nclass MyClass\n{\n public const MY_CONSTANT = <<<DELIMITER\n {\n some {\n json\n }\n }\n DELIMITER;\n}\n" + "Heredoc where ending delimiter is not first on line (PHP > 7.3)" + (should + (equal + phps-mode-lex-analyzer--tokens + '((T_OPEN_TAG 1 . 7) (T_CLASS 8 . 13) (T_STRING 14 . 21) ("{" 22 . 23) (T_PUBLIC 28 . 34) (T_CONST 35 . 40) (T_STRING 41 . 52) ("=" 53 . 54) (T_START_HEREDOC 55 . 68) (T_ENCAPSED_AND_WHITESPACE 68 . 121) (T_END_HEREDOC 121 . 131) (T_STRING 131 . 135) (";" 135 . 136) ("}" 137 . 138))))) + ;; NOWDOC (phps-mode-test--with-buffer @@ -448,6 +448,14 @@ phps-mode-lex-analyzer--tokens '((T_OPEN_TAG 1 . 7) (T_CLASS 7 . 12) (T_STRING 13 . 16) ("{" 17 . 18) (T_PUBLIC 23 . 29) (T_VARIABLE 30 . 34) ("=" 35 . 36) (T_START_HEREDOC 37 . 46) (T_ENCAPSED_AND_WHITESPACE 46 . 49) (T_END_HEREDOC 49 . 53) (";" 53 . 54) ("}" 55 . 56) (T_CLOSE_TAG 57 . 59) (T_INLINE_HTML 59 . 60))))) + (phps-mode-test--with-buffer + "<?php\n\nclass MyClass\n{\n public const MY_CONSTANT = <<<'DELIMITER'\n {\n some {\n json\n }\n }\n DELIMITER;\n}\n" + "Nowdoc where ending delimiter is not first on line (PHP > 7.3)" + (should + (equal + phps-mode-lex-analyzer--tokens + '((T_OPEN_TAG 1 . 7) (T_CLASS 8 . 13) (T_STRING 14 . 21) ("{" 22 . 23) (T_PUBLIC 28 . 34) (T_CONST 35 . 40) (T_STRING 41 . 52) ("=" 53 . 54) (T_START_HEREDOC 55 . 70) (T_ENCAPSED_AND_WHITESPACE 70 . 123) (T_END_HEREDOC 123 . 133) (T_STRING 133 . 137) (";" 137 . 138) ("}" 139 . 140))))) + ;; Backquotes (phps-mode-test--with-buffer "<?php `echo \"HELLO\"`;"