branch: elpa/swift-mode commit 37cab39a050691b66bea71461496e66d6a51af40 Author: ap4y <l...@pisem.net> Commit: ap4y <l...@pisem.net>
Improve indentation for switch and class statements Some of the recent changes broke indentation around switch statements due to the lack of the test around some of the cases. - Restores support for the custom case keyword offset - Fixes several lexer regex inconsistences around switch and class statements - Restored default indentation for the hanging comma prior to #99 - Improved test coverage fixes #106 --- swift-mode.el | 40 ++++++----- test/indentation-tests.el | 165 +++++++++++++++++++++++++++++++++++++++++----- 2 files changed, 166 insertions(+), 39 deletions(-) diff --git a/swift-mode.el b/swift-mode.el index 592179a..edea55f 100644 --- a/swift-mode.el +++ b/swift-mode.el @@ -62,10 +62,11 @@ :type 'integer :package-version '(swift-mode "0.3.0")) -(defcustom swift-indent-hanging-comma-offset 4 +(defcustom swift-indent-hanging-comma-offset nil "Defines the indentation offset for hanging comma." :group 'swift - :type 'integer + :type '(choice (const :tag "Use default relative formatting" nil) + (integer :tag "Custom offset")) :package-version '(swift-mode "0.4.0")) (defcustom swift-repl-executable @@ -165,8 +166,8 @@ (case-exps (exp) (guard-exp) (case-exps "," case-exps)) - (case ("case" case-exps "case-:" insts)) - (switch-body (case)) + (case (case-exps "case-:" insts)) + (switch-body (case) (case "case" case)) (for-head (in-exp) (op-exp) (for-head ";" for-head)) @@ -266,6 +267,11 @@ token )) +(defconst swift-smie--lookback-max-lines -2 + "Max number of lines 'looking-back' allowed to scan. +In some cases we can't avoid reverse lookup and this operation can be slow. +We try to constraint those lookups by reasonable number of lines.") + (defun swift-smie--forward-token () (skip-chars-forward " \t") (cond @@ -274,14 +280,14 @@ ";") ((looking-at "{") (forward-char 1) - (if (looking-back "\\(class\\|protocol\\) [^{]+{" (line-beginning-position) t) + (if (looking-back "\\(class\\|protocol\\) [^{]+{" (line-beginning-position swift-smie--lookback-max-lines) t) (concat (match-string 1) "-{") "{")) ((looking-at "}") (forward-char 1) "}") ((looking-at ",") (forward-char 1) ",") ((looking-at ":") (forward-char 1) - (if (looking-back "case [^:]+:" (line-beginning-position 0) t) + (if (looking-back "\\(case [^:]+\\|default\\):" (line-beginning-position 0) t) "case-:" ":")) @@ -331,14 +337,14 @@ ";") ((eq (char-before) ?\{) (backward-char 1) - (if (looking-back "\\(class\\|protocol\\) [^{]+" (line-beginning-position) t) + (if (looking-back "\\(class\\|protocol\\) [^{]+" (line-beginning-position swift-smie--lookback-max-lines) t) (concat (match-string 1) "-{") "{")) ((eq (char-before) ?\}) (backward-char 1) "}") ((eq (char-before) ?,) (backward-char 1) ",") ((eq (char-before) ?:) (backward-char 1) - (if (looking-back "case [^:]+" (line-beginning-position 0)) + (if (looking-back "case [^:]+\\|default" (line-beginning-position 0)) "case-:" ":")) @@ -394,18 +400,15 @@ ;; assignment expression. ;; Static indentation relatively to = ((smie-rule-parent-p "=") 2) - ;; Rule for the case statement. - ((smie-rule-parent-p "case") swift-indent-offset) ((smie-rule-parent-p ",") (smie-rule-parent swift-indent-offset)) ;; Rule for the class definition. ((smie-rule-parent-p "class") (smie-rule-parent swift-indent-offset)))) - (`(:after . "{") - (if (smie-rule-parent-p "switch") + ;; Indentation rules for switch statements + (`(:before . "case") + (if (smie-rule-parent-p "{") (smie-rule-parent swift-indent-switch-case-offset))) - (`(:before . ";") - (if (smie-rule-parent-p "case") - (smie-rule-parent swift-indent-offset))) + (`(:before . "case-:") (smie-rule-parent swift-indent-offset)) ;; Apply swift-indent-multiline-statement-offset only if ;; - if is a first token on the line @@ -424,13 +427,8 @@ (+ swift-indent-offset swift-indent-multiline-statement-offset) swift-indent-multiline-statement-offset))) - ;; Indent second line of the multi-line class - ;; definitions with swift-indent-offset - (`(:before . "case") - (smie-rule-parent)) - (`(:before . ",") - (if (smie-rule-parent-p "class" "case") + (if (and swift-indent-hanging-comma-offset (smie-rule-parent-p "class" "case")) (smie-rule-parent swift-indent-hanging-comma-offset))) ;; Disable unnecessary default indentation for diff --git a/test/indentation-tests.el b/test/indentation-tests.el index e03b982..8defb9a 100644 --- a/test/indentation-tests.el +++ b/test/indentation-tests.el @@ -59,8 +59,7 @@ values of customisable variables." (swift-indent-offset 4) (swift-indent-switch-case-offset 0) (swift-indent-multiline-statement-offset 2) - ;; Change from default value to detect offset bug. - (swift-indent-hanging-comma-offset 3) + (swift-indent-hanging-comma-offset nil) ,@var-bindings) (with-temp-buffer (insert ,before) @@ -219,22 +218,22 @@ if foo { (check-indentation indents-case-statements-to-same-level-as-enclosing-switch/1 " switch true { - |case + |case foo: } " " switch true { -|case +|case foo: } ") (check-indentation indents-case-statements-to-same-level-as-enclosing-switch/2 " switch true { - |case + |case foo: } " " switch true { -|case +|case foo: } ") @@ -242,13 +241,13 @@ switch true { " { switch true { -|case +|case foo: } } " " { switch true { - |case + |case foo: } } ") @@ -257,13 +256,13 @@ switch true { " { switch true { - |case + |case foo: } } " " { switch true { - |case + |case foo: } } ") @@ -298,6 +297,23 @@ switch { } ") +(check-indentation indents-case-statements-to-same-level-as-enclosing-switch/7 + " +switch { +case foo: + foo + bar + |case baz: +} +" " +switch { +case foo: + foo + bar +|case baz: +} +") + (check-indentation indents-case-statement-bodies/1 " switch x { @@ -421,6 +437,27 @@ case y: } ") +(check-indentation indents-default-statements-to-same-level-as-enclosing-switch/3 + " +{ + switch true { + case y: + x + default: + foo + |} +} +" " +{ + switch true { + case y: + x + default: + foo + |} +} +") + (check-indentation indents-statements-under-default-case/1 " { @@ -490,10 +527,24 @@ case foo where bar, " " switch true { case foo where bar, - |bar where baz: + |bar where baz: } ") +(check-indentation indents-case-statements-with-multiline-guard-custom-offset/1 + " +switch true { +case foo where bar, +|bar where baz: +} +" " +switch true { +case foo where bar, + |bar where baz: +} +" +((swift-indent-hanging-comma-offset 3))) + (check-indentation indents-case-statements-with-multiline-guard/2 " switch true { @@ -513,11 +564,11 @@ case foo where bar, (check-indentation indents-case-statements-to-user-defined-offset/1 " switch true { - |case + |case foo: } " " switch true { - |case + |case foo: } " ((swift-indent-switch-case-offset 2))) @@ -525,11 +576,11 @@ switch true { (check-indentation indents-case-statements-to-user-defined-offset/2 " switch true { - |case + |default: } " " switch true { - |case + |default: } " ((swift-indent-switch-case-offset 2))) @@ -700,10 +751,22 @@ class Foo: Foo, Bar, } " " class Foo: Foo, Bar, - |Baz { + |Baz { } ") +(check-indentation indents-class-declaration-custom-offset/1 + " +class Foo: Foo, Bar, +|Baz { +} +" " +class Foo: Foo, Bar, + |Baz { +} +" +((swift-indent-hanging-comma-offset 3))) + (check-indentation indents-class-declaration/6 " class Foo: @@ -724,7 +787,7 @@ class Foo: Bar<A, B, |C> ") -(check-indentation indents-class-declaration/9 +(check-indentation indents-class-declaration/8 " class Foo<A: B<C>>: |Bar @@ -733,6 +796,36 @@ class Foo<A: B<C>>: |Bar ") +(check-indentation indents-class-declaration/9 + " +class Foo: Foo, + Bar, + Bar2, + |Baz { +} +" " +class Foo: Foo, + Bar, + Bar2, + |Baz { +} +") + +(check-indentation indents-class-declaration/10 + " +class Foo: Foo, + Bar, + Bar2, + Baz { + |} +" " +class Foo: Foo, + Bar, + Bar2, + Baz { +|} +") + (check-indentation indents-public-class-declaration/1 " public class Foo: Foo, Bar, @@ -740,10 +833,22 @@ public class Foo: Foo, Bar, } " " public class Foo: Foo, Bar, - |Baz { + |Baz { } ") +(check-indentation indents-public-class-declaration-custom-offset/1 + " +public class Foo: Foo, Bar, +|Baz { +} +" " +public class Foo: Foo, Bar, + |Baz { +} +" +((swift-indent-hanging-comma-offset 3))) + (check-indentation indents-public-class-declaration/2 " public class Foo { @@ -755,6 +860,30 @@ public class Foo { } ") +(check-indentation indents-public-class-declaration/3 + " +public class Foo: Foo, Bar, + Baz { + |} +" " +public class Foo: Foo, Bar, + Baz { +|} +") + +(check-indentation indents-public-class-declaration/4 + " +public class Foo: Foo, Bar, + Baz { +|foo +} +" " +public class Foo: Foo, Bar, + Baz { + |foo +} +") + (check-indentation indents-func-declaration/1 " func Foo(a: String) {