branch: externals/phps-mode
commit 09daec397a5ffd17c4a0e852b26bcee7c7bae367
Author: Christian Johansson <[email protected]>
Commit: Christian Johansson <[email protected]>
Foundation for incremental lexer and syntax colorer completed
---
phps-functions.el | 9 ++++++---
phps-lexer.el | 46 ++++++++++++++++++++++++++++++++++++++++------
2 files changed, 46 insertions(+), 9 deletions(-)
diff --git a/phps-functions.el b/phps-functions.el
index a7b795b..0990be5 100644
--- a/phps-functions.el
+++ b/phps-functions.el
@@ -107,9 +107,12 @@
(when (and (not phps-mode/buffer-changes--start)
(boundp 'phps-mode/idle-interval))
(run-with-idle-timer phps-mode/idle-interval nil
#'phps-mode/run-incremental-lex))
- (setq phps-mode/buffer-changes--start start)
- (message "phps-mode/after-change-functions %s %s %s" start stop length)
- ))
+ (when (or (not phps-mode/buffer-changes--start)
+ (< start phps-mode/buffer-changes--start))
+ ;; (message "Setting %s to %s" phps-mode/buffer-changes--start start)
+ (setq phps-mode/buffer-changes--start start))
+ ;; (message "phps-mode/after-change-functions %s %s %s" start stop length)
+ ))
(defun phps-mode/functions-init ()
"PHP specific init-cleanup routines."
diff --git a/phps-lexer.el b/phps-lexer.el
index 123a3cb..387f306 100644
--- a/phps-lexer.el
+++ b/phps-lexer.el
@@ -47,6 +47,9 @@
(defvar phps-mode/lexer-tokens nil
"Last lexer tokens.")
+(defvar phps-mode/lexer-states nil
+ "A list of lists containing start, state and state stack.")
+
;; SETTINGS
@@ -174,8 +177,7 @@
(defun phps-mode/yy_pop_state ()
"Pop current state from stack."
- (let* ((old-state (pop phps-mode/state_stack))
- (new-state (car phps-mode/state_stack)))
+ (let ((old-state (pop phps-mode/state_stack)))
;; (message "Going back to poppped state %s" old-state)
;; (message "Ended state %s, going back to %s" old-state new-state)
(if old-state
@@ -371,6 +373,9 @@
;; (message "Added token %s %s %s" token start end)
+ ;; Push token start, end, lexer state and state stack to variable
+ (push (list start end phps-mode/STATE phps-mode/state_stack)
phps-mode/lexer-states)
+
(semantic-lex-push-token
(semantic-lex-token token start end)))
@@ -1334,6 +1339,8 @@ ANY_CHAR'
(delete-all-overlays)
(when (boundp 'phps-mode/buffer-changes--start)
(setq phps-mode/buffer-changes--start nil))
+
+ (setq phps-mode/lexer-states nil)
(phps-mode/BEGIN phps-mode/ST_INITIAL)))
@@ -1344,10 +1351,37 @@ ANY_CHAR'
(defun phps-mode/run-incremental-lex ()
"Run incremental lexer based on `phps-mode/buffer-changes--start'."
- (when (boundp 'phps-mode/buffer-changes--start)
- (semantic-lex-buffer)
- ;; TODO (message "Should run incremental lex here %s - %s"
phps-mode/buffer-changes--start (point-max))
- ;; TODO (semantic-lex phps-mode/buffer-changes--start (point-max))
+ (when (and (boundp 'phps-mode/buffer-changes--start)
+ phps-mode/buffer-changes--start
+ phps-mode/lexer-states)
+ (let ((state nil)
+ (state-stack nil)
+ (new-states '())
+ (states (nreverse phps-mode/lexer-states))
+ (change-start phps-mode/buffer-changes--start)
+ (previous-token-start nil))
+ ;; (message "Looking for state to rewind to for %s in stack %s"
change-start states)
+ (catch 'stop-iteration
+ (dolist (state-object states)
+ (let ((start (nth 0 state-object))
+ (end (nth 1 state-object)))
+ (when (< end change-start)
+ (setq state (nth 2 state-object))
+ (setq state-stack (nth 3 state-object))
+ (setq previous-token-start start)
+ (push state-object new-states))
+ (when (> start change-start)
+ (throw 'stop-iteration nil)))))
+ (if (and state
+ state-stack)
+ (progn
+ (setq phps-mode/STATE state)
+ (setq phps-mode/state_stack state-stack)
+ (setq phps-mode/lexer-states new-states)
+ ;; (message "Rewinding lex to state: %s and stack: %s and states:
%s and start: %s" state state-stack new-states previous-token-start)
+ (semantic-lex previous-token-start (point-max)))
+ (display-warning "phps-mode" (format "Found no state to rewind to for
%s in stack %s" change-start states))
+ (semantic-lex-buffer)))
(setq phps-mode/buffer-changes--start nil)))
(define-lex phps-mode/tags-lexer