branch: externals/phps-mode commit b71447138b37d0892f45c5fb95bca1d84705dd2f Author: Christian Johansson <christ...@cvj.se> Commit: Christian Johansson <christ...@cvj.se>
Added parse function in lex-analyzer and a test for it --- phps-mode-lex-analyzer.el | 72 +++++++++++++++++++++++++++++++++---- test/phps-mode-test-lex-analyzer.el | 19 +++++++++- 2 files changed, 84 insertions(+), 7 deletions(-) diff --git a/phps-mode-lex-analyzer.el b/phps-mode-lex-analyzer.el index 0513e05..918c147 100644 --- a/phps-mode-lex-analyzer.el +++ b/phps-mode-lex-analyzer.el @@ -34,6 +34,7 @@ (require 'phps-mode-lexer) (require 'phps-mode-macros) +(require 'phps-mode-parser) (require 'phps-mode-serial) (require 'semantic) @@ -362,15 +363,74 @@ t (phps-mode-lexer--re2c)) -(defun phps-mode-lex-analyzer--parse-entire-buffer (&optional forced-synchronous) - "Parse entire buffer, optionally FORCED-SYNCHRONOUS" +(defun phps-mode-lex-analyzer--parse-string + ( + string + ) + "Parse entire STRING." (interactive) + (require 'phps-mode-parser) (require 'phps-mode-macros) - (phps-mode-debug-message (message "Parse entire buffer run")) + (phps-mode-debug-message (message "Parse entire string run")) - ;; TODO Implement this - - ) + (let ((buffer (generate-new-buffer "*PHPs Lexer*"))) + ;; Create temporary buffer and run lexer in it + (when (get-buffer buffer) + (with-current-buffer buffer + (insert string) + + ;; Reset lexer + (setq-local + phps-mode-lexer--generated-tokens + nil) + (setq-local + phps-mode-lexer--state + 'ST_INITIAL) + (setq-local + phps-mode-lexer--states + nil) + (setq-local + phps-mode-lexer--state-stack + nil) + (setq-local + phps-mode-lexer--heredoc-label + nil) + (setq-local + phps-mode-lexer--heredoc-label-stack + nil) + (setq + phps-mode-lexer--nest-location-stack + nil) + + ;; Catch errors to kill generated buffer + (let ((got-error t) + (after-parser-parse)) + (unwind-protect + ;; Run lexer or incremental lexer + (progn + (setq + after-parser-parse + (phps-mode-parser-parse)) + (setq got-error nil)) + (when got-error + (kill-buffer))) + + ;; Copy lexer variables outside of buffer + (let ((after-lexer-state phps-mode-lexer--state) + (after-lexer-state-stack phps-mode-lexer--state-stack) + (after-lexer-states phps-mode-lexer--states) + (after-lexer-tokens (nreverse phps-mode-lexer--generated-tokens)) + (after-lexer-heredoc-label phps-mode-lexer--heredoc-label) + (after-lexer-heredoc-label-stack phps-mode-lexer--heredoc-label-stack)) + (kill-buffer) + (list + after-lexer-tokens + after-lexer-states + after-lexer-state + after-lexer-state-stack + after-lexer-heredoc-label + after-lexer-heredoc-label-stack + after-parser-parse))))))) (defun phps-mode-lex-analyzer--re2c-run (&optional force-synchronous) "Run lexer, optionally FORCE-SYNCHRONOUS." diff --git a/test/phps-mode-test-lex-analyzer.el b/test/phps-mode-test-lex-analyzer.el index 895f6b3..a1c9c5b 100644 --- a/test/phps-mode-test-lex-analyzer.el +++ b/test/phps-mode-test-lex-analyzer.el @@ -1611,6 +1611,22 @@ ) +(defun phps-mode-test-lex-analyzer--parse () + "Test the parser." + + (should + (equal + '(((T_OPEN_TAG 1 . 7) (T_ECHO 7 . 11) (T_CONSTANT_ENCAPSED_STRING 12 . 17) (";" 17 . 18)) ((17 18 ST_IN_SCRIPTING nil nil nil nil) (12 17 ST_IN_SCRIPTING nil nil nil nil) (7 11 ST_IN_SCRIPTING nil nil nil nil) (1 7 ST_IN_SCRIPTING nil nil nil nil)) ST_IN_SCRIPTING nil nil nil (80 459 466 411 333 332 154 102 79)) + (phps-mode-lex-analyzer--parse-string + "<?php echo 'abc';"))) + (message "Passed valid parse test") + + (should-error + (phps-mode-lex-analyzer--parse-string + "<?php echo 'abc'")) + (message "Passed error parse test") + ) + (defun phps-mode-test-lex-analyzer () "Run test for functions." ;; (setq debug-on-error t) @@ -1631,7 +1647,8 @@ (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--move-lines-indent) + (phps-mode-test-lex-analyzer--parse)) (phps-mode-test-lex-analyzer)