branch: externals/phps-mode commit 3f5c008b6405633f58f23caac9c050473a058fb2 Author: Christian Johansson <christ...@cvj.se> Commit: Christian Johansson <christ...@cvj.se>
Optimization for lexer to only need to execute once per index --- phps-mode-automation-grammar.el | 65 +++++++++++++++++++++++++++++++++++------ phps-mode-lexer.el | 6 ++++ phps-mode-parser.el | 12 ++++++-- 3 files changed, 71 insertions(+), 12 deletions(-) diff --git a/phps-mode-automation-grammar.el b/phps-mode-automation-grammar.el index 5881e8f..9c4631a 100644 --- a/phps-mode-automation-grammar.el +++ b/phps-mode-automation-grammar.el @@ -1450,17 +1450,64 @@ (defconst phps-mode-automation-grammar--lex-analyzer-function - (lambda(index) - (with-current-buffer "*phps-mode-lex-analyzer*" + (lambda (index) + (save-current-buffer + (set-buffer "*phps-mode-lex-analyzer*") (unless (= (point) index) (goto-char index)) - (phps-mode-lexer--re2c) - (when - (boundp - 'phps-mode-lexer--generated-new-tokens) - (car - (nreverse - phps-mode-lexer--generated-new-tokens))))) + + (when (< index (point-max)) + + ;; Only lex if we have not lexed this position recently + (unless (and + phps-mode-lexer--generated-new-tokens-index + (= + phps-mode-lexer--generated-new-tokens-index + index)) + (phps-mode-lexer--re2c)) + + (let ((first (car (nreverse phps-mode-lexer--generated-new-tokens)))) + + (cond + + ;; Lexer has moved forward - lex again + ((and + (not first) + (not (equal index semantic-lex-end-point))) + (setq + phps-mode-parser-lex-analyzer--index + semantic-lex-end-point) + (setq + first + (funcall + phps-mode-parser-lex-analyzer--function + phps-mode-parser-lex-analyzer--index))) + + ;; Skip open and close tag + ((or + (equal (car first) 'T_OPEN_TAG) + (equal (car first) 'T_CLOSE_TAG)) + (setq + phps-mode-parser-lex-analyzer--index + (cdr (cdr first))) + (setq + first + (funcall + phps-mode-parser-lex-analyzer--function + phps-mode-parser-lex-analyzer--index))) + + ;; Open tag with echo is replaced with echo + ((equal (car first) 'T_OPEN_TAG_WITH_ECHO) + (setf + (car first) + 'T_ECHO) + (setq + phps-mode-parser-lex-analyzer--index + (cdr (cdr first)))) + + ) + + first)))) "The custom lex-analyzer.") (defconst diff --git a/phps-mode-lexer.el b/phps-mode-lexer.el index 46bbc73..cdd1c14 100644 --- a/phps-mode-lexer.el +++ b/phps-mode-lexer.el @@ -120,6 +120,9 @@ (defvar-local phps-mode-lexer--generated-new-tokens nil "List of current newly generated tokens.") +(defvar-local phps-mode-lexer--generated-new-tokens-index nil + "Index started at when generated new tokens.") + (defvar-local phps-mode-lexer--state nil "Current state of lexer.") @@ -473,6 +476,9 @@ (setq phps-mode-lexer--generated-new-tokens nil) (setq phps-mode-lexer--restart-flag nil) (let ((old-start (point))) + (setq + phps-mode-lexer--generated-new-tokens-index + old-start) (phps-mode-debug-message (let ((start (point)) (end (+ (point) 5)) diff --git a/phps-mode-parser.el b/phps-mode-parser.el index 19f2430..58a1eb7 100644 --- a/phps-mode-parser.el +++ b/phps-mode-parser.el @@ -69,10 +69,16 @@ (goto-char index)) (when (< index (point-max)) - (phps-mode-lexer--re2c) - (let ((first (car (nreverse phps-mode-lexer--generated-new-tokens)))) - (message "first: %S" first) + ;; Only lex if we have not lexed this position recently + (unless (and + phps-mode-lexer--generated-new-tokens-index + (= + phps-mode-lexer--generated-new-tokens-index + index)) + (phps-mode-lexer--re2c)) + + (let ((first (car (nreverse phps-mode-lexer--generated-new-tokens)))) (cond