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

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

[elpa] externals/phps-mode 3f5c008 09/96: Optimization for lexer to only


From: Christian Johansson
Subject: [elpa] externals/phps-mode 3f5c008 09/96: Optimization for lexer to only need to execute once per index
Date: Fri, 29 Oct 2021 11:14:30 -0400 (EDT)

branch: externals/phps-mode
commit 3f5c008b6405633f58f23caac9c050473a058fb2
Author: Christian Johansson <christian@cvj.se>
Commit: Christian Johansson <christian@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
 



reply via email to

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