[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[elpa] externals/phps-mode 99d90d6af0 1/3: Started on fix for indented h
From: |
Christian Johansson |
Subject: |
[elpa] externals/phps-mode 99d90d6af0 1/3: Started on fix for indented heredoc and nowdocs |
Date: |
Sat, 29 Oct 2022 02:59:10 -0400 (EDT) |
branch: externals/phps-mode
commit 99d90d6af0edd0aaccc2ab4aac486503202345f9
Author: Christian Johansson <christian@cvj.se>
Commit: Christian Johansson <christian@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\"`;"