emacs-elpa-diffs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[elpa] externals/phps-mode 7f4d7dd: Improved incremental lexer, processi


From: Christian Johansson
Subject: [elpa] externals/phps-mode 7f4d7dd: Improved incremental lexer, processing dynamics
Date: Tue, 5 Nov 2019 01:19:58 -0500 (EST)

branch: externals/phps-mode
commit 7f4d7dda09fc12679b0175950efb79434a705d1f
Author: Christian Johansson <address@hidden>
Commit: Christian Johansson <address@hidden>

    Improved incremental lexer, processing dynamics
---
 README.md                          |   4 +
 phps-mode-analyzer.el              | 693 ++++++++++++++++---------------------
 phps-mode.el                       |  10 +-
 test/phps-mode-test-functions.el   |  24 +-
 test/phps-mode-test-integration.el | 134 ++++---
 test/phps-mode-test-lexer.el       | 110 +++---
 test/phps-mode-test.el             |   2 +-
 7 files changed, 471 insertions(+), 506 deletions(-)

diff --git a/README.md b/README.md
index 7066415..693c2a6 100644
--- a/README.md
+++ b/README.md
@@ -26,6 +26,10 @@ This mode does not require PHP installed on your computer 
because it has a built
 * Included in GNU ELPA package archive
 * A interactive function that can be used interactively to format buffers 
`(phps-mode-format-buffer)`
 
+## Roadmap
+
+* Wisent Parser support
+
 ## Keymap
 
 * `C-c C-r` Rescan buffer
diff --git a/phps-mode-analyzer.el b/phps-mode-analyzer.el
index 53d221c..973c5e2 100644
--- a/phps-mode-analyzer.el
+++ b/phps-mode-analyzer.el
@@ -39,6 +39,31 @@
 (require 'semantic/lex)
 (require 'semantic/wisent)
 
+(require 'subr-x)
+
+(defvar phps-mode-analyzer-change-min nil
+  "The minium point of change.");
+
+(defvar phps-mode-idle-interval 1
+  "Idle seconds before running the incremental lexer.")
+
+(defvar phps-mode-functions-allow-after-change t
+  "Flag to tell us whether after change detection is enabled or not.")
+
+(defvar phps-mode-functions-idle-timer nil
+  "Timer object of idle timer.")
+
+(defvar phps-mode-functions-imenu nil
+  "The Imenu alist for current buffer, nil if none.")
+
+(defvar phps-mode-functions-lines-indent nil
+  "The indentation of each line in buffer, nil if none.")
+
+(defvar phps-mode-functions-processed-buffer nil
+  "Flag whether current buffer is processed or not.")
+
+(defvar phps-mode-analyzer-process-on-indent-and-imenu nil
+  "Whether to automatically process buffer when using indent or imenu.")
 
 (defvar phps-mode-lexer-tokens nil
   "Last lexer tokens.")
@@ -88,36 +113,6 @@
 (defvar phps-mode-lexer-heredoc_label_stack (list)
   "The current heredoc_label.")
 
-(defconst phps-mode-lexer-ST_INITIAL 0
-  "Flag for initial state.")
-
-(defconst phps-mode-lexer-ST_IN_SCRIPTING 1
-  "Flag whether we are in script or not.")
-
-(defconst phps-mode-lexer-ST_BACKQUOTE 2
-  "Flag whether we are inside backquote or not.")
-
-(defconst phps-mode-lexer-ST_DOUBLE_QUOTES 3
-  "Flag whether we are inside double quotes or not.")
-
-(defconst phps-mode-lexer-ST_END_HEREDOC 4
-  "Flag whether we are inside end heredoc or not.")
-
-(defconst phps-mode-lexer-ST_HEREDOC 5
-  "Flag whether we are inside heredoc or not.")
-
-(defconst phps-mode-lexer-ST_LOOKING_FOR_PROPERTY 6
-  "Flag whether we are looking for property or not.")
-
-(defconst phps-mode-lexer-ST_LOOKING_FOR_VARNAME 7
-  "Flag whether we are looking for variable name or not.")
-
-(defconst phps-mode-lexer-ST_NOWDOC 8
-  "Flag whether we are inside nowdoc or not.")
-
-(defconst phps-mode-lexer-ST_VAR_OFFSET 9
-  "Flag whether we are looking for variable offset or not.")
-
 
 ;; REGULAR EXPRESSIONS
 
@@ -450,16 +445,16 @@
       (phps-mode-debug-message (message "Running lexer from %s" old-start))
       
       (let ((heredoc_label (car phps-mode-lexer-heredoc_label_stack))
-            (ST_IN_SCRIPTING (= phps-mode-lexer-STATE 
phps-mode-lexer-ST_IN_SCRIPTING))
-            (ST_INITIAL (= phps-mode-lexer-STATE phps-mode-lexer-ST_INITIAL))
-            (ST_LOOKING_FOR_PROPERTY (= phps-mode-lexer-STATE 
phps-mode-lexer-ST_LOOKING_FOR_PROPERTY))
-            (ST_DOUBLE_QUOTES (= phps-mode-lexer-STATE 
phps-mode-lexer-ST_DOUBLE_QUOTES))
-            (ST_BACKQUOTE (= phps-mode-lexer-STATE 
phps-mode-lexer-ST_BACKQUOTE))
-            (ST_HEREDOC (= phps-mode-lexer-STATE phps-mode-lexer-ST_HEREDOC))
-            (ST_NOWDOC (= phps-mode-lexer-STATE phps-mode-lexer-ST_NOWDOC))
-            (ST_LOOKING_FOR_VARNAME (= phps-mode-lexer-STATE 
phps-mode-lexer-ST_LOOKING_FOR_VARNAME))
-            (ST_END_HEREDOC (= phps-mode-lexer-STATE 
phps-mode-lexer-ST_END_HEREDOC))
-            (ST_VAR_OFFSET (= phps-mode-lexer-STATE 
phps-mode-lexer-ST_VAR_OFFSET)))
+            (ST_IN_SCRIPTING (equal phps-mode-lexer-STATE 'ST_IN_SCRIPTING))
+            (ST_INITIAL (equal phps-mode-lexer-STATE 'ST_INITIAL))
+            (ST_LOOKING_FOR_PROPERTY (equal phps-mode-lexer-STATE 
'ST_LOOKING_FOR_PROPERTY))
+            (ST_DOUBLE_QUOTES (equal phps-mode-lexer-STATE 'ST_DOUBLE_QUOTES))
+            (ST_BACKQUOTE (equal phps-mode-lexer-STATE 'ST_BACKQUOTE))
+            (ST_HEREDOC (equal phps-mode-lexer-STATE 'ST_HEREDOC))
+            (ST_NOWDOC (equal phps-mode-lexer-STATE 'ST_NOWDOC))
+            (ST_LOOKING_FOR_VARNAME (equal phps-mode-lexer-STATE 
'ST_LOOKING_FOR_VARNAME))
+            (ST_END_HEREDOC (equal phps-mode-lexer-STATE 'ST_END_HEREDOC))
+            (ST_VAR_OFFSET (equal phps-mode-lexer-STATE 'ST_VAR_OFFSET)))
 
         ;; Reset re2c flags
         (setq phps-mode-lexer-re2c-matching-body nil)
@@ -668,7 +663,7 @@
         (phps-mode-lexer-re2c-rule
          (and ST_IN_SCRIPTING (looking-at "->"))
          (lambda()
-           (phps-mode-lexer-yy_push_state 
phps-mode-lexer-ST_LOOKING_FOR_PROPERTY)
+           (phps-mode-lexer-yy_push_state 'ST_LOOKING_FOR_PROPERTY)
            (phps-mode-lexer-RETURN_TOKEN 'T_OBJECT_OPERATOR (match-beginning 
0) (match-end 0))))
 
         (phps-mode-lexer-re2c-rule
@@ -1063,7 +1058,7 @@
         (phps-mode-lexer-re2c-rule
          (and ST_IN_SCRIPTING (looking-at "{"))
          (lambda()
-           (phps-mode-lexer-yy_push_state phps-mode-lexer-ST_IN_SCRIPTING)
+           (phps-mode-lexer-yy_push_state 'ST_IN_SCRIPTING)
            (when phps-mode-lexer-declaring_namespace
              (setq phps-mode-lexer-declaring_namespace nil))
            (phps-mode-lexer-RETURN_TOKEN "{" (match-beginning 0) (match-end 
0))))
@@ -1071,7 +1066,7 @@
         (phps-mode-lexer-re2c-rule
          (and (or ST_DOUBLE_QUOTES ST_BACKQUOTE ST_HEREDOC) (looking-at 
"\\${"))
          (lambda()
-           (phps-mode-lexer-yy_push_state 
phps-mode-lexer-ST_LOOKING_FOR_VARNAME)
+           (phps-mode-lexer-yy_push_state 'ST_LOOKING_FOR_VARNAME)
            (phps-mode-lexer-RETURN_TOKEN 'T_DOLLAR_OPEN_CURLY_BRACES 
(match-beginning 0) (match-end 0))))
 
         (phps-mode-lexer-re2c-rule
@@ -1092,14 +1087,14 @@
                  (end (- (match-end 0) 1)))
              ;; (message "Stopped here")
              (phps-mode-lexer-yy_pop_state)
-             (phps-mode-lexer-yy_push_state phps-mode-lexer-ST_IN_SCRIPTING)
+             (phps-mode-lexer-yy_push_state 'ST_IN_SCRIPTING)
              (phps-mode-lexer-RETURN_TOKEN 'T_STRING_VARNAME start end))))
 
         (phps-mode-lexer-re2c-rule
          (and ST_LOOKING_FOR_VARNAME (looking-at phps-mode-lexer-ANY_CHAR))
          (lambda()
            (phps-mode-lexer-yy_pop_state)
-           (phps-mode-lexer-yy_push_state phps-mode-lexer-ST_IN_SCRIPTING)))
+           (phps-mode-lexer-yy_push_state 'ST_IN_SCRIPTING)))
 
         (phps-mode-lexer-re2c-rule
          (and ST_IN_SCRIPTING (looking-at phps-mode-lexer-BNUM))
@@ -1206,7 +1201,7 @@
          (lambda()
            (let ((start (match-beginning 0))
                  (end (match-end 0)))
-             (phps-mode-lexer-BEGIN phps-mode-lexer-ST_IN_SCRIPTING)
+             (phps-mode-lexer-BEGIN 'ST_IN_SCRIPTING)
              ;; (message "Starting scripting after <?=")
              (when phps-mode-lexer-PARSER_MODE
                (phps-mode-lexer-RETURN_TOKEN 'T_ECHO start end))
@@ -1217,7 +1212,7 @@
          (lambda()
            (let ((start (match-beginning 0))
                  (end (match-end 0)))
-             (phps-mode-lexer-BEGIN phps-mode-lexer-ST_IN_SCRIPTING)
+             (phps-mode-lexer-BEGIN 'ST_IN_SCRIPTING)
              ;; (message "Starting scripting after <?php")
              (when phps-mode-lexer-EXPECTED
                (phps-mode-lexer-SKIP_TOKEN 'T_OPEN_TAG start end))
@@ -1229,7 +1224,7 @@
            (when phps-mode-lexer-SHORT_TAGS
              (let ((start (match-beginning 0))
                    (end (match-end 0)))
-               (phps-mode-lexer-BEGIN phps-mode-lexer-ST_IN_SCRIPTING)
+               (phps-mode-lexer-BEGIN 'ST_IN_SCRIPTING)
                (when phps-mode-lexer-EXPECTED
                  (phps-mode-lexer-SKIP_TOKEN 'T_OPEN_TAG start end))
                ;; (message "Starting scripting after <?")
@@ -1248,14 +1243,14 @@
         (phps-mode-lexer-re2c-rule
          (and (or ST_DOUBLE_QUOTES ST_HEREDOC ST_BACKQUOTE) (looking-at 
(concat "\\$" phps-mode-lexer-LABEL "->" "[a-zA-Z_\x80-\xff]")))
          (lambda()
-           (phps-mode-lexer-yy_push_state 
phps-mode-lexer-ST_LOOKING_FOR_PROPERTY)
+           (phps-mode-lexer-yy_push_state 'ST_LOOKING_FOR_PROPERTY)
            (forward-char -3)
            (phps-mode-lexer-RETURN_TOKEN 'T_VARIABLE (match-beginning 0) (- 
(match-end 0) 3))))
 
         (phps-mode-lexer-re2c-rule
          (and (or ST_DOUBLE_QUOTES ST_HEREDOC ST_BACKQUOTE) (looking-at 
(concat "\\$" phps-mode-lexer-LABEL "\\[")))
          (lambda()
-           (phps-mode-lexer-yy_push_state phps-mode-lexer-ST_VAR_OFFSET)
+           (phps-mode-lexer-yy_push_state 'ST_VAR_OFFSET)
            (phps-mode-lexer-RETURN_TOKEN 'T_VARIABLE (match-beginning 0) 
(match-end 0))))
 
         (phps-mode-lexer-re2c-rule
@@ -1332,7 +1327,7 @@
                  (end (match-end 0)))
              (when (= (- end start) 3)
                (setq end (1- end)))
-             (phps-mode-lexer-BEGIN phps-mode-lexer-ST_INITIAL)
+             (phps-mode-lexer-BEGIN 'ST_INITIAL)
              (when phps-mode-lexer-PARSER_MODE
                (phps-mode-lexer-RETURN_TOKEN ";" start end))
              (phps-mode-lexer-RETURN_TOKEN 'T_CLOSE_TAG start end))))
@@ -1397,7 +1392,7 @@
                                ;; (message "Double quoted string: %s" 
_double-quoted-string)
                                (phps-mode-lexer-RETURN_TOKEN 
'T_CONSTANT_ENCAPSED_STRING start (+ string-start 1)))
                            ;; (message "Found variable after '%s'" 
(buffer-substring-no-properties start string-start))
-                           (phps-mode-lexer-BEGIN 
phps-mode-lexer-ST_DOUBLE_QUOTES)
+                           (phps-mode-lexer-BEGIN 'ST_DOUBLE_QUOTES)
                            (phps-mode-lexer-RETURN_TOKEN "\"" start (1+ start))
                            (phps-mode-lexer-RETURN_TOKEN 
'T_ENCAPSED_AND_WHITESPACE (1+ start) string-start))))
                    (progn
@@ -1417,16 +1412,16 @@
              (if (string= (substring data 0 1) "'")
                  (progn
                    (setq heredoc_label (substring data 1 (- (length data) 1)))
-                   (phps-mode-lexer-BEGIN phps-mode-lexer-ST_NOWDOC))
+                   (phps-mode-lexer-BEGIN 'ST_NOWDOC))
                (progn
                  (if (string= (substring data 0 1) "\"")
                      (setq heredoc_label (substring data 1 (- (length data) 
1)))
                    (setq heredoc_label data))
-                 (phps-mode-lexer-BEGIN phps-mode-lexer-ST_HEREDOC)))
+                 (phps-mode-lexer-BEGIN 'ST_HEREDOC)))
 
              ;; Check for ending label on the next line
              (when (string= (buffer-substring-no-properties end (+ end (length 
heredoc_label))) heredoc_label)
-               (phps-mode-lexer-BEGIN phps-mode-lexer-ST_END_HEREDOC))
+               (phps-mode-lexer-BEGIN 'ST_END_HEREDOC))
 
              (push heredoc_label phps-mode-lexer-heredoc_label_stack)
              ;; (message "Found heredoc or nowdoc at %s with label %s" data 
heredoc_label)
@@ -1437,7 +1432,7 @@
          (and ST_IN_SCRIPTING (looking-at "[`]"))
          (lambda()
            ;; (message "Begun backquote at %s-%s" (match-beginning 0) 
(match-end 0))
-           (phps-mode-lexer-BEGIN phps-mode-lexer-ST_BACKQUOTE)
+           (phps-mode-lexer-BEGIN 'ST_BACKQUOTE)
            (phps-mode-lexer-RETURN_TOKEN "`" (match-beginning 0) (match-end 
0))))
 
         (phps-mode-lexer-re2c-rule
@@ -1448,26 +1443,26 @@
                   (_data (buffer-substring-no-properties start end)))
              ;; (message "Found ending heredoc at %s, %s of %s" _data 
(thing-at-point 'line) heredoc_label)
              (pop phps-mode-lexer-heredoc_label_stack)
-             (phps-mode-lexer-BEGIN phps-mode-lexer-ST_IN_SCRIPTING)
+             (phps-mode-lexer-BEGIN 'ST_IN_SCRIPTING)
              (phps-mode-lexer-RETURN_TOKEN 'T_END_HEREDOC start end))))
 
         (phps-mode-lexer-re2c-rule
          (and (or ST_DOUBLE_QUOTES ST_BACKQUOTE ST_HEREDOC) (looking-at 
(concat "{\\$")))
          (lambda()
-           (phps-mode-lexer-yy_push_state phps-mode-lexer-ST_IN_SCRIPTING)
+           (phps-mode-lexer-yy_push_state 'ST_IN_SCRIPTING)
            (phps-mode-lexer-RETURN_TOKEN 'T_CURLY_OPEN (match-beginning 0) (- 
(match-end 0) 1))))
 
         (phps-mode-lexer-re2c-rule
          (and ST_DOUBLE_QUOTES (looking-at "[\"]"))
          (lambda()
-           (phps-mode-lexer-BEGIN phps-mode-lexer-ST_IN_SCRIPTING)
+           (phps-mode-lexer-BEGIN 'ST_IN_SCRIPTING)
            ;; (message "Ended double-quote at %s" (match-beginning 0))
            (phps-mode-lexer-RETURN_TOKEN "\"" (match-beginning 0) (match-end 
0))))
 
         (phps-mode-lexer-re2c-rule
          (and ST_BACKQUOTE (looking-at "[`]"))
          (lambda()
-           (phps-mode-lexer-BEGIN phps-mode-lexer-ST_IN_SCRIPTING)
+           (phps-mode-lexer-BEGIN 'ST_IN_SCRIPTING)
            (phps-mode-lexer-RETURN_TOKEN "`" (match-beginning 0) (match-end 
0))))
 
         (phps-mode-lexer-re2c-rule
@@ -1525,7 +1520,7 @@
 
                     ((string-match (concat "\n" heredoc_label ";?\n") data)
                                         ;, (message "Found heredoc end at 
%s-%s" start end)
-                     (phps-mode-lexer-BEGIN phps-mode-lexer-ST_END_HEREDOC)
+                     (phps-mode-lexer-BEGIN 'ST_END_HEREDOC)
                      (phps-mode-lexer-RETURN_TOKEN 'T_ENCAPSED_AND_WHITESPACE 
old-start start))
 
                     (t
@@ -1548,7 +1543,7 @@
                         (_data (buffer-substring-no-properties start end)))
                    ;; (message "Found something ending at %s" _data)
                    ;; (message "Found nowdoc end at %s-%s" start end)
-                   (phps-mode-lexer-BEGIN phps-mode-lexer-ST_END_HEREDOC)
+                   (phps-mode-lexer-BEGIN 'ST_END_HEREDOC)
                    (phps-mode-lexer-RETURN_TOKEN 'T_ENCAPSED_AND_WHITESPACE 
old-start start)
                    )
                (progn
@@ -1563,13 +1558,10 @@
 
         (phps-mode-lexer-re2c-execute)))))
 
-(defun phps-mode-lexer-get-tokens ()
-  "Get lexer tokens."
-  phps-mode-lexer-tokens)
-
-(defun phps-mode-lexer-get-states ()
-  "Get lexer states."
-  phps-mode-lexer-states)
+(define-lex phps-mode-lexer-lex
+  "Call lexer analyzer action."
+  phps-mode-lexer-lex-analyzer
+  semantic-lex-default-action)
 
 (defun phps-mode-lexer--get-next-unescaped (character)
   "Find where next un-escaped CHARACTER comes, if none is found return nil."
@@ -1592,7 +1584,7 @@
 (defun phps-mode-lexer-setup (start end)
   "Just prepare other lexers for lexing region START to END."
   (phps-mode-debug-message (message "Lexer setup %s - %s" start end))
-  (phps-mode-lexer-BEGIN phps-mode-lexer-ST_INITIAL))
+  (phps-mode-lexer-BEGIN 'ST_INITIAL))
 
 (defun phps-mode-lexer-run ()
   "Run lexer."
@@ -1658,288 +1650,205 @@
               (push token new-tokens))))))
     new-tokens))
 
-(defun phps-mode-lexer-run-incremental (buffer)
-  "Run incremental lexer on BUFFER."
-  (phps-mode-debug-message (message "Run incremental lexer on buffer '%s'" 
buffer))
+(defun phps-mode-analyzer-incremental-lexer (start end contents state states 
state-stack)
+  "Run incremental lexer from START to END on CONTENTS.
+Initialize with STATE, STATES and STATE-STACK and return tokens, state and 
states."
+  (let ((incremental-buffer (generate-new-buffer "*PHPs Incremental Buffer*"))
+        (incremental-tokens '())
+        (incremental-states '())
+        (incremental-state nil)
+        (incremental-state-stack '()))
+    (save-excursion
+      (switch-to-buffer incremental-buffer)
+      (insert contents)
+
+      ;; Rewind lexer state here
+      (setq-local phps-mode-lexer-states states)
+      (setq-local phps-mode-lexer-STATE state)
+      (setq-local phps-mode-lexer-state_stack state-stack)
+
+      ;; Setup lexer
+      (when (fboundp 'phps-mode-lexer-lex)
+        (setq-local semantic-lex-analyzer #'phps-mode-lexer-lex))
+      (when (boundp 'phps-mode-syntax-table)
+        (setq-local semantic-lex-syntax-table phps-mode-syntax-table))
+
+      (phps-mode-debug-message
+       (message
+        "Incremental buffer contents: \n'%s'"
+        (buffer-substring-no-properties
+         (point-min)
+         (point-max)))
+       (message
+        "Incremental buffer lexer region (%s-%s): \n'%s'"
+        start
+        end
+        (buffer-substring-no-properties start end)))
+
+      ;; Generate new tokens
+      (setq incremental-tokens (semantic-lex start end))
+
+      ;; Save state, states and state-stack
+      (setq incremental-states phps-mode-lexer-states)
+      (setq incremental-state phps-mode-lexer-STATE)
+      (setq incremental-state-stack phps-mode-lexer-state_stack)
+
+      (kill-buffer)
+
+      (phps-mode-debug-message
+       (message "Incremental tokens: %s" incremental-tokens)
+       (message "Incremental states: %s" incremental-states)
+       (message "Incremental new end state: %s" incremental-state)
+       (message "Incremental new end state stack: %s" 
incremental-state-stack)))
+
+    (list incremental-tokens incremental-state incremental-states 
incremental-state-stack)))
+
+(defun phps-mode-functions--reset-changes ()
+  "Rest changes."
+  (setq phps-mode-analyzer-change-min nil))
+
+(defun phps-mode-analyzer-process-changes (&optional buffer)
+  "Run incremental lexer on BUFFER.  Return list of performed operations."
+  (unless buffer
+    (setq buffer (current-buffer)))
+  (phps-mode-debug-message
+   (message "Run process changes on buffer '%s'" buffer))
   (with-current-buffer buffer
-    (let ((changes (phps-mode-functions--get-changes))
-          (run-full-lexer nil)
+    (let ((run-full-lexer nil)
           (old-tokens phps-mode-lexer-tokens)
-          (old-states phps-mode-lexer-states)
-          (buffer-length-old phps-mode-lexer-buffer-length)
-          (buffer-contents-old phps-mode-lexer-buffer-contents))
+          (old-states phps-mode-lexer-states))
 
-      (if (and changes
-               buffer-length-old
-               buffer-contents-old)
+      (if phps-mode-analyzer-change-min
           (progn
+            (phps-mode-debug-message
+             (message "Processing change point minimum: %s" 
phps-mode-analyzer-change-min))
+            (let ((incremental-state nil)
+                  (incremental-state-stack nil)
+                  (incremental-states nil)
+                  (incremental-tokens nil)
+                  (head-states '())
+                  (head-tokens '())
+                  (change-start phps-mode-analyzer-change-min)
+                  (incremental-start-new-buffer phps-mode-analyzer-change-min))
+
+              ;; Reset processed buffer flag
+              (phps-mode-functions-reset-processed-buffer)
+
+              ;; Reset idle timer
+              (phps-mode-functions--cancel-idle-timer)
+
+              ;; Reset buffer changes minimum index
+              (phps-mode-functions--reset-changes)
+
+              ;; Reset tokens and states here
+              (setq-local phps-mode-lexer-tokens nil)
+              (setq-local phps-mode-lexer-states nil)
+              (setq-local phps-mode-lexer-STATE nil)
+              (setq-local phps-mode-lexer-state_stack nil)
+
+              ;; NOTE Starts are inclusive while ends are exclusive buffer 
locations
+
+              ;; Some tokens have dynamic length and if a change occurs at 
token-end
+              ;; we must start the incremental process at previous token start
+
+              ;; Build list of tokens from old buffer before start of changes 
(head-tokens)
+
+              (catch 'quit
+                (dolist (token old-tokens)
+                  (let ((start (car (cdr token)))
+                        (end (cdr (cdr token))))
+                    (if (< end change-start)
+                        (push token head-tokens)
+                      (when (< start change-start)
+                        (phps-mode-debug-message
+                         (message "New incremental-start-new-buffer: %s" 
start))
+                        (setq incremental-start-new-buffer start))
+                      (throw 'quit "break")))))
 
-            ;; Reset processed buffer flag
-            (phps-mode-functions-reset-processed-buffer)
-
-            ;; Reset idle timer
-            (phps-mode-functions--cancel-idle-timer)
-
-            ;; Reset buffer changes index
-            (phps-mode-functions--reset-changes)
-
-            ;; Reset tokens and states here
-            (setq-local phps-mode-lexer-tokens nil)
-            (setq-local phps-mode-lexer-states nil)
-            (setq-local phps-mode-lexer-STATE nil)
-            (setq-local phps-mode-lexer-state_stack nil)
-
-            (phps-mode-debug-message (message "Processing incremental changes: 
%s" changes))
-            (setq run-full-lexer t)
-
-            (dolist (change (nreverse changes))
-              (let ((change-start (nth 0 change))
-                    (change-stop (nth 1 change))
-                    (buffer-length-new (1- (nth 3 change)))
-                    (buffer-contents-new (nth 4 change)))
-
-                (when (and change-start
-                           change-stop)
-                  (if (and (> change-start 1)
-                           phps-mode-lexer-states
-                           phps-mode-lexer-tokens)
-                      (let ((incremental-state nil)
-                            (incremental-state-stack nil)
-                            (incremental-states nil)
-                            (incremental-tokens nil)
-                            (head-states '())
-                            (tail-states '())
-                            (head-tokens '())
-                            (tail-tokens '())
-                            (buffer-length-delta nil)
-                            (incremental-start 0)
-                            (incremental-stop change-stop)
-                            (change-length (- change-stop change-start))
-                            (appended-tokens nil))
+              (setq head-tokens (nreverse head-tokens))
+              (phps-mode-debug-message
+               (message "Head tokens: %s" head-tokens)
+               (message "Incremental-start-new-buffer: %s" 
incremental-start-new-buffer))
 
-                        (phps-mode-debug-message
-                         (message "Change length: %s" change-length)
-                         (message "Old tokens: %s" old-tokens)
-                         (message "Old states: %s" old-states))
-
-                        ;; (phps-mode-debug-message
-                        ;;  (message "Buffer length old: %s" 
buffer-length-old))
-
-                        ;; 1. Determine incremental start (incremental-start), 
that is at the start of previous token
-                        ;; 2. Build list of tokens before incremental start 
(head-tokens)
-                        ;; 3. Build list of tokens after incremental region 
(tail-tokens)
-                        (dolist (token old-tokens)
-                          (let ((start (car (cdr token)))
-                                (end (cdr (cdr token))))
-                            (cond
-                             ((< end change-start)
-                              (push token head-tokens)
-                              (setq incremental-start start))
-                             ((= end change-start)
-                              (setq incremental-start start))
-                             ((> start change-stop)
-                              (setq incremental-stop end)))))
-                        (setq head-tokens (nreverse head-tokens))
-                        (phps-mode-debug-message
-                         (message "Head tokens: %s" head-tokens)
-                         (message "Incremental start: %s" incremental-start)
-                         (message "Incremental stop: %s" incremental-stop)
-                         (message "Buffer length old: %s" buffer-length-old)
-                         (message "Buffer contents old: %s" 
buffer-contents-old))
-
-                        ;; Calculate change of buffer length
-                        (setq buffer-length-delta (- buffer-length-new 
buffer-length-old))
-
-                        (cond
-                         ((= change-length buffer-length-delta)
-                          (phps-mode-debug-message (message "Flag change as 
insert"))
-                          (setq incremental-stop (+ incremental-stop (1- 
buffer-length-delta))))
-                         ((and (= change-length 0)
-                               (< buffer-length-delta 0))
-                          (phps-mode-debug-message (message "Flag change as 
deletion"))
-                          (setq incremental-stop (+ incremental-stop (abs 
buffer-length-delta))))
-                         (t
-                          (phps-mode-debug-message (message "Do not flag 
change as insert or deletion"))))
-
-                        (dolist (token old-tokens)
-                          (let ((start (car (cdr token))))
-                            (when (>= start incremental-stop)
-                              (push token tail-tokens))))
-                        (setq tail-tokens (nreverse tail-tokens))
+              ;; Did we find a start for the incremental process?
+              (if head-tokens
+                  (progn
+                    (phps-mode-debug-message
+                     (message "Found head tokens"))
+
+                    ;; In old buffer:
+                    ;; 1. Determine state (incremental-state) and state-stack 
(incremental-state-stack) before incremental start
+                    ;; 2. Build list of states before incremental start 
(head-states)
+                    ;; 3. Build list of states after incremental start 
(tail-states)
+                    (catch 'quit
+                      (dolist (state-object (nreverse old-states))
+                        (let ((end (nth 1 state-object)))
+                          (if (< end change-start)
+                              (progn
+                                (setq incremental-state (nth 2 state-object))
+                                (setq incremental-state-stack (nth 3 
state-object))
+                                (push state-object head-states))
+                            (throw 'quit "break")))))
 
-                        (phps-mode-debug-message
-                         (message "Incremental start: %s" incremental-start)
-                         (message "Incremental stop: %s" incremental-stop)
-                         (message "Buffer length new: %s" buffer-length-new)
-                         (message "Buffer length old: %s" buffer-length-old)
-                         (message "Buffer length delta: %s" 
buffer-length-delta)
-                         (message "Buffer contents new: %s" 
buffer-contents-new)
-                         (message "Tail tokens: %s" tail-tokens)
-                         (message "From region: %s - %s" incremental-start 
incremental-stop))
-
-                        ;; Did we find a start for the incremental process?
-                        (if (and
-                             (> incremental-start 0)
-                             head-tokens)
-                            (progn
-
-                              (phps-mode-debug-message (message "Found 
positive incremental-start and head tokens"))
-
-                              ;; 1. Determine state (incremental-state) and 
state-stack (incremental-state-stack) at incremental start
-                              ;; 2. Build list of states before incremental 
start (head-states)
-                              ;; 3. Build list of states after incremental 
start (tail-states)
-                              (dolist (state-object (nreverse old-states))
-                                (let ((start (nth 0 state-object))
-                                      (end (nth 1 state-object)))
-                                  (when (< end change-start)
-                                    (setq incremental-state (nth 2 
state-object))
-                                    (setq incremental-state-stack (nth 3 
state-object))
-                                    (push state-object head-states))
-                                  (when (>= start incremental-stop)
-                                    (push state-object tail-states))))
+                    (phps-mode-debug-message
+                     (message "Head states: %s" head-states))
 
-                              (phps-mode-debug-message
-                               (message "Incremental-state: %s" 
incremental-state)
-                               (message "Incremental-state-stack: %s" 
incremental-state-stack)
-                               (message "Head states: %s" head-states)
-                               (message "Tail states: %s" tail-states))
-
-                              ;; Rewind lexer state here
-                              (setq-local phps-mode-lexer-states head-states)
-                              (setq-local phps-mode-lexer-STATE 
incremental-state)
-                              (setq-local phps-mode-lexer-state_stack 
incremental-state-stack)
-
-                              (if head-states
-                                  (progn
-                                    (phps-mode-debug-message (message "Found 
head states"))
-
-                                    ;; Flag that we should not run ful lexer
-                                    (setq run-full-lexer nil)
-
-                                    ;; Delete all syntax coloring from 
incremental-start to end of incremental-region
-                                    ;; 
(phps-mode-lexer-clear-region-syntax-color incremental-start change-stop)
-
-                                    ;; Do partial lex from previous-token-end 
to change-stop
-                                    (let ((incremental-buffer 
(generate-new-buffer "*PHPs Incremental Buffer*")))
-                                      (save-excursion
-                                        (switch-to-buffer incremental-buffer)
-                                        (delete-region (point-min) (point-max))
-                                        (goto-char (point-max))
-                                        (insert-char 10 (- incremental-start 
2))
-                                        (goto-char (point-max))
-                                        (insert (substring buffer-contents-new 
(- incremental-start 2) incremental-stop))
-
-                                        ;; Rewind lexer state here
-                                        (setq-local phps-mode-lexer-states 
head-states)
-                                        (setq-local phps-mode-lexer-STATE 
incremental-state)
-                                        (setq-local 
phps-mode-lexer-state_stack incremental-state-stack)
-
-                                        ;; Setup lexer
-                                        (when (fboundp 'phps-mode-lexer-lex)
-                                          (setq-local semantic-lex-analyzer 
#'phps-mode-lexer-lex))
-                                        (when (boundp 'phps-mode-syntax-table)
-                                          (setq-local 
semantic-lex-syntax-table phps-mode-syntax-table))
-
-                                        (phps-mode-debug-message
-                                         (message "Incremental buffer 
contents: \n%s" (buffer-substring-no-properties (point-min) (point-max)))
-                                         (message "Incremental buffer lexer 
region (%s-%s): \n%s" (1- incremental-start) (1+ incremental-stop) 
(buffer-substring-no-properties (1- incremental-start) (1+ incremental-stop))))
-
-                                        (setq incremental-tokens (semantic-lex 
(1- incremental-start) (1+ incremental-stop)))
-                                        (setq appended-tokens (append 
head-tokens incremental-tokens))
-                                        (setq incremental-states 
phps-mode-lexer-states)
-
-                                        (phps-mode-debug-message (message 
"Incremental tokens: %s" incremental-tokens))
-
-                                        (kill-buffer)))
-
-                                    (if (and (= phps-mode-lexer-STATE 
incremental-state)
-                                             (equal 
phps-mode-lexer-state_stack incremental-state-stack))
-                                        (progn
-
-                                          (phps-mode-debug-message (message 
"Found matching state and state-stack, copying old state and tokens"))
-
-                                          (unless (= buffer-length-delta 0)
-                                            (when tail-tokens
-                                              (setq tail-tokens 
(phps-mode-lexer-get-moved-tokens tail-tokens 0 buffer-length-delta)))
-
-                                            (when tail-states
-                                              (setq tail-states 
(phps-mode-lexer-get-moved-states tail-states 0 buffer-length-delta))))
-
-                                          (phps-mode-debug-message
-                                           (message "State and state stack at 
stop equals state at stop: %s %s" phps-mode-lexer-STATE 
phps-mode-lexer-state_stack))
-
-                                          ;; TODO re-use rest of indexes here? 
(indentation and imenu)
-
-                                          ;; Apply syntax coloring
-                                          (dolist (token-object 
incremental-tokens)
-                                            (let ((token (car token-object))
-                                                  (start (car (cdr 
token-object)))
-                                                  (end (cdr (cdr 
token-object))))
-                                              (when (<= end (point-max))
-                                                
(phps-mode-lexer-set-region-syntax-color
-                                                 start end 
(phps-mode-lexer-get-token-syntax-color token)))))
-
-                                          (setq-local phps-mode-lexer-states 
(append tail-states incremental-states))
-                                          (phps-mode-debug-message (message 
"New states from incremental lex are: %s" phps-mode-lexer-states))
-                                          
-                                          (setq appended-tokens (append 
appended-tokens tail-tokens))
-                                          (phps-mode-debug-message (message 
"New tokens from incremental lex are: %s" appended-tokens)))
-
-                                      (phps-mode-debug-message (message "Did 
not find matching state and state-stack, lexing rest of buffer"))
-
-                                      (phps-mode-debug-message
-                                       (message "State at stop %s or state 
stack %s does not equals state at stop: %s %s" phps-mode-lexer-STATE 
phps-mode-lexer-state_stack incremental-state incremental-state-stack))
-
-                                      ;; Clear syntax colouring of rest of 
buffer
-                                      ;; 
(phps-mode-lexer-clear-region-syntax-color incremental-start (point-max))
-
-                                      ;; Lex rest of buffer
-                                      (setq head-tokens appended-tokens)
-                                      (setq incremental-tokens (semantic-lex 
incremental-stop (point-max)))
-                                      (setq appended-tokens (append 
head-tokens incremental-tokens))
-                                      (phps-mode-debug-message (message "New 
states from full lex are: %s" phps-mode-lexer-states))
-                                      (phps-mode-debug-message (message "New 
tokens from full lex are: %s" appended-tokens)))
-
-                                    (phps-mode-debug-message (message "Final 
tokens: %s" appended-tokens))
-                                    (setq-local phps-mode-lexer-tokens 
appended-tokens))
-                                (phps-mode-debug-message (message "Did not 
find head states"))))
-                          (phps-mode-debug-message (message "Did not find 
positive incremental-start or head-tokens"))))
-                    (phps-mode-debug-message (message "Change start not above 
one or lacking tokens or states"))))
-                (setq buffer-length-old buffer-length-new)
-                (setq buffer-contents-old buffer-contents-new)))
-
-            (setq-local phps-mode-lexer-buffer-length (1- (point-max)))
-            (setq-local phps-mode-lexer-buffer-contents 
(buffer-substring-no-properties (point-min) (point-max))))
-        (phps-mode-debug-message (message "Found no changes")))
-
-      (when run-full-lexer
-        (phps-mode-debug-message (message "Running full lexer"))
-        (phps-mode-lexer-run)))))
+                    (if head-states
+                        (progn
+                          (phps-mode-debug-message
+                           (message "Found head states"))
 
-(define-lex phps-mode-lexer-lex
-  "Call lexer analyzer action."
-  phps-mode-lexer-lex-analyzer
-  semantic-lex-default-action)
+                          ;; Delete all syntax coloring from head.boundary to 
end of incremental-region
+                          ;; (phps-mode-lexer-clear-region-syntax-color 
head-boundary change-stop)
 
-(require 'subr-x)
 
-(defvar phps-mode-functions-allow-after-change t
-  "Flag to tell us whether after change detection is enabled or not.")
+                          ;; Do partial lex from previous-token-end to 
change-stop
+                          (let ((incremental-result
+                                 (phps-mode-analyzer-incremental-lexer
+                                  incremental-start-new-buffer
+                                  (point-max)
+                                  (buffer-substring-no-properties (point-min) 
(point-max))
+                                  incremental-state
+                                  head-states
+                                  incremental-state-stack)))
+                            (setq incremental-tokens (nth 0 
incremental-result))
+                            (setq incremental-states (nth 2 
incremental-result))
 
-(defvar phps-mode-functions-buffer-changes nil
-  "A stack of buffer changes.")
 
-(defvar phps-mode-functions-idle-timer nil
-  "Timer object of idle timer.")
+                            ;; TODO re-use rest of indexes here? (indentation 
and imenu)
 
-(defvar phps-mode-functions-imenu nil
-  "The Imenu alist for current buffer, nil if none.")
+                            ;; Apply syntax coloring on new tokens only
+                            (dolist (token-object incremental-tokens)
+                              (let ((token (car token-object))
+                                    (start (car (cdr token-object)))
+                                    (end (cdr (cdr token-object))))
+                                (when (<= end (point-max))
+                                  (phps-mode-lexer-set-region-syntax-color
+                                   start end 
(phps-mode-lexer-get-token-syntax-color token)))))
 
-(defvar phps-mode-functions-lines-indent nil
-  "The indentation of each line in buffer, nil if none.")
 
-(defvar phps-mode-functions-processed-buffer nil
-  "Flag whether current buffer is processed or not.")
+                            (setq-local phps-mode-lexer-states 
incremental-states)
+                            (phps-mode-debug-message (message "New states from 
incremental lex are: %s" phps-mode-lexer-states))
+
+                            (setq-local phps-mode-lexer-tokens (append 
head-tokens incremental-tokens))
+                            (phps-mode-debug-message (message "New tokens from 
incremental lex are: %s" phps-mode-lexer-tokens))
+
+                            ))
+                      (phps-mode-debug-message
+                       (message "Found no head states"))
+                      (setq run-full-lexer t)))
+                (phps-mode-debug-message
+                 (message "Found no head tokens"))
+                (setq run-full-lexer t))))
+        (phps-mode-debug-message
+         (message "Found no change point minimum"))
+        (setq run-full-lexer t))
+
+      (if run-full-lexer
+          (progn
+            (phps-mode-debug-message
+             (message "Running full lexer"))
+            (phps-mode-lexer-run))))))
 
 (defun phps-mode-functions-get-processed-buffer ()
   "Get flag for whether buffer is processed or not."
@@ -1954,10 +1863,15 @@
   (interactive)
   (phps-mode-debug-message (message "Process current buffer"))
   (when phps-mode-functions-idle-timer
-    (phps-mode-debug-message (message "Trigger incremental lexer"))
-    (phps-mode-lexer-run-incremental (current-buffer))
-    (setq-local phps-mode-functions-processed-buffer nil))
-  (if (not phps-mode-functions-processed-buffer)
+    (phps-mode-debug-message
+     (message "Flag buffer as not processed since changes are detected"))
+    (setq-local phps-mode-functions-processed-buffer nil)
+    (when phps-mode-analyzer-process-on-indent-and-imenu
+      (phps-mode-debug-message (message "Trigger incremental lexer"))
+      (phps-mode-analyzer-process-changes)))
+  (if (and
+       (not phps-mode-functions-processed-buffer)
+       (not phps-mode-functions-idle-timer))
       (progn
         (phps-mode-debug-message (message "Buffer is not processed"))
         (let ((processed (phps-mode-functions--process-tokens-in-string 
phps-mode-lexer-tokens (buffer-substring-no-properties (point-min) 
(point-max)))))
@@ -1965,7 +1879,11 @@
           (setq-local phps-mode-functions-imenu (nth 0 processed))
           (setq-local phps-mode-functions-lines-indent (nth 1 processed)))
         (setq-local phps-mode-functions-processed-buffer t))
-    (phps-mode-debug-message (message "Buffer is already processed"))))
+    (phps-mode-debug-message
+     (when phps-mode-functions-processed-buffer
+       (message "Buffer is already processed"))
+     (when phps-mode-functions-idle-timer
+       (message "Not processing buffer since there are non-lexed changes")))))
 
 (defun phps-mode-functions-get-moved-lines-indent (old-lines-indents 
start-line-number diff)
   "Move OLD-LINES-INDENTS from START-LINE-NUMBER with DIFF points."
@@ -3008,58 +2926,51 @@
   "Indent line."
   (phps-mode-debug-message (message "Indent line"))
   (phps-mode-functions-process-current-buffer)
-  (if phps-mode-functions-lines-indent
-      (let ((line-number (line-number-at-pos (point))))
-        (phps-mode-debug-message (message "Found lines indent index, 
indenting.."))
-        (let ((indent (gethash line-number phps-mode-functions-lines-indent)))
-          (if indent
-              (progn
-                (let ((indent-sum (+ (* (car indent) tab-width) (car (cdr 
indent))))
-                      (old-indentation (current-indentation))
-                      (line-start (line-beginning-position)))
-
-                  (unless old-indentation
-                    (setq old-indentation 0))
-
-                  ;; Only continue if current indentation is wrong
-                  (if (not (equal indent-sum old-indentation))
-                      (progn
-
-                        (setq-local phps-mode-functions-allow-after-change nil)
-                        (indent-line-to indent-sum)
-                        (setq-local phps-mode-functions-allow-after-change t)
+  (if phps-mode-functions-processed-buffer
+      (if phps-mode-functions-lines-indent
+          (let ((line-number (line-number-at-pos (point))))
+            (phps-mode-debug-message (message "Found lines indent index, 
indenting.."))
+            (let ((indent (gethash line-number 
phps-mode-functions-lines-indent)))
+              (if indent
+                  (progn
+                    (let ((indent-sum (+ (* (car indent) tab-width) (car (cdr 
indent))))
+                          (old-indentation (current-indentation))
+                          (line-start (line-beginning-position)))
 
-                        (let ((indent-diff (- (current-indentation) 
old-indentation)))
+                      (unless old-indentation
+                        (setq old-indentation 0))
 
+                      ;; Only continue if current indentation is wrong
+                      (if (not (equal indent-sum old-indentation))
+                          (progn
 
-                          ;; When indent is changed the trailing tokens and 
states just need to adjust their positions, this will improve speed of 
indent-region a lot
-                          (phps-mode-lexer-move-tokens line-start indent-diff)
-                          (phps-mode-lexer-move-states line-start indent-diff)
-                          (phps-mode-functions-move-imenu-index line-start 
indent-diff)
+                            (setq-local phps-mode-functions-allow-after-change 
nil)
+                            (indent-line-to indent-sum)
+                            (setq-local phps-mode-functions-allow-after-change 
t)
 
-                          (phps-mode-debug-message
-                           (message "Lexer tokens after move: %s" 
phps-mode-lexer-tokens)
-                           (message "Lexer states after move: %s" 
phps-mode-lexer-states))
+                            (let ((indent-diff (- (current-indentation) 
old-indentation)))
 
-                          ;; Reset change flag
-                          (phps-mode-functions--reset-changes)
-                          (phps-mode-functions--cancel-idle-timer)
 
-                          ;; Update last buffer states
-                          (setq-local phps-mode-lexer-buffer-length (1- 
(point-max)))
-                          (setq-local phps-mode-lexer-buffer-contents 
(buffer-substring-no-properties (point-min) (point-max)))
+                              ;; When indent is changed the trailing tokens 
and states just need to adjust their positions, this will improve speed of 
indent-region a lot
+                              (phps-mode-lexer-move-tokens line-start 
indent-diff)
+                              (phps-mode-lexer-move-states line-start 
indent-diff)
+                              (phps-mode-functions-move-imenu-index line-start 
indent-diff)
 
-                          ))))))))
-    (phps-mode-debug-message "Did not find lines indent index, skipping 
indenting..")
-    (message "Did not find lines indent index, skipping indenting..")))
+                              (phps-mode-debug-message
+                               (message "Lexer tokens after move: %s" 
phps-mode-lexer-tokens)
+                               (message "Lexer states after move: %s" 
phps-mode-lexer-states))
 
-(defun phps-mode-functions--reset-changes ()
-  "Reset change stack."
-  (setq-local phps-mode-functions-buffer-changes nil))
+                              ;; Reset change flag
+                              (phps-mode-functions--reset-changes)
+                              (phps-mode-functions--cancel-idle-timer)
 
-(defun phps-mode-functions--get-changes ()
-  "Get change stack."
-  phps-mode-functions-buffer-changes)
+                              ;; Update last buffer states
+                              (setq-local phps-mode-lexer-buffer-length (1- 
(point-max)))
+                              (setq-local phps-mode-lexer-buffer-contents 
(buffer-substring-no-properties (point-min) (point-max)))))))))))
+        (phps-mode-debug-message
+         (message "Did not find lines indent index, skipping indenting..")))
+    (phps-mode-debug-message
+     (message "Skipping indentation since buffer is not processed yet"))))
 
 (defun phps-mode-functions--cancel-idle-timer ()
   "Cancel idle timer."
@@ -3072,7 +2983,7 @@
   "Start idle timer."
   (phps-mode-debug-message (message "Enqueued idle timer"))
   (when (boundp 'phps-mode-idle-interval)
-    (setq-local phps-mode-functions-idle-timer (run-with-idle-timer 
phps-mode-idle-interval nil #'phps-mode-lexer-run-incremental 
(current-buffer)))))
+    (setq-local phps-mode-functions-idle-timer (run-with-idle-timer 
phps-mode-idle-interval nil #'phps-mode-analyzer-process-changes))))
 
 (defun phps-mode-functions-after-change (start stop length)
   "Track buffer change from START to STOP with LENGTH."
@@ -3096,8 +3007,10 @@
 
           (phps-mode-functions--start-idle-timer))
 
-        ;; Save change in changes stack
-        (push `(,start ,stop ,length ,(point-max) 
,(buffer-substring-no-properties (point-min) (point-max))) 
phps-mode-functions-buffer-changes))
+        (when (or
+               (not phps-mode-analyzer-change-min)
+               (< start phps-mode-analyzer-change-min))
+          (setq phps-mode-analyzer-change-min start)))
     (phps-mode-debug-message (message "After change registration is 
disabled"))))
 
 (defun phps-mode-functions-imenu-create-index ()
@@ -3154,6 +3067,8 @@
               (cond
                ((or
                  (equal token-label 'T_INLINE_HTML)
+                 (equal token-label 'T_COMMENT)
+                 (equal token-label 'T_DOC_COMMENT)
                  (equal token-label 'T_OPEN_TAG)
                  (equal token-label 'T_OPEN_TAG_WITH_ECHO)))
                (t
@@ -3216,8 +3131,8 @@
                       (setq offset-comment-end (+ token-end offset))
                       (save-excursion
                         (goto-char offset-comment-end)
-                        (delete-char -4))
-                      (setq offset (- offset 4)))
+                        (delete-char -3))
+                      (setq offset (- offset 3)))
 
                   (phps-mode-debug-message
                    (message "Un-comment comment starting at %s" token-start))
diff --git a/phps-mode.el b/phps-mode.el
index 02417d5..3112a4b 100644
--- a/phps-mode.el
+++ b/phps-mode.el
@@ -5,8 +5,8 @@
 ;; Author: Christian Johansson <address@hidden>
 ;; Maintainer: Christian Johansson <address@hidden>
 ;; Created: 3 Mar 2018
-;; Modified: 10 Oct 2019
-;; Version: 0.3.5
+;; Modified: 5 Nov 2019
+;; Version: 0.3.7
 ;; Keywords: tools, convenience
 ;; URL: https://github.com/cjohansson/emacs-phps-mode
 
@@ -56,9 +56,6 @@
 (defvar phps-mode-use-psr-2 t
   "Whether to use PSR-2 guidelines for white-space or not.")
 
-(defvar phps-mode-idle-interval 1
-  "Idle seconds before running the incremental lexer.")
-
 (defvar phps-mode-inline-mmm-submode nil
   "Symbol declaring what mmm-mode to use as submode in inline areas.")
 
@@ -150,8 +147,7 @@
 
   ;; Reset flags
   (setq-local phps-mode-functions-allow-after-change t)
-  (setq-local phps-mode-functions-buffer-changes nil)
-  (setq-local phps-mode-functions-buffer-changes nil)
+  (setq-local phps-mode-analyzer-change-min nil)
   (setq-local phps-mode-functions-idle-timer nil)
   (setq-local phps-mode-functions-lines-indent nil)
   (setq-local phps-mode-functions-imenu nil)
diff --git a/test/phps-mode-test-functions.el b/test/phps-mode-test-functions.el
index 8bd42ec..c5e3a3d 100644
--- a/test/phps-mode-test-functions.el
+++ b/test/phps-mode-test-functions.el
@@ -248,7 +248,7 @@
   (phps-mode-test-with-buffer
    "<?php\n$myObj->myFunction()\n    ->mySecondaryFunction();"
    "Indentation of chained class method calls outside of assignments and 
conditionals"
-   ;; (message "Tokens: %s" (phps-mode-lexer-get-tokens))
+   ;; (message "Tokens: %s" phps-mode-lexer-tokens)
    (should (equal '((1 (0 0)) (2 (0 0)) (3 (1 0))) 
(phps-mode-test-hash-to-list (phps-mode-functions-get-lines-indent)))))
 
   (phps-mode-test-with-buffer
@@ -259,13 +259,13 @@
   (phps-mode-test-with-buffer
    "<?php\n\n$myResult = !empty($myVar->myMethod3)\n    && $myVar->myMethod\n  
      && $myVar->myMethod2;\n"
    "Indentation for chained object operators in assignment"
-   ;; (message "Tokens: %s" (phps-mode-lexer-get-tokens))
+   ;; (message "Tokens: %s" phps-mode-lexer-tokens)
    (should (equal '((1 (0 0)) (2 (0 0)) (3 (0 0)) (4 (1 0)) (5 (1 0))) 
(phps-mode-test-hash-to-list (phps-mode-functions-get-lines-indent)))))
 
   (phps-mode-test-with-buffer
    "<?php\n$array = [\n    'second' => [\n        'hello' => true\n        
]\n];\n\n$array = array(\n    'second' => array(\n        'third' => true\n     
   )\n);"
    "Indent multi-dimensional arrays without trailing commas"
-   ;; (message "Tokens: %s" (phps-mode-lexer-get-tokens))
+   ;; (message "Tokens: %s" phps-mode-lexer-tokens)
    (should (equal '((1 (0 0)) (2 (0 0)) (3 (1 0)) (4 (2 0)) (5 (1 0)) (6 (0 
0)) (7 (0 0)) (8 (0 0)) (9 (1 0)) (10 (2 0)) (11 (1 0)) (12 (0 0))) 
(phps-mode-test-hash-to-list (phps-mode-functions-get-lines-indent))))
 
    (phps-mode-test-with-buffer
@@ -639,7 +639,7 @@
   (phps-mode-test-with-buffer
    "<html><head><title><?php if ($myCondition) {\nif ($mySeconCondition) 
{\necho $title3;\n\n}\n?>\n</title><body>Bla bla</body></html>"
    "Curly bracket test 4"
-   ;; (message "Tokens: %s" (phps-mode-lexer-get-tokens))
+   ;; (message "Tokens: %s" phps-mode-lexer-tokens)
    (goto-char 110)
    (phps-mode-functions-indent-line)
    (let ((buffer-contents (buffer-substring-no-properties (point-min) 
(point-max))))
@@ -1015,6 +1015,22 @@
    (let ((buffer-contents (buffer-substring-no-properties (point-min) 
(point-max))))
      (should (equal buffer-contents "<?php\nnamespace myNamespace;\nclass 
myClass extends myAbstract implements myInterface {\n    public function 
myFunctionA($myArg = null) {}\n    protected function myFunctionB($myArg = 
'abc') {}\n}"))))
 
+  (phps-mode-test-with-buffer
+   "<?php\n/**\n * My doc comment\n */\n$var = 'abc';\n"
+   "Comment region were some of the region is in doc comment"
+   ;; (message "Tokens %s" phps-mode-lexer-tokens)
+   (comment-region (point-min) (point-max))
+   (let ((buffer-contents (buffer-substring-no-properties (point-min) 
(point-max))))
+     (should (equal buffer-contents "<?php\n/**\n * My doc comment\n */\n/* 
$var = 'abc'; */\n"))))
+
+  (phps-mode-test-with-buffer
+   "<?php\n/** $var = '123'; */\n$var = 'abc';\n"
+   "Un-comment region were some of the region is already un-commented"
+   ;; (message "Tokens %s" phps-mode-lexer-tokens)
+   (uncomment-region (point-min) (point-max))
+   (let ((buffer-contents (buffer-substring-no-properties (point-min) 
(point-max))))
+     (should (equal buffer-contents "<?php\n$var = '123';\n$var = 'abc';\n"))))
+
   )
 
 (defun phps-mode-test-functions-get-inline-html-indentation ()
diff --git a/test/phps-mode-test-integration.el 
b/test/phps-mode-test-integration.el
index 0f7e522..fa2a1b0 100644
--- a/test/phps-mode-test-integration.el
+++ b/test/phps-mode-test-integration.el
@@ -32,7 +32,7 @@
 (eval-when-compile
   (require 'phps-mode-macros))
 
-(defun phps-mode-test-integration-incremental ()
+(defun phps-mode-test-integration-incremental-vs-initial-buffers ()
   "Test for object-oriented PHP file."
 
   (phps-mode-test-incremental-vs-intial-buffer
@@ -40,7 +40,7 @@
    "Integration-test 1 for regular PHP with namespaces, classes and functions"
 
    ;; Make changes - insert a new function
-   (goto-char 144)
+   (goto-char 145)
    (insert "\n\n        public function myFunctionB()\n        {\n            
echo 'my second statement';\n        }\n"))
 
   (phps-mode-test-incremental-vs-intial-buffer
@@ -48,7 +48,7 @@
    "Integration-test 2 for regular PHP with namespaces, classes and functions"
 
    ;; Make changes - insert a new function
-   (goto-char 144)
+   (goto-char 145)
    (insert "\n\n        public function myFunctionB()\n        {\n            
echo 'my second statement';\n        }\n")
 
    ;; Make changes - remove first function
@@ -73,7 +73,6 @@
    (goto-char 132)
    (insert " is a complex one"))
 
-  
   (phps-mode-test-incremental-vs-intial-buffer
    "<?php\nnamespace myNamespace\n{\n    class myClass\n    {\n        public 
function myFunction()\n        {\n            echo 'my statement';\n        }\n 
   }\n}\n"
    "Integration-test 5 for regular PHP with namespaces, classes and functions, 
single deletion"
@@ -88,15 +87,15 @@
 
    ;; Make changes
    (goto-char 110)
-   (indent-according-to-mode))
+   (insert "    "))
 
   (phps-mode-test-incremental-vs-intial-buffer
-   "<?php\nnamespace myNamespace\n{\n    class myClass\n    {\n        public 
function myFunction()\n        {\n            echo 'my statement';\n        }\n 
   }\n}\n"
+   "<?php\nnamespace myNamespace\n{\n    class myClass\n    {\n        public 
function myFunction()\n        {\n        echo 'my statement';\n        }\n    
}\n}\n"
    "Integration-test 7 for regular PHP with namespaces, classes and functions, 
with multiple, isolated edits"
 
    ;; Make changes
    (goto-char 110)
-   (indent-according-to-mode)
+   (insert "    ")
 
    ;; Make changes
    (goto-char 28)
@@ -118,26 +117,59 @@
    (goto-char 41)
    (execute-kbd-macro (kbd "RET")))
 
+  (phps-mode-test-incremental-vs-intial-buffer
+   "<?php\necho 'my comment';\n"
+   "Integration-test 10 insert code at end of buffer"
+
+   ;; Make changes
+   (goto-char (point-max))
+
+   (insert "\necho 'my comments';\n"))
+
+  ;; TODO T_ENCAPSED_AND_WHITESPACE 72 should be removed by deletion (that is 
implicitly triggered by electric-pair-mode)
+  (phps-mode-test-incremental-vs-intial-buffer
+   ""
+   "Integration-test 11 insert code in empty buffer using macro, use several 
passes"
+
+   ;; Make changes - Pass 1
+   (goto-char (point-max))
+   (execute-kbd-macro "<?php")
+   (execute-kbd-macro (kbd "RET"))
+   (execute-kbd-macro "echo 'was here';")
+   (execute-kbd-macro (kbd "RET"))
+   (execute-kbd-macro (kbd "RET"))
+   (phps-mode-analyzer-process-changes)
+
+   ;; Pass 2
+   (execute-kbd-macro "if ($myCondition) {")
+   (execute-kbd-macro (kbd "RET"))
+   (execute-kbd-macro "echo 'my special condition';")
+   (phps-mode-analyzer-process-changes)
+
+   ;; Pass 3
+   (execute-kbd-macro (kbd "TAB"))
+   (execute-kbd-macro (kbd "RET")))
+
   )
 
-;; TODO Add functionality for (delete-backward-char) as well
+;; TODO Add tests for (delete-backward-char) as well
 (defun phps-mode-test-integration-whitespace-modifications ()
   "Test white-space modifications functions."
 
   (phps-mode-test-with-buffer
    "<?php\n$var = 'abc';\n\n$var2 = '123';\n"
    "Add newline between two assignments and inspect moved tokens and states"
-   ;; (message "Tokens %s" (phps-mode-lexer-get-tokens))
-   ;; (message "States: %s" (phps-mode-lexer-get-states))
+   ;; (message "Tokens %s" phps-mode-lexer-tokens)
+   ;; (message "States: %s" phps-mode-lexer-states)
 
    ;; Initial state
 
    ;; Tokens
-   (should (equal (phps-mode-lexer-get-tokens)
+   (should (equal phps-mode-lexer-tokens
                   '((T_OPEN_TAG 1 . 7) (T_VARIABLE 7 . 11) ("=" 12 . 13) 
(T_CONSTANT_ENCAPSED_STRING 14 . 19) (";" 19 . 20) (T_VARIABLE 22 . 27) ("=" 28 
. 29) (T_CONSTANT_ENCAPSED_STRING 30 . 35) (";" 35 . 36))))
 
    ;; States
-   (should (equal (phps-mode-lexer-get-states)
+   (should (equal phps-mode-lexer-states
                   '((35 36 1 nil) (30 35 1 nil) (28 29 1 nil) (22 27 1 nil) 
(19 20 1 nil) (14 19 1 nil) (12 13 1 nil) (7 11 1 nil) (1 7 1 nil))))
    
    ;; Insert newline
@@ -145,53 +177,53 @@
    (newline)
 
    ;; Final state
-   ;; (message "Tokens %s" (phps-mode-lexer-get-tokens))
-   ;; (message "States: %s" (phps-mode-lexer-get-states))
-   (phps-mode-lexer-run-incremental (current-buffer))
-   ;; (message "Tokens %s" (phps-mode-lexer-get-tokens))
-   ;; (message "States: %s" (phps-mode-lexer-get-states))
+   ;; (message "Tokens %s" phps-mode-lexer-tokens)
+   ;; (message "States: %s" phps-mode-lexer-states)
+   (phps-mode-analyzer-process-changes)
+   ;; (message "Tokens %s" phps-mode-lexer-tokens)
+   ;; (message "States: %s" phps-mode-lexer-states)
 
    ;; Tokens
-   (should (equal (phps-mode-lexer-get-tokens)
+   (should (equal phps-mode-lexer-tokens
                   '((T_OPEN_TAG 1 . 7) (T_VARIABLE 7 . 11) ("=" 12 . 13) 
(T_CONSTANT_ENCAPSED_STRING 14 . 19) (";" 19 . 20) (T_VARIABLE 23 . 28) ("=" 29 
. 30) (T_CONSTANT_ENCAPSED_STRING 31 . 36) (";" 36 . 37))))
 
    ;; States
-   (should (equal (phps-mode-lexer-get-states)
+   (should (equal phps-mode-lexer-states
                   '((36 37 1 nil) (31 36 1 nil) (29 30 1 nil) (23 28 1 nil) 
(19 20 1 nil) (14 19 1 nil) (12 13 1 nil) (7 11 1 nil) (1 7 1 nil)))))
 
   (phps-mode-test-with-buffer
    "<?php\n$var = 'abc';\n\n$var2 = '123';\n"
    "Delete backward char between two assignments and inspect moved tokens and 
states"
-   ;; (message "Tokens %s" (phps-mode-lexer-get-tokens))
-   ;; (message "States: %s" (phps-mode-lexer-get-states))
+   ;; (message "Tokens %s" phps-mode-lexer-tokens)
+   ;; (message "States: %s" phps-mode-lexer-states)
 
    ;; Initial state
 
    ;; Tokens
-   (should (equal (phps-mode-lexer-get-tokens)
+   (should (equal phps-mode-lexer-tokens
                   '((T_OPEN_TAG 1 . 7) (T_VARIABLE 7 . 11) ("=" 12 . 13) 
(T_CONSTANT_ENCAPSED_STRING 14 . 19) (";" 19 . 20) (T_VARIABLE 22 . 27) ("=" 28 
. 29) (T_CONSTANT_ENCAPSED_STRING 30 . 35) (";" 35 . 36))))
 
    ;; States
-   (should (equal (phps-mode-lexer-get-states)
+   (should (equal phps-mode-lexer-states
                   '((35 36 1 nil) (30 35 1 nil) (28 29 1 nil) (22 27 1 nil) 
(19 20 1 nil) (14 19 1 nil) (12 13 1 nil) (7 11 1 nil) (1 7 1 nil))))
 
    ;; Insert newline
    (goto-char 21)
    (delete-char 1)
 
-   (phps-mode-lexer-run-incremental (current-buffer))
+   (phps-mode-analyzer-process-changes)
 
    ;; Final state
    ;; (message "Modified buffer: '%s'" (buffer-substring-no-properties 
(point-min) (point-max)))
-   ;; (message "Tokens %s" (phps-mode-lexer-get-tokens))
-   ;; (message "States: %s" (phps-mode-lexer-get-states))
+   ;; (message "Tokens %s" phps-mode-lexer-tokens)
+   ;; (message "States: %s" phps-mode-lexer-states)
 
    ;; Tokens
-   (should (equal (phps-mode-lexer-get-tokens)
+   (should (equal phps-mode-lexer-tokens
                   '((T_OPEN_TAG 1 . 7) (T_VARIABLE 7 . 11) ("=" 12 . 13) 
(T_CONSTANT_ENCAPSED_STRING 14 . 19) (";" 19 . 20) (T_VARIABLE 21 . 26) ("=" 27 
. 28) (T_CONSTANT_ENCAPSED_STRING 29 . 34) (";" 34 . 35))))
 
    ;; States
-   (should (equal (phps-mode-lexer-get-states)
+   (should (equal phps-mode-lexer-states
                   '((34 35 1 nil) (29 34 1 nil) (27 28 1 nil) (21 26 1 nil) 
(19 20 1 nil) (14 19 1 nil) (12 13 1 nil) (7 11 1 nil) (1 7 1 nil)))))
 
   (phps-mode-test-with-buffer
@@ -199,52 +231,52 @@
    "Add newline inside if body after two assignments and inspect moved tokens 
and states"
 
    ;; Initial state
-   ;; (message "Tokens %s" (phps-mode-lexer-get-tokens))
-   ;; (message "States: %s" (phps-mode-lexer-get-states))
-   (should (equal (phps-mode-lexer-get-tokens)
+   ;; (message "Tokens %s" phps-mode-lexer-tokens)
+   ;; (message "States: %s" phps-mode-lexer-states)
+   (should (equal phps-mode-lexer-tokens
                   '((T_OPEN_TAG 1 . 7) (T_IF 7 . 9) ("(" 10 . 11) (T_STRING 11 
. 15) (")" 15 . 16) (":" 16 . 17) (T_VARIABLE 22 . 26) ("=" 27 . 28) 
(T_CONSTANT_ENCAPSED_STRING 29 . 34) (";" 34 . 35) (T_VARIABLE 40 . 45) ("=" 46 
. 47) (T_CONSTANT_ENCAPSED_STRING 48 . 53) (";" 53 . 54) (T_ENDIF 55 . 60) (";" 
60 . 61))))
 
-   (should (equal (phps-mode-lexer-get-states)
+   (should (equal phps-mode-lexer-states
                   '((60 61 1 nil) (55 60 1 nil) (53 54 1 nil) (48 53 1 nil) 
(46 47 1 nil) (40 45 1 nil) (34 35 1 nil) (29 34 1 nil) (27 28 1 nil) (22 26 1 
nil) (16 17 1 nil) (15 16 1 nil) (11 15 1 nil) (10 11 1 nil) (7 9 1 nil) (1 7 1 
nil))))
 
    ;; Insert newline and then indent
    (goto-char 54)
    (newline-and-indent)
 
-   (phps-mode-lexer-run-incremental (current-buffer))
+   (phps-mode-analyzer-process-changes)
 
    ;; Final state
-   ;; (message "Tokens %s" (phps-mode-lexer-get-tokens))
-   ;; (message "States: %s" (phps-mode-lexer-get-states))
-   (should (equal (phps-mode-lexer-get-tokens)
+   ;; (message "Tokens %s" phps-mode-lexer-tokens)
+   ;; (message "States: %s" phps-mode-lexer-states)
+   (should (equal phps-mode-lexer-tokens
                   '((T_OPEN_TAG 1 . 7) (T_IF 7 . 9) ("(" 10 . 11) (T_STRING 11 
. 15) (")" 15 . 16) (":" 16 . 17) (T_VARIABLE 22 . 26) ("=" 27 . 28) 
(T_CONSTANT_ENCAPSED_STRING 29 . 34) (";" 34 . 35) (T_VARIABLE 40 . 45) ("=" 46 
. 47) (T_CONSTANT_ENCAPSED_STRING 48 . 53) (";" 53 . 54) (T_ENDIF 60 . 65) (";" 
65 . 66))))
 
-   (should (equal (phps-mode-lexer-get-states)
+   (should (equal phps-mode-lexer-states
                   '((65 66 1 nil) (60 65 1 nil) (53 54 1 nil) (48 53 1 nil) 
(46 47 1 nil) (40 45 1 nil) (34 35 1 nil) (29 34 1 nil) (27 28 1 nil) (22 26 1 
nil) (16 17 1 nil) (15 16 1 nil) (11 15 1 nil) (10 11 1 nil) (7 9 1 nil) (1 7 1 
nil)))))
 
   (phps-mode-test-with-buffer
    "<?php\nif (true):\n    $var = \"abc\nanother line here\nmore text 
here\";\n    $var2 = '123';\nendif;"
    "Add test for inserting newlines inside token"
 
-   ;; (message "Before Tokens %s" (phps-mode-lexer-get-tokens))
-   ;; (message "Before States: %s" (phps-mode-lexer-get-states))
+   ;; (message "Before Tokens %s" phps-mode-lexer-tokens)
+   ;; (message "Before States: %s" phps-mode-lexer-states)
 
-   (should (equal (phps-mode-lexer-get-tokens)
+   (should (equal phps-mode-lexer-tokens
                   '((T_OPEN_TAG 1 . 7) (T_IF 7 . 9) ("(" 10 . 11) (T_STRING 11 
. 15) (")" 15 . 16) (":" 16 . 17) (T_VARIABLE 22 . 26) ("=" 27 . 28) 
(T_CONSTANT_ENCAPSED_STRING 29 . 67) (";" 67 . 68) (T_VARIABLE 73 . 78) ("=" 79 
. 80) (T_CONSTANT_ENCAPSED_STRING 81 . 86) (";" 86 . 87) (T_ENDIF 88 . 93) (";" 
93 . 94))))
-   (should (equal (phps-mode-lexer-get-states)
+   (should (equal phps-mode-lexer-states
                   '((93 94 1 nil) (88 93 1 nil) (86 87 1 nil) (81 86 1 nil) 
(79 80 1 nil) (73 78 1 nil) (67 68 1 nil) (29 67 1 nil) (27 28 1 nil) (22 26 1 
nil) (16 17 1 nil) (15 16 1 nil) (11 15 1 nil) (10 11 1 nil) (7 9 1 nil) (1 7 1 
nil))))
 
    ;; Insert newline and then indent
    (goto-char 51)
    (newline-and-indent)
 
-   (phps-mode-lexer-run-incremental (current-buffer))
+   (phps-mode-analyzer-process-changes)
 
-   ;; (message "After Tokens %s" (phps-mode-lexer-get-tokens))
-   ;; (message "After States: %s" (phps-mode-lexer-get-states))
-   (should (equal (phps-mode-lexer-get-tokens)
+   ;; (message "After Tokens %s" phps-mode-lexer-tokens)
+   ;; (message "After States: %s" phps-mode-lexer-states)
+   (should (equal phps-mode-lexer-tokens
                   '((T_OPEN_TAG 1 . 7) (T_IF 7 . 9) ("(" 10 . 11) (T_STRING 11 
. 15) (")" 15 . 16) (":" 16 . 17) (T_VARIABLE 22 . 26) ("=" 27 . 28) 
(T_CONSTANT_ENCAPSED_STRING 29 . 76) (";" 76 . 77) (T_VARIABLE 82 . 87) ("=" 88 
. 89) (T_CONSTANT_ENCAPSED_STRING 90 . 95) (";" 95 . 96) (T_ENDIF 97 . 102) 
(";" 102 . 103))))
-   (should (equal (phps-mode-lexer-get-states)
+   (should (equal phps-mode-lexer-states
                   '((102 103 1 nil) (97 102 1 nil) (95 96 1 nil) (90 95 1 nil) 
(88 89 1 nil) (82 87 1 nil) (76 77 1 nil) (29 76 1 nil) (27 28 1 nil) (22 26 1 
nil) (16 17 1 nil) (15 16 1 nil) (11 15 1 nil) (10 11 1 nil) (7 9 1 nil) (1 7 1 
nil)))))
 
   (phps-mode-test-with-buffer
@@ -256,7 +288,7 @@
    (goto-char 32)
    (newline-and-indent)
 
-   (phps-mode-lexer-run-incremental (current-buffer))
+   (phps-mode-analyzer-process-changes)
 
    (should (equal (phps-mode-functions-get-imenu) '(("myFunctionA" . 16) 
("myFunctionB" . 43)))))
 
@@ -265,9 +297,11 @@
 (defun phps-mode-test-integration ()
   "Run test for integration."
   (setq debug-on-error t)
-  (setq phps-mode-runtime-debug t)
-  (phps-mode-test-integration-incremental)
-  (phps-mode-test-integration-whitespace-modifications))
+  ;; (setq phps-mode-runtime-debug t)
+  ;; (setq phps-mode-analyzer-process-on-indent-and-imenu t)
+  (phps-mode-test-integration-incremental-vs-initial-buffers)
+  ;; (phps-mode-test-integration-whitespace-modifications)
+  )
 
 (phps-mode-test-integration)
 
diff --git a/test/phps-mode-test-lexer.el b/test/phps-mode-test-lexer.el
index 1abf3ce..ed3ba44 100644
--- a/test/phps-mode-test-lexer.el
+++ b/test/phps-mode-test-lexer.el
@@ -35,38 +35,38 @@
   (phps-mode-test-with-buffer
    "<?php\t$öar=1; exit $var;\t?>"
    "Simple PHP with two expression"
-   (should (equal (phps-mode-lexer-get-tokens)
+   (should (equal phps-mode-lexer-tokens
                   '((T_OPEN_TAG 1 . 7) (T_VARIABLE 7 . 11) ("=" 11 . 12) 
(T_LNUMBER 12 . 13) (";" 13 . 14) (T_EXIT 15 . 19) (T_VARIABLE 20 . 24) (";" 24 
. 25) (";" 26 . 28) (T_CLOSE_TAG 26 . 28)))))
 
   (phps-mode-test-with-buffer
    "<?php\nexit;\n?>"
    "Minimal PHP expression"
-   (should (equal (phps-mode-lexer-get-tokens)
+   (should (equal phps-mode-lexer-tokens
                   '((T_OPEN_TAG 1 . 7) (T_EXIT 7 . 11) (";" 11 . 12) (";" 13 . 
15) (T_CLOSE_TAG 13 . 15)))))
 
   (phps-mode-test-with-buffer
    "<?php exit; ?>"
    "Small PHP file"
-   (should (equal (phps-mode-lexer-get-tokens)
+   (should (equal phps-mode-lexer-tokens
                   '((T_OPEN_TAG 1 . 7) (T_EXIT 7 . 11) (";" 11 . 12) (";" 13 . 
15) (T_CLOSE_TAG 13 . 15)))))
 
   (phps-mode-test-with-buffer
    "<html><head>blabla</head<body>\n\n \t<?php\nexit;\n?>\n\n</body></html>"
    "Mixed inline HTML and PHP"
-   (should (equal (phps-mode-lexer-get-tokens)
+   (should (equal phps-mode-lexer-tokens
                   '((T_INLINE_HTML 1 . 35) (T_OPEN_TAG 35 . 41) (T_EXIT 41 . 
45) (";" 45 . 46) (";" 47 . 49) (T_CLOSE_TAG 47 . 49) (T_INLINE_HTML 49 . 
65)))))
 
   (phps-mode-test-with-buffer
    "\n\n \t<html><title>echo 
\"Blaha\";</title><?php\n\n\nexit?>\n\n<html><random /></html><?php exit ?>"
    "Another mixed inline HTML and PHP"
-   (should (equal (phps-mode-lexer-get-tokens)
+   (should (equal phps-mode-lexer-tokens
                   '((T_INLINE_HTML 1 . 39) (T_OPEN_TAG 39 . 45) (T_EXIT 47 . 
51) (";" 51 . 53) (T_CLOSE_TAG 51 . 53) (T_INLINE_HTML 53 . 78) (T_OPEN_TAG 78 
. 84) (T_EXIT 84 . 88) (";" 89 . 91) (T_CLOSE_TAG 89 . 91)))))
 
   (phps-mode-test-with-buffer
    "<?php\n\n$k = 'key';\n\necho \"\\$a['{$k}']\";"
    "A tricky case where variable inside double quote is escaped"
-   ;; (message "Tokens: %s" (phps-mode-lexer-get-tokens))
-   (should (equal (phps-mode-lexer-get-tokens)
+   ;; (message "Tokens: %s" phps-mode-lexer-tokens)
+   (should (equal phps-mode-lexer-tokens
                   '((T_OPEN_TAG 1 . 7) (T_VARIABLE 8 . 10) ("=" 11 . 12) 
(T_CONSTANT_ENCAPSED_STRING 13 . 18) (";" 18 . 19) (T_ECHO 21 . 25) ("\"" 26 . 
27) (T_ENCAPSED_AND_WHITESPACE 27 . 32) (T_CURLY_OPEN 32 . 33) (T_VARIABLE 33 . 
35) ("}" 35 . 36) (T_CONSTANT_ENCAPSED_STRING 36 . 38) ("\"" 38 . 39) (";" 39 . 
40)))))
 
   )
@@ -77,115 +77,115 @@
   (phps-mode-test-with-buffer
    "<?php echo $vür = array('');"
    "Simple PHP via array declaration"
-   (should (equal (phps-mode-lexer-get-tokens)
+   (should (equal phps-mode-lexer-tokens
                   '((T_OPEN_TAG 1 . 7) (T_ECHO 7 . 11) (T_VARIABLE 12 . 16) 
("=" 17 . 18) (T_ARRAY 19 . 24) ("(" 24 . 25) (T_CONSTANT_ENCAPSED_STRING 25 . 
27) (")" 27 . 28) (";" 28 . 29)))))
 
   (phps-mode-test-with-buffer
    "<?php if 
(empty($parameters[self::PARAMETER_CONFIGURATION_INTERNAL_FILENAME])) { 
$parameters[self::PARAMETER_CONFIGURATION_INTERNAL_FILENAME] = ''; }"
    "Complex PHP with conditional"
-   (should (equal (phps-mode-lexer-get-tokens)
+   (should (equal phps-mode-lexer-tokens
                   '((T_OPEN_TAG 1 . 7) (T_IF 7 . 9) ("(" 10 . 11) (T_EMPTY 11 
. 16) ("(" 16 . 17) (T_VARIABLE 17 . 28) ("[" 28 . 29) (T_STRING 29 . 33) 
(T_PAAMAYIM_NEKUDOTAYIM 33 . 35) (T_STRING 35 . 76) ("]" 76 . 77) (")" 77 . 78) 
(")" 78 . 79) ("{" 80 . 81) (T_VARIABLE 82 . 93) ("[" 93 . 94) (T_STRING 94 . 
98) (T_PAAMAYIM_NEKUDOTAYIM 98 . 100) (T_STRING 100 . 141) ("]" 141 . 142) ("=" 
143 . 144) (T_CONSTANT_ENCAPSED_STRING 145 . 147) (";" 147 . 148) ("}" 149 . 
150)))))
 
   (phps-mode-test-with-buffer
    "<?php echo $var = array(\"\");"
    "Simple PHP with empty array assignment"
-   (should (equal (phps-mode-lexer-get-tokens)
+   (should (equal phps-mode-lexer-tokens
                   '((T_OPEN_TAG 1 . 7) (T_ECHO 7 . 11) (T_VARIABLE 12 . 16) 
("=" 17 . 18) (T_ARRAY 19 . 24) ("(" 24 . 25) (T_CONSTANT_ENCAPSED_STRING 25 . 
27) (")" 27 . 28) (";" 28 . 29)))))
 
   (phps-mode-test-with-buffer
    "<?php echo $var = array('abc' => '123');"
    "Simple PHP with associative array assignment"
-   (should (equal (phps-mode-lexer-get-tokens)
+   (should (equal phps-mode-lexer-tokens
                   '((T_OPEN_TAG 1 . 7) (T_ECHO 7 . 11) (T_VARIABLE 12 . 16) 
("=" 17 . 18) (T_ARRAY 19 . 24) ("(" 24 . 25) (T_CONSTANT_ENCAPSED_STRING 25 . 
30) (T_DOUBLE_ARROW 31 . 33) (T_CONSTANT_ENCAPSED_STRING 34 . 39) (")" 39 . 40) 
(";" 40 . 41)))))
 
   (phps-mode-test-with-buffer
    "<?php $var = []; "
    "PHP with short-handed array declaration assignment"
-   (should (equal (phps-mode-lexer-get-tokens)
+   (should (equal phps-mode-lexer-tokens
                   '((T_OPEN_TAG 1 . 7) (T_VARIABLE 7 . 11) ("=" 12 . 13) ("[" 
14 . 15) ("]" 15 . 16) (";" 16 . 17)))))
 
   (phps-mode-test-with-buffer
    "<?php $var = ''; $var = 'abc'; "
    "PHP with string assignments"
-   (should (equal (phps-mode-lexer-get-tokens)
+   (should (equal phps-mode-lexer-tokens
                   '((T_OPEN_TAG 1 . 7) (T_VARIABLE 7 . 11) ("=" 12 . 13) 
(T_CONSTANT_ENCAPSED_STRING 14 . 16) (";" 16 . 17) (T_VARIABLE 18 . 22) ("=" 23 
. 24) (T_CONSTANT_ENCAPSED_STRING 25 . 30) (";" 30 . 31)))))
 
   (phps-mode-test-with-buffer
    "<?php\nswitch (myRandomCondition()) {\ncase 'Something here':\necho 
'Something else here';\n}\n"
    "Switch case PHP"
    ;; (message "Tokens: %s" phps-mode-lexer-tokens)
-   (should (equal (phps-mode-lexer-get-tokens)
+   (should (equal phps-mode-lexer-tokens
                   '((T_OPEN_TAG 1 . 7) (T_SWITCH 7 . 13) ("(" 14 . 15) 
(T_STRING 15 . 32) ("(" 32 . 33) (")" 33 . 34) (")" 34 . 35) ("{" 36 . 37) 
(T_CASE 38 . 42) (T_CONSTANT_ENCAPSED_STRING 43 . 59) (":" 59 . 60) (T_ECHO 61 
. 65) (T_CONSTANT_ENCAPSED_STRING 66 . 87) (";" 87 . 88) ("}" 89 . 90)))))
 
   (phps-mode-test-with-buffer
    "<?php $var = \"\"; $var = \"abc\"; $var = \"abc\\def\\ghj\";"
    "PHP with three string assignments"
    ;; (message "Tokens: %s" phps-mode-lexer-tokens)
-   (should (equal (phps-mode-lexer-get-tokens)
+   (should (equal phps-mode-lexer-tokens
                   '((T_OPEN_TAG 1 . 7) (T_VARIABLE 7 . 11) ("=" 12 . 13) 
(T_CONSTANT_ENCAPSED_STRING 14 . 16) (";" 16 . 17) (T_VARIABLE 18 . 22) ("=" 23 
. 24) (T_CONSTANT_ENCAPSED_STRING 25 . 30) (";" 30 . 31) (T_VARIABLE 32 . 36) 
("=" 37 . 38) (T_CONSTANT_ENCAPSED_STRING 39 . 52) (";" 52 . 53)))))
 
   (phps-mode-test-with-buffer
    "<?php echo isset($backtrace[1]['file']) ? 'yes' : 'no'; "
    "PHP with short-handed conditional echo"
-   (should (equal (phps-mode-lexer-get-tokens)
+   (should (equal phps-mode-lexer-tokens
                   '((T_OPEN_TAG 1 . 7) (T_ECHO 7 . 11) (T_ISSET 12 . 17) ("(" 
17 . 18) (T_VARIABLE 18 . 28) ("[" 28 . 29) (T_LNUMBER 29 . 30) ("]" 30 . 31) 
("[" 31 . 32) (T_CONSTANT_ENCAPSED_STRING 32 . 38) ("]" 38 . 39) (")" 39 . 40) 
("?" 41 . 42) (T_CONSTANT_ENCAPSED_STRING 43 . 48) (":" 49 . 50) 
(T_CONSTANT_ENCAPSED_STRING 51 . 55) (";" 55 . 56)))))
 
   (phps-mode-test-with-buffer
    "<?php myFunction(); "
    "A single function call"
-   (should (equal (phps-mode-lexer-get-tokens)
+   (should (equal phps-mode-lexer-tokens
                   '((T_OPEN_TAG 1 . 7) (T_STRING 7 . 17) ("(" 17 . 18) (")" 18 
. 19) (";" 19 . 20)))))
 
   (phps-mode-test-with-buffer
    "<?php // echo 'random';?><!--</div>-->"
    "Commented out PHP expression and inline-html"
-   (should (equal (phps-mode-lexer-get-tokens)
+   (should (equal phps-mode-lexer-tokens
                   '((T_OPEN_TAG 1 . 7) (T_COMMENT 7 . 24) (";" 24 . 26) 
(T_CLOSE_TAG 24 . 26) (T_INLINE_HTML 26 . 39)))))
 
   (phps-mode-test-with-buffer
    "<?php //echo $contact_position;?><!--</div>-->"
    "Commented out PHP expression and inline-html 2"
-   (should (equal (phps-mode-lexer-get-tokens)
+   (should (equal phps-mode-lexer-tokens
                   '((T_OPEN_TAG 1 . 7) (T_COMMENT 7 . 32) (";" 32 . 34) 
(T_CLOSE_TAG 32 . 34) (T_INLINE_HTML 34 . 47)))))
 
   (phps-mode-test-with-buffer
    "<?php echo isset($backtrace[1]['file']) ? 'yes' : 'no';\n//a random 
comment\n// another random comment\n/**\n * More comments\n* More\n **/\necho 
$backtrace; ?>"
    "Conditional echo, comment and doc-comment block"
-   (should (equal (phps-mode-lexer-get-tokens)
+   (should (equal phps-mode-lexer-tokens
                   '((T_OPEN_TAG 1 . 7) (T_ECHO 7 . 11) (T_ISSET 12 . 17) ("(" 
17 . 18) (T_VARIABLE 18 . 28) ("[" 28 . 29) (T_LNUMBER 29 . 30) ("]" 30 . 31) 
("[" 31 . 32) (T_CONSTANT_ENCAPSED_STRING 32 . 38) ("]" 38 . 39) (")" 39 . 40) 
("?" 41 . 42) (T_CONSTANT_ENCAPSED_STRING 43 . 48) (":" 49 . 50) 
(T_CONSTANT_ENCAPSED_STRING 51 . 55) (";" 55 . 56) (T_COMMENT 57 . 75) 
(T_COMMENT 76 . 101) (T_DOC_COMMENT 102 . 134) (T_ECHO 135 . 139) (T_VARIABLE 
140 . 150) (";" 150 . 151) (";" 152 . 154)  [...]
 
   (phps-mode-test-with-buffer
    "<?php forgerarray($arg1, $arg2)"
    "A function call containing keywords in its name"
-   (should (equal (phps-mode-lexer-get-tokens)
+   (should (equal phps-mode-lexer-tokens
                   '((T_OPEN_TAG 1 . 7) (T_STRING 7 . 18) ("(" 18 . 19) 
(T_VARIABLE 19 . 24) ("," 24 . 25) (T_VARIABLE 26 . 31) (")" 31 . 32)))))
 
   (phps-mode-test-with-buffer
    "<?php\n$username = $_GET['user'] ?? 
'nobody';\n$this->request->data['comments']['user_id'] ??= 'value';\n"
    "Coalescing comparison operator and coalescing assignment operator"
-   ;; (message "Tokens: %s" (phps-mode-lexer-get-tokens))
-   (should (equal (phps-mode-lexer-get-tokens)
+   ;; (message "Tokens: %s" phps-mode-lexer-tokens)
+   (should (equal phps-mode-lexer-tokens
                   '((T_OPEN_TAG 1 . 7) (T_VARIABLE 7 . 16) ("=" 17 . 18) 
(T_VARIABLE 19 . 24) ("[" 24 . 25) (T_CONSTANT_ENCAPSED_STRING 25 . 31) ("]" 31 
. 32) (T_COALESCE 33 . 35) (T_CONSTANT_ENCAPSED_STRING 36 . 44) (";" 44 . 45) 
(T_VARIABLE 46 . 51) (T_OBJECT_OPERATOR 51 . 53) (T_STRING 53 . 60) 
(T_OBJECT_OPERATOR 60 . 62) (T_STRING 62 . 66) ("[" 66 . 67) 
(T_CONSTANT_ENCAPSED_STRING 67 . 77) ("]" 77 . 78) ("[" 78 . 79) 
(T_CONSTANT_ENCAPSED_STRING 79 . 88) ("]" 88 . 89) (T_COALESCE_EQUA [...]
 
   (phps-mode-test-with-buffer
    "<?php\necho $array['abc'];\necho \"My $array[12] random statement\";\n"
    "Long inside array offset"
-   ;; (message "Tokens: %s" (phps-mode-lexer-get-tokens))
-   (should (equal (phps-mode-lexer-get-tokens)
+   ;; (message "Tokens: %s" phps-mode-lexer-tokens)
+   (should (equal phps-mode-lexer-tokens
                   '((T_OPEN_TAG 1 . 7) (T_ECHO 7 . 11) (T_VARIABLE 12 . 18) 
("[" 18 . 19) (T_CONSTANT_ENCAPSED_STRING 19 . 24) ("]" 24 . 25) (";" 25 . 26) 
(T_ECHO 27 . 31) ("\"" 32 . 33) (T_ENCAPSED_AND_WHITESPACE 33 . 36) (T_VARIABLE 
36 . 43) (T_NUM_STRING 43 . 45) ("]" 45 . 46) (T_CONSTANT_ENCAPSED_STRING 46 . 
63) ("\"" 63 . 64) (";" 64 . 65)))))
 
   (phps-mode-test-with-buffer
    "<?php\n/*my comment */\n/** my doc comment */"
    "Comment vs doc-comment"
-   ;; (message "Tokens: %s" (phps-mode-lexer-get-tokens))
-   (should (equal (phps-mode-lexer-get-tokens)
+   ;; (message "Tokens: %s" phps-mode-lexer-tokens)
+   (should (equal phps-mode-lexer-tokens
                   '((T_OPEN_TAG 1 . 7) (T_COMMENT 7 . 22) (T_DOC_COMMENT 23 . 
44)))))
 
   ;; (phps-mode-test-with-buffer
   ;;  "<?php ??= $var EXIT die function return yield from yield try catch 
finally throw if elseif endif else while endwhile do for endfor foreach 
endforeach declare enddeclare instanceof as switch endswitch case default break 
continue goto echo print class interface trait extends implements :: \\ ... ?? 
new clone var (int) (integer) (real) (double) (float) (string) (binary) (array) 
(object) (boolean) (bool) (unset) eval include include_once require 
require_once namespace use insteadof gl [...]
   ;;  "All PHP tokens after each other"
-  ;;  (message "Tokens: %s" (phps-mode-lexer-get-tokens))
-  ;;  (should (equal (phps-mode-lexer-get-tokens)
+  ;;  (message "Tokens: %s" phps-mode-lexer-tokens)
+  ;;  (should (equal phps-mode-lexer-tokens
   ;;                 '((T_OPEN_TAG 1 . 7) (T_COALESCE_EQUAL 7 . 10) 
(T_VARIABLE 11 . 15) (T_EXIT 16 . 20) (T_DIE 21 . 24) (T_FUNCTION 25 . 33) 
(T_RETURN 34 . 40) (T_YIELD_FROM 41 . 52) (T_YIELD 52 . 57) (T_TRY 58 . 61) 
(T_CATCH 62 . 67) (T_FINALLY 68 . 75) (T_THROW 76 . 81) (T_IF 82 . 84) 
(T_ELSEIF 85 . 91) (T_ENDIF 92 . 97) (T_ELSE 98 . 102) (T_WHILE 103 . 108) 
(T_ENDWHILE 109 . 117) (T_DO 118 . 120) (T_FOR 121 . 124) (T_ENDFOR 125 . 131) 
(T_FOREACH 132 . 139) (T_ENDFOREACH 140 . 150) ( [...]
 
 
@@ -197,111 +197,111 @@
   (phps-mode-test-with-buffer
    "<?php $var->property;"
    "Object property"
-   (should (equal (phps-mode-lexer-get-tokens)
+   (should (equal phps-mode-lexer-tokens
                   '((T_OPEN_TAG 1 . 7) (T_VARIABLE 7 . 11) (T_OBJECT_OPERATOR 
11 . 13) (T_STRING 13 . 21) (";" 21 . 22)))))
 
   (phps-mode-test-with-buffer
    "<?php echo \"My $variable is here\"; echo \"you know\";"
    "Double quoted strings with variables"
-   (should (equal (phps-mode-lexer-get-tokens)
+   (should (equal phps-mode-lexer-tokens
                   '((T_OPEN_TAG 1 . 7) (T_ECHO 7 . 11) ("\"" 12 . 13) 
(T_ENCAPSED_AND_WHITESPACE 13 . 16) (T_VARIABLE 16 . 25) 
(T_CONSTANT_ENCAPSED_STRING 25 . 33) ("\"" 33 . 34) (";" 34 . 35) (T_ECHO 36 . 
40) (T_CONSTANT_ENCAPSED_STRING 41 . 51) (";" 51 . 52)))))
 
   (phps-mode-test-with-buffer
    "<?php echo \"My ${variable} is here 1\";"
    "Double quoted string with variable"
-   (should (equal (phps-mode-lexer-get-tokens)
+   (should (equal phps-mode-lexer-tokens
                   '((T_OPEN_TAG 1 . 7) (T_ECHO 7 . 11) ("\"" 12 . 13) 
(T_ENCAPSED_AND_WHITESPACE 13 . 16) (T_DOLLAR_OPEN_CURLY_BRACES 16 . 18) 
(T_STRING_VARNAME 18 . 26) ("}" 26 . 27) (T_CONSTANT_ENCAPSED_STRING 27 . 37) 
("\"" 37 . 38) (";" 38 . 39)))))
 
   (phps-mode-test-with-buffer
    "<?php echo \"Mine {$first_variable} is here and my $second is there.\";"
    "Another double quoted string with variable"
-   (should (equal (phps-mode-lexer-get-tokens)
+   (should (equal phps-mode-lexer-tokens
                   '((T_OPEN_TAG 1 . 7) (T_ECHO 7 . 11) ("\"" 12 . 13) 
(T_ENCAPSED_AND_WHITESPACE 13 . 18) (T_CURLY_OPEN 18 . 19) (T_VARIABLE 19 . 34) 
("}" 34 . 35) (T_CONSTANT_ENCAPSED_STRING 35 . 51) (T_VARIABLE 51 . 58) 
(T_CONSTANT_ENCAPSED_STRING 58 . 68) ("\"" 68 . 69) (";" 69 . 70)))))
 
   (phps-mode-test-with-buffer
    "<?php echo \" Hello $variable[0], how are you?\";"
    nil
-   (should (equal (phps-mode-lexer-get-tokens)
+   (should (equal phps-mode-lexer-tokens
                   '((T_OPEN_TAG 1 . 7) (T_ECHO 7 . 11) ("\"" 12 . 13) 
(T_ENCAPSED_AND_WHITESPACE 13 . 20) (T_VARIABLE 20 . 30) (T_NUM_STRING 30 . 31) 
("]" 31 . 32) (T_CONSTANT_ENCAPSED_STRING 32 . 46) ("\"" 46 . 47) (";" 47 . 
48)))))
 
   ;; HEREDOC
   (phps-mode-test-with-buffer
    "<?php echo <<<\"MYLABEL\"\nline 1\n line 2\nMYLABEL\n;"
    nil
-   (should (equal (phps-mode-lexer-get-tokens)
+   (should (equal phps-mode-lexer-tokens
                   '((T_OPEN_TAG 1 . 7) (T_ECHO 7 . 11) (T_START_HEREDOC 12 . 
25) (T_ENCAPSED_AND_WHITESPACE 25 . 39) (T_END_HEREDOC 39 . 47) (";" 48 . 
49)))))
 
   (phps-mode-test-with-buffer
    "<?php echo <<<MYLABEL\nline 1\n line 2\nMYLABEL\n;"
    nil
-   (should (equal (phps-mode-lexer-get-tokens)
+   (should (equal phps-mode-lexer-tokens
                   '((T_OPEN_TAG 1 . 7) (T_ECHO 7 . 11) (T_START_HEREDOC 12 . 
23) (T_ENCAPSED_AND_WHITESPACE 23 . 37) (T_END_HEREDOC 37 . 45) (";" 46 . 
47)))))
 
   (phps-mode-test-with-buffer
    "<?php echo <<<\"MYLABEL\"\nMYLABEL\n"
    nil
-   (should (equal (phps-mode-lexer-get-tokens)
+   (should (equal phps-mode-lexer-tokens
                   '((T_OPEN_TAG 1 . 7) (T_ECHO 7 . 11) (T_START_HEREDOC 12 . 
25) (T_END_HEREDOC 25 . 33)))))
 
   ;; Test heredoc with variables $, {$, ${ here
   (phps-mode-test-with-buffer
    "<?php echo <<<\"MYLABEL\"\nline 1 $variable1\n line 2\n${variable2} line 
3\n line {$variable3} here\nline 5 $variable[3] here\nMYLABEL;\n"
    nil
-   (should (equal (phps-mode-lexer-get-tokens)
+   (should (equal phps-mode-lexer-tokens
                   '((T_OPEN_TAG 1 . 7) (T_ECHO 7 . 11) (T_START_HEREDOC 12 . 
25) (T_ENCAPSED_AND_WHITESPACE 25 . 32) (T_VARIABLE 32 . 42) 
(T_ENCAPSED_AND_WHITESPACE 42 . 51) (T_DOLLAR_OPEN_CURLY_BRACES 51 . 53) 
(T_STRING_VARNAME 53 . 62) ("}" 62 . 63) (T_ENCAPSED_AND_WHITESPACE 63 . 77) 
(T_CURLY_OPEN 77 . 78) (T_VARIABLE 78 . 88) ("}" 88 . 89) 
(T_ENCAPSED_AND_WHITESPACE 89 . 102) (T_VARIABLE 102 . 112) (T_NUM_STRING 112 . 
113) ("]" 113 . 114) (T_ENCAPSED_AND_WHITESPACE 114 . 119) (T_END_ [...]
 
   ;; Nowdoc
   (phps-mode-test-with-buffer
    "<?php echo <<<'MYLABEL'\nline 1\n line 2\nMYLABEL;\n"
    nil
-   (should (equal (phps-mode-lexer-get-tokens)
+   (should (equal phps-mode-lexer-tokens
                   '((T_OPEN_TAG 1 . 7) (T_ECHO 7 . 11) (T_START_HEREDOC 12 . 
25) (T_ENCAPSED_AND_WHITESPACE 25 . 39) (T_END_HEREDOC 39 . 47) (";" 47 . 
48)))))
 
   ;; Backquotes
   (phps-mode-test-with-buffer
    "<?php `echo \"HELLO\"`;"
    nil
-   (should (equal (phps-mode-lexer-get-tokens)
+   (should (equal phps-mode-lexer-tokens
                   '((T_OPEN_TAG 1 . 7) ("`" 7 . 8) (T_CONSTANT_ENCAPSED_STRING 
8 . 20) ("`" 20 . 21) (";" 21 . 22)))))
 
   (phps-mode-test-with-buffer
    "<?php `echo \"HELLO $variable or {$variable2} or ${variable3} or 
$variable[index][0] here\"`;"
    nil
-   (should (equal (phps-mode-lexer-get-tokens)
+   (should (equal phps-mode-lexer-tokens
                   '((T_OPEN_TAG 1 . 7) ("`" 7 . 8) (T_CONSTANT_ENCAPSED_STRING 
8 . 20) (T_VARIABLE 20 . 29) (T_CONSTANT_ENCAPSED_STRING 29 . 33) (T_CURLY_OPEN 
33 . 34) (T_VARIABLE 34 . 44) ("}" 44 . 45) (T_CONSTANT_ENCAPSED_STRING 45 . 
49) (T_DOLLAR_OPEN_CURLY_BRACES 49 . 51) (T_STRING_VARNAME 51 . 60) ("}" 60 . 
61) (T_CONSTANT_ENCAPSED_STRING 61 . 65) (T_VARIABLE 65 . 75) (T_STRING 75 . 
80) ("]" 80 . 81) (T_CONSTANT_ENCAPSED_STRING 81 . 90) ("`" 90 . 91) (";" 91 . 
92)))))
 
   (phps-mode-test-with-buffer
    "<?php $wpdb->posts; ?>"
    nil
-   (should (equal (phps-mode-lexer-get-tokens)
+   (should (equal phps-mode-lexer-tokens
                   '((T_OPEN_TAG 1 . 7) (T_VARIABLE 7 . 12) (T_OBJECT_OPERATOR 
12 . 14) (T_STRING 14 . 19) (";" 19 . 20) (";" 21 . 23) (T_CLOSE_TAG 21 . 
23)))))
 
   (phps-mode-test-with-buffer
    "<?php $var = \"SELECT post_parent FROM $wpdb->posts WHERE ID = 
'\".$id.\"'\"; ?>"
    nil
-   ;; (message "Tokens 1: %s" (phps-mode-lexer-get-tokens))
-   (should (equal (phps-mode-lexer-get-tokens)
+   ;; (message "Tokens 1: %s" phps-mode-lexer-tokens)
+   (should (equal phps-mode-lexer-tokens
                   '((T_OPEN_TAG 1 . 7) (T_VARIABLE 7 . 11) ("=" 12 . 13) ("\"" 
14 . 15) (T_ENCAPSED_AND_WHITESPACE 15 . 39) (T_VARIABLE 39 . 44) 
(T_OBJECT_OPERATOR 44 . 46) (T_STRING 46 . 51) (T_CONSTANT_ENCAPSED_STRING 51 . 
64) ("\"" 64 . 65) ("." 65 . 66) (T_VARIABLE 66 . 69) ("." 69 . 70) 
(T_CONSTANT_ENCAPSED_STRING 70 . 73) (";" 73 . 74) (";" 75 . 77) (T_CLOSE_TAG 
75 . 77)))))
 
   (phps-mode-test-with-buffer
    "<?php $wpdb->get_var(\"SELECT post_parent FROM $wpdb->posts WHERE ID = 
'\".$id.\"'\"); ?>"
    nil
-   ;; (message "Tokens 2: %s" (phps-mode-lexer-get-tokens))
-   (should (equal (phps-mode-lexer-get-tokens)
+   ;; (message "Tokens 2: %s" phps-mode-lexer-tokens)
+   (should (equal phps-mode-lexer-tokens
                   '((T_OPEN_TAG 1 . 7) (T_VARIABLE 7 . 12) (T_OBJECT_OPERATOR 
12 . 14) (T_STRING 14 . 21) ("(" 21 . 22) ("\"" 22 . 23) 
(T_ENCAPSED_AND_WHITESPACE 23 . 47) (T_VARIABLE 47 . 52) (T_OBJECT_OPERATOR 52 
. 54) (T_STRING 54 . 59) (T_CONSTANT_ENCAPSED_STRING 59 . 72) ("\"" 72 . 73) 
("." 73 . 74) (T_VARIABLE 74 . 77) ("." 77 . 78) (T_CONSTANT_ENCAPSED_STRING 78 
. 81) (")" 81 . 82) (";" 82 . 83) (";" 84 . 86) (T_CLOSE_TAG 84 . 86)))))
 
   (phps-mode-test-with-buffer
    "<?php $this->add($option['style']['selectors'], array('background' => 
\"{$value['color']} url('{$value['image']}')\"));"
    "Complex tokens with tokens inside double-quoted string"
-   ;; (message "Tokens 2: %s" (phps-mode-lexer-get-tokens))
-   (should (equal (phps-mode-lexer-get-tokens)
+   ;; (message "Tokens 2: %s" phps-mode-lexer-tokens)
+   (should (equal phps-mode-lexer-tokens
                   '((T_OPEN_TAG 1 . 7) (T_VARIABLE 7 . 12) (T_OBJECT_OPERATOR 
12 . 14) (T_STRING 14 . 17) ("(" 17 . 18) (T_VARIABLE 18 . 25) ("[" 25 . 26) 
(T_CONSTANT_ENCAPSED_STRING 26 . 33) ("]" 33 . 34) ("[" 34 . 35) 
(T_CONSTANT_ENCAPSED_STRING 35 . 46) ("]" 46 . 47) ("," 47 . 48) (T_ARRAY 49 . 
54) ("(" 54 . 55) (T_CONSTANT_ENCAPSED_STRING 55 . 67) (T_DOUBLE_ARROW 68 . 70) 
("\"" 71 . 72) (T_ENCAPSED_AND_WHITESPACE 72 . 72) (T_CURLY_OPEN 72 . 73) 
(T_VARIABLE 73 . 79) ("[" 79 . 80) (T_C [...]
 
   (phps-mode-test-with-buffer
    "<?php\n$var = <<<EOD\nrandom {$value['color']->property} again 
{$value->head()}; random\nEOD;\n"
    "Complex tokens with tokens inside HEREDOC string"
-   ;; (message "Tokens 2: %s" (phps-mode-lexer-get-tokens))
-   (should (equal (phps-mode-lexer-get-tokens)
+   ;; (message "Tokens 2: %s" phps-mode-lexer-tokens)
+   (should (equal phps-mode-lexer-tokens
                   '((T_OPEN_TAG 1 . 7) (T_VARIABLE 7 . 11) ("=" 12 . 13) 
(T_START_HEREDOC 14 . 21) (T_ENCAPSED_AND_WHITESPACE 21 . 28) (T_CURLY_OPEN 28 
. 29) (T_VARIABLE 29 . 35) ("[" 35 . 36) (T_CONSTANT_ENCAPSED_STRING 36 . 43) 
("]" 43 . 44) (T_OBJECT_OPERATOR 44 . 46) (T_STRING 46 . 54) ("}" 54 . 55) 
(T_ENCAPSED_AND_WHITESPACE 55 . 62) (T_CURLY_OPEN 62 . 63) (T_VARIABLE 63 . 69) 
(T_OBJECT_OPERATOR 69 . 71) (T_STRING 71 . 75) ("(" 75 . 76) (")" 76 . 77) ("}" 
77 . 78) (T_ENCAPSED_AND_WH [...]
 
   )
@@ -312,13 +312,13 @@
   (phps-mode-test-with-buffer
    "<?php\nnamespace MyNameSpace{\n\tclass MyClass {\n\t\tpublic function 
__construct() {\n\t\t\texit;\n\t\t}\n\t}\n}\n"
    "Object-oriented namespace file"
-   (should (equal (phps-mode-lexer-get-tokens)
+   (should (equal phps-mode-lexer-tokens
                   '((T_OPEN_TAG 1 . 7) (T_NAMESPACE 7 . 16) (T_STRING 17 . 28) 
("{" 28 . 29) (T_CLASS 31 . 36) (T_STRING 37 . 44) ("{" 45 . 46) (T_PUBLIC 49 . 
55) (T_FUNCTION 56 . 64) (T_STRING 65 . 76) ("(" 76 . 77) (")" 77 . 78) ("{" 79 
. 80) (T_EXIT 84 . 88) (";" 88 . 89) ("}" 92 . 93) ("}" 95 . 96) ("}" 97 . 
98)))))
 
   (phps-mode-test-with-buffer
    "<?php\nNAMESPACE MyNameSpace;\nCLASS MyClass {\n\tpublic function 
__construct() {\n\t\texit;\n\t}\n}\n"
    "Capitalized object-oriented namespace file"
-   (should (equal (phps-mode-lexer-get-tokens)
+   (should (equal phps-mode-lexer-tokens
                   '((T_OPEN_TAG 1 . 7) (T_NAMESPACE 7 . 16) (T_STRING 17 . 28) 
(";" 28 . 29) (T_CLASS 30 . 35) (T_STRING 36 . 43) ("{" 44 . 45) (T_PUBLIC 47 . 
53) (T_FUNCTION 54 . 62) (T_STRING 63 . 74) ("(" 74 . 75) (")" 75 . 76) ("{" 77 
. 78) (T_EXIT 81 . 85) (";" 85 . 86) ("}" 88 . 89) ("}" 90 . 91)))))
   )
 
@@ -328,19 +328,19 @@
   (phps-mode-test-with-buffer
    "<?php\necho \"My neverending double quotation\n"
    "Neverending double quotation"
-   (should (equal (phps-mode-lexer-get-tokens)
+   (should (equal phps-mode-lexer-tokens
                   '((T_OPEN_TAG 1 . 7) (T_ECHO 7 . 11)))))
 
   (phps-mode-test-with-buffer
    "<?php\n`My neverending backquotes\n"
    "Neverending backquotes"
-   (should (equal (phps-mode-lexer-get-tokens)
+   (should (equal phps-mode-lexer-tokens
                   '((T_OPEN_TAG 1 . 7) ("`" 7 . 8)))))
 
   (phps-mode-test-with-buffer
    "<?php\n<<<LABEL\nMy neverending heredoc\ngoes on forever\n"
    "Neverending heredoc"
-   (should (equal (phps-mode-lexer-get-tokens)
+   (should (equal phps-mode-lexer-tokens
                   '((T_OPEN_TAG 1 . 7) (T_START_HEREDOC 7 . 16)))))
 
   )
diff --git a/test/phps-mode-test.el b/test/phps-mode-test.el
index 54c9c80..6300072 100644
--- a/test/phps-mode-test.el
+++ b/test/phps-mode-test.el
@@ -50,7 +50,7 @@
        (message "\nTesting incremental buffer '%s':\n'%s'\n" ,title ,source))
      (phps-mode)
      ,@change
-     (phps-mode-lexer-run-incremental test-buffer-incremental)
+     (phps-mode-analyzer-process-changes test-buffer-incremental)
      (phps-mode-functions-process-current-buffer)
      (setq incremental-states phps-mode-lexer-states)
      (setq incremental-tokens phps-mode-lexer-tokens)



reply via email to

[Prev in Thread] Current Thread [Next in Thread]