[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[elpa] externals/phps-mode 318001e 259/405: Merged Imenu and indentation
From: |
Stefan Monnier |
Subject: |
[elpa] externals/phps-mode 318001e 259/405: Merged Imenu and indentation generation into one iteration of tokens |
Date: |
Sat, 13 Jul 2019 10:00:27 -0400 (EDT) |
branch: externals/phps-mode
commit 318001e40ab56b575c2906a6e3b65c02b138da48
Author: Christian Johansson <address@hidden>
Commit: Christian Johansson <address@hidden>
Merged Imenu and indentation generation into one iteration of tokens
---
phps-mode-functions.el | 250 +++++++++++++++++++++++++------------------------
1 file changed, 127 insertions(+), 123 deletions(-)
diff --git a/phps-mode-functions.el b/phps-mode-functions.el
index 595b365..9603726 100644
--- a/phps-mode-functions.el
+++ b/phps-mode-functions.el
@@ -51,15 +51,21 @@
(defun phps-mode-functions-process-current-buffer ()
"Process current buffer, generate indentations and Imenu."
(unless phps-mode-functions-processed-buffer
-
- ;; TODO Merge these two functions into one
- (setq phps-mode-functions-lines-indent
(phps-mode-functions-get-lines-indent))
- (setq phps-mode-functions-imenu (phps-mode-functions-get-imenu))
+ (phps-mode-functions--process-current-buffer)
(setq phps-mode-functions-processed-buffer t)))
-;; Set indent for white-space lines as well
(defun phps-mode-functions-get-lines-indent ()
- "Get the column and tuning indentation-numbers for each line in buffer that
contain tokens."
+ "Return lines indent, process buffer if not done already."
+ (phps-mode-functions-process-current-buffer)
+ phps-mode-functions-lines-indent)
+
+(defun phps-mode-functions-get-imenu ()
+ "Return Imenu, process buffer if not done already."
+ (phps-mode-functions-process-current-buffer)
+ phps-mode-functions-imenu)
+
+(defun phps-mode-functions--process-current-buffer ()
+ "Process current buffer and generation indentation and Imenu in one
iteration. Complexity: O(n)."
(if (boundp 'phps-mode-lexer-tokens)
(save-excursion
(goto-char (point-min))
@@ -98,6 +104,8 @@
(in-class-declaration nil)
(in-class-declaration-level 0)
(token nil)
+ (token-start nil)
+ (token-end nil)
(token-start-line-number 0)
(token-end-line-number)
(tokens (nreverse phps-mode-lexer-tokens))
@@ -105,7 +113,17 @@
(class-declaration-started-this-line nil)
(special-control-structure-started-this-line nil)
(temp-pre-indent nil)
- (temp-post-indent nil))
+ (temp-post-indent nil)
+ (imenu-index '())
+ (imenu-in-namespace-declaration nil)
+ (imenu-in-namespace-name nil)
+ (imenu-open-namespace-level nil)
+ (imenu-in-class-declaration nil)
+ (imenu-open-class-level nil)
+ (imenu-in-class-name nil)
+ (imenu-in-function-declaration nil)
+ (imenu-in-function-name nil)
+ (imenu-nesting-level 0))
(push `(END_PARSE ,(point-max) . ,(point-max)) tokens)
@@ -113,10 +131,10 @@
(dolist (item (nreverse tokens))
;; (message "Items: %s %s" item phps-mode-lexer-tokens)
(let ((next-token (car item))
- (next-token-start (car (cdr item)))
- (next-token-end (cdr (cdr item)))
- (next-token-start-line-number nil)
- (next-token-end-line-number nil))
+ (next-token-start (car (cdr item)))
+ (next-token-end (cdr (cdr item)))
+ (next-token-start-line-number nil)
+ (next-token-end-line-number nil))
;; Handle the pseudo-token for last-line
(if (equal next-token 'END_PARSE)
@@ -129,6 +147,97 @@
;; Token logic
(when token
+ ;; IMENU LOGIC
+
+ (cond
+ ((string= token "{")
+ (setq imenu-nesting-level (1+ imenu-nesting-level)))
+ ((string= token "}")
+
+ (when (and imenu-open-namespace-level
+ (= imenu-open-namespace-level imenu-nesting-level)
+ imenu-in-namespace-name)
+ (setq imenu-in-namespace-name nil))
+
+ (when (and imenu-open-class-level
+ (= imenu-open-class-level imenu-nesting-level)
+ imenu-in-class-name)
+ (setq imenu-in-class-name nil))
+
+ (setq imenu-nesting-level (1- imenu-nesting-level))))
+
+ (cond
+
+ (imenu-in-namespace-declaration
+ (cond
+
+ ((string= token "{")
+ (setq imenu-open-namespace-level imenu-nesting-level)
+ (setq imenu-in-namespace-declaration nil))
+
+ ((string= token ";")
+ (setq imenu-in-namespace-declaration nil))
+
+ ((and (equal token 'T_STRING)
+ (not imenu-in-namespace-name))
+ (let ((imenu-index-name (format "\\%s"
(buffer-substring-no-properties token-start token-end)))
+ (imenu-index-pos token-start))
+ (setq imenu-in-namespace-name imenu-index-name)
+ (push `(,imenu-index-name . ,imenu-index-pos)
imenu-index)))))
+
+ (imenu-in-class-declaration
+ (cond
+
+ ((string= token "{")
+ (setq imenu-open-class-level imenu-nesting-level)
+ (setq imenu-in-class-declaration nil))
+
+ ((and (equal token 'T_STRING)
+ (not imenu-in-class-name))
+ (let ((imenu-index-name (format "%s"
(buffer-substring-no-properties token-start token-end)))
+ (imenu-index-pos token-start))
+ (setq imenu-in-class-name imenu-index-name)
+ (when imenu-in-namespace-name
+ (setq imenu-index-name (concat imenu-in-namespace-name
"\\" imenu-index-name)))
+ (push `(,imenu-index-name . ,imenu-index-pos)
imenu-index)))))
+
+ (imenu-in-function-declaration
+ (cond
+
+ ((string= token "{")
+ (setq imenu-in-function-name nil)
+ (setq imenu-in-function-declaration nil))
+
+ ((string= token ";")
+ (setq imenu-in-function-declaration nil))
+
+ ((and (equal token 'T_STRING)
+ (not imenu-in-function-name))
+ (let ((imenu-index-name (format "%s()"
(buffer-substring-no-properties token-start token-end)))
+ (imenu-index-pos token-start))
+ (setq imenu-in-function-name imenu-index-name)
+ (when imenu-in-class-name
+ (setq imenu-index-name (concat imenu-in-class-name
"->" imenu-index-name)))
+ (when imenu-in-namespace-name
+ (setq imenu-index-name (concat imenu-in-namespace-name
"\\" imenu-index-name)))
+ (push `(,imenu-index-name . ,imenu-index-pos)
imenu-index)))))
+
+ (t (cond
+
+ ((equal token 'T_NAMESPACE)
+ (setq imenu-in-namespace-name nil)
+ (setq imenu-in-namespace-declaration t))
+
+ ((equal token 'T_CLASS)
+ (setq imenu-in-class-name nil)
+ (setq imenu-in-class-declaration t))
+
+ ((equal token 'T_FUNCTION)
+ (setq imenu-in-function-name nil)
+ (setq imenu-in-function-declaration t)))))
+
+ ;; INDENTATION LOGIC
+
;; Keep track of round bracket level
(when (string= token "(")
(setq round-bracket-level (1+ round-bracket-level)))
@@ -249,7 +358,7 @@
(when phps-mode-functions-verbose
(message "\nIncreasing
alternative-control-structure after %s %s to %s\n"
after-special-control-structure-token token
alternative-control-structure-level))
-)
+ )
;; Don't start inline control structures after a while
($condition); expression
(when (not (string= token ";"))
@@ -532,11 +641,15 @@
;; Update current token
(setq token next-token)
+ (setq token-start next-token-start)
+ (setq token-end next-token-end)
(setq token-start-line-number next-token-start-line-number)
(setq token-end-line-number next-token-end-line-number)
(setq token-number (1+ token-number))))
- line-indents))
- nil))
+ (setq phps-mode-functions-imenu (nreverse imenu-index))
+ (setq phps-mode-functions-lines-indent line-indents)))
+ (setq phps-mode-functions-imenu nil)
+ (setq phps-mode-functions-lines-indent nil)))
(defun phps-mode-functions-indent-line ()
"Indent line."
@@ -587,115 +700,6 @@
;; (message "phps-mode-functions-after-change %s %s %s" start stop length)
))
-(defun phps-mode-functions-get-imenu ()
- "Create index for imenu."
- (let ((index '()))
-
- (when (boundp 'phps-mode-lexer-tokens)
- (let ((tokens phps-mode-lexer-tokens)
- (in-namespace-declaration nil)
- (in-namespace-name nil)
- (open-namespace-level nil)
- (in-class-declaration nil)
- (open-class-level nil)
- (in-class-name nil)
- (in-function-declaration nil)
- (in-function-name nil)
- (nesting-level 0))
- (dolist (token tokens)
- (let ((token-symbol (car token))
- (token-start (car (cdr token)))
- (token-end (cdr (cdr token))))
-
- (cond
- ((string= token-symbol "{")
- (setq nesting-level (1+ nesting-level)))
- ((string= token-symbol "}")
-
- (when (and open-namespace-level
- (= open-namespace-level nesting-level)
- in-namespace-name)
- (setq in-namespace-name nil))
-
- (when (and open-class-level
- (= open-class-level nesting-level)
- in-class-name)
- (setq in-class-name nil))
-
- (setq nesting-level (1- nesting-level))))
-
- (cond
-
- (in-namespace-declaration
- (cond
-
- ((string= token-symbol "{")
- (setq open-namespace-level nesting-level)
- (setq in-namespace-declaration nil))
-
- ((string= token-symbol ";")
- (setq in-namespace-declaration nil))
-
- ((and (equal token-symbol 'T_STRING)
- (not in-namespace-name))
- (let ((index-name (format "\\%s"
(buffer-substring-no-properties token-start token-end)))
- (index-pos token-start))
- (setq in-namespace-name index-name)
- (push `(,index-name . ,index-pos) index)))))
-
- (in-class-declaration
- (cond
-
- ((string= token-symbol "{")
- (setq open-class-level nesting-level)
- (setq in-class-declaration nil))
-
- ((and (equal token-symbol 'T_STRING)
- (not in-class-name))
- (let ((index-name (format "%s" (buffer-substring-no-properties
token-start token-end)))
- (index-pos token-start))
- (setq in-class-name index-name)
- (when in-namespace-name
- (setq index-name (concat in-namespace-name "\\"
index-name)))
- (push `(,index-name . ,index-pos) index)))))
-
- (in-function-declaration
- (cond
-
- ((string= token-symbol "{")
- (setq in-function-name nil)
- (setq in-function-declaration nil))
-
- ((string= token-symbol ";")
- (setq in-function-declaration nil))
-
- ((and (equal token-symbol 'T_STRING)
- (not in-function-name))
- (let ((index-name (format "%s()"
(buffer-substring-no-properties token-start token-end)))
- (index-pos token-start))
- (setq in-function-name index-name)
- (when in-class-name
- (setq index-name (concat in-class-name "->" index-name)))
- (when in-namespace-name
- (setq index-name (concat in-namespace-name "\\"
index-name)))
- (push `(,index-name . ,index-pos) index)))))
-
- (t (cond
-
- ((equal token-symbol 'T_NAMESPACE)
- (setq in-namespace-name nil)
- (setq in-namespace-declaration t))
-
- ((equal token-symbol 'T_CLASS)
- (setq in-class-name nil)
- (setq in-class-declaration t))
-
- ((equal token-symbol 'T_FUNCTION)
- (setq in-function-name nil)
- (setq in-function-declaration t)))))))))
-
- (nreverse index)))
-
(defun phps-mode-functions-imenu-create-index ()
"Get Imenu for current buffer."
(phps-mode-functions-process-current-buffer)
- [elpa] externals/phps-mode 55953de 232/405: Lexer now doesn't find keywords in function names, (continued)
- [elpa] externals/phps-mode 55953de 232/405: Lexer now doesn't find keywords in function names, Stefan Monnier, 2019/07/13
- [elpa] externals/phps-mode b8e9449 247/405: Refactored Imenu to use a persistent variable per buffer, Stefan Monnier, 2019/07/13
- [elpa] externals/phps-mode 67b8701 244/405: Decreased length of imenu items to prevent truncation, Stefan Monnier, 2019/07/13
- [elpa] externals/phps-mode e78d8ed 248/405: Clean-up of indentation code, Stefan Monnier, 2019/07/13
- [elpa] externals/phps-mode c2db7d3 250/405: Preparations for integration test, Stefan Monnier, 2019/07/13
- [elpa] externals/phps-mode 11309b8 256/405: Updated readme, Stefan Monnier, 2019/07/13
- [elpa] externals/phps-mode fcc920f 258/405: More preparations for merging indent and Imenu into one function, Stefan Monnier, 2019/07/13
- [elpa] externals/phps-mode 41c12c1 251/405: Updated paths for byte-compilation, Stefan Monnier, 2019/07/13
- [elpa] externals/phps-mode 0e927e8 252/405: Fixed compilation command in makefile, Stefan Monnier, 2019/07/13
- [elpa] externals/phps-mode 6593242 257/405: Preparations for doing indentation and imenu in one pass, Stefan Monnier, 2019/07/13
- [elpa] externals/phps-mode 318001e 259/405: Merged Imenu and indentation generation into one iteration of tokens,
Stefan Monnier <=
- [elpa] externals/phps-mode 5bb45ce 253/405: Added lexer test for properties inside heredoc, Stefan Monnier, 2019/07/13
- [elpa] externals/phps-mode caafeba 260/405: Changed idle interval for incremental lexer, Stefan Monnier, 2019/07/13
- [elpa] externals/phps-mode c7ad55c 255/405: Passed first integration-test, Stefan Monnier, 2019/07/13
- [elpa] externals/phps-mode 310521b 254/405: Started with first integration-test, Stefan Monnier, 2019/07/13
- [elpa] externals/phps-mode d39152b 279/405: Added unit test for NUM_STRING token inside double-quoted string, Stefan Monnier, 2019/07/13
- [elpa] externals/phps-mode 44a997e 270/405: Added syntax coloring for "." tokens, Stefan Monnier, 2019/07/13
- [elpa] externals/phps-mode aa0c23d 263/405: Updated font-locks for token color syntax, Stefan Monnier, 2019/07/13
- [elpa] externals/phps-mode b86dd54 262/405: Indentation now supports new lexer token T_INLINE HTML, Stefan Monnier, 2019/07/13
- [elpa] externals/phps-mode 2c8f28c 275/405: Added docstrings to variables, Stefan Monnier, 2019/07/13
- [elpa] externals/phps-mode c9f0254 271/405: Fixed some minor flycheck complains in lexer, Stefan Monnier, 2019/07/13