branch: externals/phps-mode
commit b71447138b37d0892f45c5fb95bca1d84705dd2f
Author: Christian Johansson <[email protected]>
Commit: Christian Johansson <[email protected]>
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)