branch: externals/phps-mode commit e340279f93bf060ed76568e15d00bd306cf411c3 Author: Christian Johansson <christ...@cvj.se> Commit: Christian Johansson <christ...@cvj.se>
Added unit tests for moving lexer-state positions --- phps-lexer.el | 41 +++++++++++++++++++++++++++-------------- phps-test-lexer.el | 53 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 80 insertions(+), 14 deletions(-) diff --git a/phps-lexer.el b/phps-lexer.el index 18ee244..0478323 100644 --- a/phps-lexer.el +++ b/phps-lexer.el @@ -1284,8 +1284,23 @@ ANY_CHAR' (defun phps-mode/get-moved-lexer-states (states start diff) "Return moved lexer STATES after (or equal to) START with modification DIFF." - ;; TODO Implement this - ) + (let ((old-states states) + (new-states '())) + (when old-states + + ;; Iterate through states add states before start start unchanged and the others modified with diff + (dolist (state-object (nreverse old-states)) + (let ((state-start (nth 0 state-object)) + (state-end (nth 1 state-object)) + (state-symbol (nth 2 state-object)) + (state-stack (nth 3 state-object))) + (if (>= state-start start) + (let ((new-state-start (+ state-start diff)) + (new-state-end (+ state-end diff))) + (push (list new-state-start new-state-end state-symbol state-stack) new-states)) + (push state-object new-states))))) + + new-states)) (defun phps-mode/lexer-move-lexer-tokens (start diff) "Update tokens with moved lexer tokens after or equal to START with modification DIFF." @@ -1296,18 +1311,16 @@ ANY_CHAR' (let ((new-tokens '())) (when old-tokens - ;; Iterate over all tokens, add those that are to be left unchanged and - ;; add modified ones that are to be changed. - (catch 'stop-iteration - (dolist (token (nreverse old-tokens)) - (let ((token-symbol (car token)) - (token-start (car (cdr token))) - (token-end (cdr (cdr token)))) - (if (>= token-start start) - (let ((new-token-start (+ token-start diff)) - (new-token-end (+ token-end diff))) - (push `(,token-symbol ,new-token-start . ,new-token-end) new-tokens)) - (push token new-tokens)))))) + ;; Iterate over all tokens, add those that are to be left unchanged and add modified ones that should be changed. + (dolist (token (nreverse old-tokens)) + (let ((token-symbol (car token)) + (token-start (car (cdr token))) + (token-end (cdr (cdr token)))) + (if (>= token-start start) + (let ((new-token-start (+ token-start diff)) + (new-token-end (+ token-end diff))) + (push `(,token-symbol ,new-token-start . ,new-token-end) new-tokens)) + (push token new-tokens))))) new-tokens)) diff --git a/phps-test-lexer.el b/phps-test-lexer.el index e2401d5..629b17d 100644 --- a/phps-test-lexer.el +++ b/phps-test-lexer.el @@ -294,6 +294,58 @@ ) +(defun phps-mode/test-get-moved-lexer-states () + "Run test for get moved lexer states." + + (should (equal + '((68 76 1 '(1)) + (10 67 1 '(1)) + (1 7 1 '(1))) + + (phps-mode/get-moved-lexer-states + '((66 74 1 '(1)) + (8 65 1 '(1)) + (1 7 1 '(1))) + 7 + 2))) + + (should (equal + '((67 75 1 '(1)) + (9 66 1 '(1)) + (2 8 1 '(1))) + + (phps-mode/get-moved-lexer-states + '((66 74 1 '(1)) + (8 65 1 '(1)) + (1 7 1 '(1))) + 0 + 1))) + + (should (equal + '((66 74 1 '(1)) + (8 65 1 '(1)) + (1 7 1 '(1))) + + (phps-mode/get-moved-lexer-states + '((66 74 1 '(1)) + (8 65 1 '(1)) + (1 7 1 '(1))) + 100 + 1))) + + (should (equal + '((64 72 1 '(1)) + (6 63 1 '(1)) + (1 7 1 '(1))) + + (phps-mode/get-moved-lexer-states + '((66 74 1 '(1)) + (8 65 1 '(1)) + (3 9 1 '(1))) + 3 + -2))) + ) + (defun phps-mode/test-lexer () "Run test for lexer." ;; (message "-- Running all tests for lexer... --\n") @@ -304,6 +356,7 @@ (phps-mode/test-lexer--namespaces) (phps-mode/test-lexer--errors) (phps-mode/test-get-moved-lexer-tokens) + (phps-mode/test-get-moved-lexer-states) ;; (message "\n-- Ran all tests for lexer. --") )