branch: externals/phps-mode
commit 2d4646f2f1e8faf4a79f6b36f30140c233592430
Author: Christian Johansson <[email protected]>
Commit: Christian Johansson <[email protected]>
Work on inline control structure indentation
---
docs/indentation-algorithm.md | 12 +++--
phps-mode-functions.el | 121 +++++++++++++++++-------------------------
phps-mode-test-functions.el | 38 +++++++++----
3 files changed, 85 insertions(+), 86 deletions(-)
diff --git a/docs/indentation-algorithm.md b/docs/indentation-algorithm.md
index 2a4dba8..e967e27 100644
--- a/docs/indentation-algorithm.md
+++ b/docs/indentation-algorithm.md
@@ -26,8 +26,14 @@ foreach token in buffer:
endif;
if we reached end of a line:
+
+ indent-start = indent;
+
+ if temp-pre-indent: // #temp-pre-indent
+ indent-start = temp-pre-indent;
+ endif;
- save line indent; // #save
+ save line indent-start; // #save
if nesting-end > 0 AND (!nesting-stack OR nesting-end >
nesting-stack-end): // #increase
if !nesting-stack:
@@ -56,9 +62,9 @@ if (function( // #save indent: 0, #increase push (0
2) indent: 1
```php
if (true) // #save indent: 0
- echo true; // #pre-temp-increase indent: 1, #save indent: 1,
#pre-temp-decrease indent: 0
+ echo true; // #temp-pre-indent: 1, #save indent: 1
else // #save indent: 0
- echo false; // #pre-temp-increase indent: 1, #save indent: 1,
#pre-temp-decrease indent: 0
+ echo false; // #temp-pre-indent: 1, #save indent: 1
```
## Alternative control structure for if-else 2
diff --git a/phps-mode-functions.el b/phps-mode-functions.el
index 746608f..61b795b 100644
--- a/phps-mode-functions.el
+++ b/phps-mode-functions.el
@@ -63,7 +63,6 @@
(round-bracket-level 0)
(square-bracket-level 0)
(alternative-control-structure-level 0)
- (inline-control-structure-level 0)
(column-level 0)
(column-level-start 0)
(tuning-level 0)
@@ -92,7 +91,8 @@
(changed-nesting-stack-in-line nil)
(after-class-declaration nil)
(class-declaration-started-this-line nil)
- (special-control-structure-started-this-line nil))
+ (special-control-structure-started-this-line nil)
+ (temp-pre-indent nil))
(push `(END_PARSE ,(point-max) . ,(point-max)) tokens)
@@ -105,6 +105,7 @@
(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)
(progn
(setq next-token-start-line-number (1+
token-start-line-number))
@@ -213,60 +214,48 @@
(not (string= token ")"))
(not (string= token "(")))
- ;; Is token not a curly bracket - because that is a ordinary
control structure syntax
- (if (string= token "{")
+ ;; Handle the else if case
+ (if (equal 'T_IF token)
+ (setq after-special-control-structure-token token)
- (when (equal after-special-control-structure-token
'T_SWITCH)
- ;; (message "Opening switch, increase curly brackets
to %s" curly-bracket-level)
- (push curly-bracket-level switch-curly-stack)
- (setq allow-custom-column-increment t)
- (setq curly-bracket-level (1+ curly-bracket-level)))
-
- ;; Is it the start of an alternative control structure?
- (if (string= token ":")
-
- (progn
- ;; Alternative syntax for control structures here
- (if (or (equal after-special-control-structure-token
'T_ELSE)
- (equal after-special-control-structure-token
'T_ELSEIF)
- (equal after-special-control-structure-token
'T_DEFAULT))
- (progn
- (setq line-contained-nesting-increase t)
- (when
after-special-control-structure-first-on-line
- (setq first-token-is-nesting-decrease t)))
+ ;; Is token not a curly bracket - because that is a
ordinary control structure syntax
+ (if (string= token "{")
- (when (equal after-special-control-structure-token
'T_SWITCH)
- (setq alternative-control-structure-level (1+
alternative-control-structure-level))
- (setq allow-custom-column-increment t))
+ (when (equal after-special-control-structure-token
'T_SWITCH)
+ ;; (message "Opening switch, increase curly brackets
to %s" curly-bracket-level)
+ (push curly-bracket-level switch-curly-stack)
+ (setq allow-custom-column-increment t)
+ (setq curly-bracket-level (1+ curly-bracket-level)))
- (setq alternative-control-structure-level (1+
alternative-control-structure-level))
- (setq line-contained-nesting-increase t)
- (when after-special-control-structure-first-on-line
- (setq first-token-is-nesting-increase t))))
+ ;; Is it the start of an alternative control structure?
+ (if (string= token ":")
- ;; Inline syntax for control structures here
- (if (or (equal after-special-control-structure-token
'T_ELSE)
- (equal after-special-control-structure-token
'T_ELSEIF))
(progn
- (setq line-contained-nesting-increase t)
- (when after-special-control-structure-first-on-line
+ ;; Alternative syntax for control structures here
+ (if (or (equal
after-special-control-structure-token 'T_ELSE)
+ (equal
after-special-control-structure-token 'T_ELSEIF)
+ (equal
after-special-control-structure-token 'T_DEFAULT))
+ (progn
+ (setq line-contained-nesting-increase t)
+ (when
after-special-control-structure-first-on-line
+ (setq first-token-is-nesting-decrease t)))
+
+ (when (equal
after-special-control-structure-token 'T_SWITCH)
+ (setq alternative-control-structure-level (1+
alternative-control-structure-level))
+ (setq allow-custom-column-increment t))
+ (setq alternative-control-structure-level (1+
alternative-control-structure-level))
+ (setq line-contained-nesting-increase t)
+ (when
after-special-control-structure-first-on-line
+ (setq first-token-is-nesting-increase t))))
- (setq first-token-is-nesting-increase t)))
- ;; (message "Was inline-control structure %s %s"
after-special-control-structure-token token)
- (setq inline-control-structure-level (1+
inline-control-structure-level))
- (setq line-contained-nesting-increase t)
- (when after-special-control-structure-first-on-line
- (setq first-token-is-nesting-increase t))
- (setq in-inline-control-structure t))
-
- (when (not special-control-structure-started-this-line)
- (setq column-level (1+ column-level)))
- ))
+ ;; (message "Started inline control-structure after %s
at %s" after-special-control-structure-token token)
+ (setq in-inline-control-structure t)
+ (setq temp-pre-indent (1+ column-level))))
- (setq after-special-control-structure nil)
- (setq after-special-control-structure-token nil)
- (setq after-special-control-structure-first-on-line nil))
+ (setq after-special-control-structure nil)
+ (setq after-special-control-structure-token nil)
+ (setq after-special-control-structure-first-on-line nil)))
;; Support extra special control structures (CASE)
(when (and after-extra-special-control-structure
@@ -281,7 +270,6 @@
(string= token ";")
(not special-control-structure-started-this-line))
(setq line-contained-nesting-decrease t)
- (setq inline-control-structure-level (1-
inline-control-structure-level))
(setq in-inline-control-structure nil))
;; Did we encounter a token that supports alternative and
inline control structures?
@@ -346,14 +334,14 @@
(when token
;; Calculate nesting
- (setq nesting-end (+ round-bracket-level square-bracket-level
curly-bracket-level alternative-control-structure-level
inline-control-structure-level in-assignment-level in-class-declaration-level))
+ (setq nesting-end (+ round-bracket-level square-bracket-level
curly-bracket-level alternative-control-structure-level in-assignment-level
in-class-declaration-level))
;; Has nesting increased?
(when (and nesting-stack
(<= nesting-end (car (car nesting-stack))))
(when phps-mode-functions-verbose
- ;; (message "\nPopping %s from nesting-stack since %s is
lesser or equal to %s, next value is: %s\n" (car nesting-stack) nesting-end
(car (car nesting-stack)) (nth 1 nesting-stack))
+ (message "\nPopping %s from nesting-stack since %s is
lesser or equal to %s, next value is: %s\n" (car nesting-stack) nesting-end
(car (car nesting-stack)) (nth 1 nesting-stack))
)
(pop nesting-stack)
@@ -377,37 +365,26 @@
;; ;; Start indentation might differ from ending
indentation in cases like } else {
(setq column-level-start column-level)
- ;; (when (= nesting-end nesting-start)
-
- ;; (when (and after-class-declaration
- ;; (> column-level-start 0))
- ;; (setq column-level-start (1- column-level-start)))
- ;; ;; ;; Handle cases like: } else {
- ;; ;; (when (and first-token-is-nesting-decrease
- ;; ;; (not first-token-is-nesting-increase)
- ;; ;; (> column-level-start 0))
- ;; ;; (setq column-level-start (1-
column-level-start)))
+ ;; Support temporarily pre-indent
+ (when temp-pre-indent
+ (setq column-level-start temp-pre-indent)
+ (setq temp-pre-indent nil))
- ;; ;; ;; Handle cases like if (blaha)\n echo
'blaha';
- ;; ;; (when (and first-token-is-nesting-increase
- ;; ;; (not first-token-is-nesting-decrease))
- ;; ;; (setq column-level-start (1+
column-level-start)))
- ;; )
+ ;; Save line indent
+
(when phps-mode-functions-verbose
(message "Process line ending. nesting: %s-%s,
line-number: %s-%s, indent: %s.%s, token: %s" nesting-start nesting-end
token-start-line-number token-end-line-number column-level-start tuning-level
token))
-
- ;; (message "new line %s or last token at %s, %s %s.%s
(%s - %s) = %s %s %s %s %s [%s %s] %s %s %s" token-start-line-number token
next-token column-level tuning-level nesting-start nesting-end
round-bracket-level square-bracket-level curly-bracket-level
alternative-control-structure-level inline-control-structure-level
first-token-is-nesting-decrease first-token-is-nesting-increase in-assignment
in-assignment-level in-class-declaration-level)
(when (> token-start-line-number 0)
;; Save line indentation
(puthash token-start-line-number `(,column-level-start
,tuning-level) line-indents))
- ;; TODO Handle case were current line number is more
than 1 above last line number and then fill lines in-between with indentation
+ ;; TODO Fill token-less but in-scripting lines
in-between with indentation
;; Does token span over several lines?
@@ -428,7 +405,7 @@
(setq tuning-level 0))
- ;; Has nesting decreased?
+ ;; Decrease indentation
(when (and (> nesting-end 0)
(or (not nesting-stack)
(> nesting-end (car (cdr (car
nesting-stack))))))
@@ -444,7 +421,7 @@
(setq column-level (1+ column-level)))
(when phps-mode-functions-verbose
- (message "\nPushing (%s %s %s) to nesting-stack
since %s is greater than %s or stack is empty" nesting-start nesting-end token
nesting-end (car (cdr (car nesting-stack))))
+ (message "\nPushing (%s %s %s) to nesting-stack
since %s is greater than %s or stack is empty\n" nesting-start nesting-end
token nesting-end (car (cdr (car nesting-stack))))
)
(push `(,nesting-stack-end ,nesting-end ,token)
nesting-stack)
(when phps-mode-functions-verbose
@@ -461,7 +438,7 @@
;; (message "New stack %s, start: %s end: %s"
nesting-stack (car (car nesting-stack)) (car (cdr (car nesting-stack)))))
;; Calculate indentation level at start of line
- (setq nesting-start (+ round-bracket-level
square-bracket-level curly-bracket-level alternative-control-structure-level
inline-control-structure-level in-assignment-level in-class-declaration-level))
+ (setq nesting-start (+ round-bracket-level
square-bracket-level curly-bracket-level alternative-control-structure-level
in-assignment-level in-class-declaration-level))
;; Set initial values for tracking first token
(when (> token-start-line-number last-line-number)
diff --git a/phps-mode-test-functions.el b/phps-mode-test-functions.el
index ebc2f8f..62f8146 100644
--- a/phps-mode-test-functions.el
+++ b/phps-mode-test-functions.el
@@ -48,11 +48,6 @@
"Test `phps-mode-functions-get-lines-indent' function."
(phps-mode-test-with-buffer
- "<?php\nif (true)\n echo 'Something';\nelse\n echo 'Something
else';\necho true;\n"
- "Inline control structures"
- (should (equal '((1 (0 0)) (2 (0 0)) (3 (1 0)) (4 (0 0)) (5 (1 0)) (6 (0
0))) (phps-mode-test-functions--hash-to-list
(phps-mode-functions-get-lines-indent)))))
-
- (phps-mode-test-with-buffer
"<?php\n/**\n * Bla\n */"
"DOC-COMMENT"
(should (equal '((1 (0 0)) (2 (0 0)) (3 (0 1)) (4 (0 1)))
(phps-mode-test-functions--hash-to-list
(phps-mode-functions-get-lines-indent)))))
@@ -148,6 +143,26 @@
)
+(defun phps-mode-test-functions-get-lines-indent-inline-if ()
+ "Test for inline if indentations."
+
+ (phps-mode-test-with-buffer
+ "<?php\nif (true)\n echo 'Something';\nelse\n echo 'Something
else';\necho true;\n"
+ "Inline control structures if else"
+ (should (equal '((1 (0 0)) (2 (0 0)) (3 (1 0)) (4 (0 0)) (5 (1 0)) (6 (0
0))) (phps-mode-test-functions--hash-to-list
(phps-mode-functions-get-lines-indent)))))
+
+ (phps-mode-test-with-buffer
+ "<?php\nif (true)\n echo 'Something';\nelse if\n echo 'Something
else';\necho true;\n"
+ "Inline control structures if else if"
+ (should (equal '((1 (0 0)) (2 (0 0)) (3 (1 0)) (4 (0 0)) (5 (1 0)) (6 (0
0))) (phps-mode-test-functions--hash-to-list
(phps-mode-functions-get-lines-indent)))))
+
+ (phps-mode-test-with-buffer
+ "<?php\nwhile (true)\n echo 'Something';"
+ "Inline control structures"
+ (should (equal '((1 (0 0)) (2 (0 0)) (3 (1 0)))
(phps-mode-test-functions--hash-to-list
(phps-mode-functions-get-lines-indent)))))
+
+ )
+
(defun phps-mode-test-functions-get-lines-indent-alternative-if ()
"Test for alternative if indentations."
@@ -157,15 +172,15 @@
(should (equal '((1 (0 0)) (2 (0 0)) (3 (1 0)) (4 (0 0)) (5 (1 0)) (6 (0
0)) (7 (1 0)) (8 (1 0)) (9 (0 0)) (10 (0 0)))
(phps-mode-test-functions--hash-to-list
(phps-mode-functions-get-lines-indent)))))
(phps-mode-test-with-buffer
- "<?php\nif (true):\n echo 'Something';\nelseif (true\n && true):\n
echo 'Something';\nelse:\n echo 'Something else';\n echo 'Something else
again';\nendif;\necho true;\n"
- "Alternative control structures with multi-line elseif 1"
- (should (equal '((1 (0 0)) (2 (0 0)) (3 (1 0)) (4 (0 0)) (5 (1 0)) (6 (1
0)) (7 (0 0)) (8 (1 0)) (9 (1 0)) (10 (0 0)) (11 (0 0)))
(phps-mode-test-functions--hash-to-list
(phps-mode-functions-get-lines-indent)))))
-
- (phps-mode-test-with-buffer
"<?php\nif (true):\n echo 'Something';\nelseif (true\n && true\n):\n
echo 'Something';\nelse:\n echo 'Something else';\n echo 'Something
else again';\nendif;\necho true;\n"
"Alternative control structures with multi-line elseif 1"
(should (equal '((1 (0 0)) (2 (0 0)) (3 (1 0)) (4 (0 0)) (5 (1 0)) (6 (0
0)) (7 (1 0)) (8 (0 0)) (9 (1 0)) (10 (1 0)) (11 (0 0)) (12 (0 0)))
(phps-mode-test-functions--hash-to-list
(phps-mode-functions-get-lines-indent)))))
+ (phps-mode-test-with-buffer
+ "<?php\nif (true):\n echo 'Something';\nelseif (true\n && true):\n
echo 'Something';\nelse:\n echo 'Something else';\n echo 'Something else
again';\nendif;\necho true;\n"
+ "Alternative control structures with multi-line elseif 2"
+ (should (equal '((1 (0 0)) (2 (0 0)) (3 (1 0)) (4 (0 0)) (5 (1 0)) (6 (1
0)) (7 (0 0)) (8 (1 0)) (9 (1 0)) (10 (0 0)) (11 (0 0)))
(phps-mode-test-functions--hash-to-list
(phps-mode-functions-get-lines-indent)))))
+
)
(defun phps-mode-test-function-get-lines-indent-classes ()
@@ -503,8 +518,9 @@
(setq phps-mode-functions-verbose t)
(phps-mode-test-functions-get-lines-lindent-if)
(phps-mode-test-function-get-lines-indent-classes)
- (phps-mode-test-functions-get-lines-indent)
+ (phps-mode-test-functions-get-lines-indent-inline-if)
(phps-mode-test-functions-get-lines-indent-alternative-if)
+ (phps-mode-test-functions-get-lines-indent)
(phps-mode-test-functions-indent-line))
(phps-mode-test-functions)