[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
bug#14593: 24.3; java-mode indentation of try-with-resources statement
From: |
Alan Mackenzie |
Subject: |
bug#14593: 24.3; java-mode indentation of try-with-resources statement |
Date: |
Sat, 13 Jul 2013 19:19:36 +0000 |
User-agent: |
Mutt/1.5.21 (2010-09-15) |
Hello, Patrick.
On Wed, 12 Jun 2013 00:24:13, Patrick Brinich-Langlois
<pbrinichlanglois@gmail.com> wrote:
> Java's try-with-resources statement (new in version 1.7) is indented
> incorrectly in java-mode. Steps to reproduce:
> * Create a new file. Enable java-mode and electric-indent-mode.
> * Type the following:
> public class Test {
> public static void main(String[] args) {
> Path dir = Paths.get(System.getProperty("user.home"));
> try (DirectoryStream<Path> stream = Files.newDirectoryStream(dir)) {
> System.out.println("test");
> }
> }
> }
> The two lines after the try statement are indented an additional four
> spaces. The final two closing braces are indented properly.
This is indeed the case.
The following patch should hopefully handle this case properly. After
applying it, either recompile all the cc-*.el files, or just recompile
cc-langs.el, cc-engine.el, cc-fonts.el, and cc-mode.el.
Please confirm to me that the patch does indeed fix the bug, or report
any further problems which aren't fixed. Thanks!
diff -r a86a481f7a63 cc-engine.el
--- a/cc-engine.el Mon May 27 12:17:11 2013 +0000
+++ b/cc-engine.el Sun Jul 07 14:15:36 2013 +0000
@@ -1140,9 +1140,13 @@
(not (memq sym '(boundary ignore nil))))
;; Need to investigate closer whether we've crossed
;; between a substatement and its containing statement.
- (if (setq saved (if (looking-at c-block-stmt-1-key)
- ptok
- pptok))
+ (if (setq saved
+ (cond ((and (looking-at c-block-stmt-1-2-key)
+ (eq (char-after ptok) ?\())
+ pptok)
+ ((looking-at c-block-stmt-1-key)
+ ptok)
+ (t pptok)))
(cond ((> start saved) (setq pos saved))
((= start saved) (setq ret 'up)))))
@@ -8026,7 +8030,8 @@
(or (looking-at c-block-stmt-1-key)
(and (eq (char-after) ?\()
(zerop (c-backward-token-2 1 t lim))
- (looking-at c-block-stmt-2-key)))
+ (or (looking-at c-block-stmt-2-key)
+ (looking-at c-block-stmt-1-2-key))))
(point))))
(defun c-after-special-operator-id (&optional lim)
diff -r a86a481f7a63 cc-fonts.el
--- a/cc-fonts.el Mon May 27 12:17:11 2013 +0000
+++ b/cc-fonts.el Sun Jul 07 14:15:36 2013 +0000
@@ -1274,7 +1274,8 @@
(goto-char match-pos)
(backward-char)
(c-backward-token-2)
- (looking-at c-block-stmt-2-key)))
+ (or (looking-at c-block-stmt-2-key)
+ (looking-at c-block-stmt-1-2-key))))
(setq context nil
c-restricted-<>-arglists t))
;; Near BOB.
diff -r a86a481f7a63 cc-langs.el
--- a/cc-langs.el Mon May 27 12:17:11 2013 +0000
+++ b/cc-langs.el Sun Jul 07 14:15:36 2013 +0000
@@ -2181,6 +2181,18 @@
t (c-make-keywords-re t (c-lang-const c-block-stmt-1-kwds)))
(c-lang-defvar c-block-stmt-1-key (c-lang-const c-block-stmt-1-key))
+(c-lang-defconst c-block-stmt-1-2-kwds
+ "Statement keywords optionally followed by a paren sexp.
+Keywords here should also be in `c-block-stmt-1-key'."
+ t nil
+ java '("try"))
+
+(c-lang-defconst c-block-stmt-1-2-key
+ ;; Regexp matching the start of a statement which may be followed by a
+ ;; paren sexp and will then be followed by a substatement.
+ t (c-make-keywords-re t (c-lang-const c-block-stmt-1-2-kwds)))
+(c-lang-defvar c-block-stmt-1-2-key (c-lang-const c-block-stmt-1-2-key))
+
(c-lang-defconst c-block-stmt-2-kwds
"Statement keywords followed by a paren sexp and then by a substatement."
t '("for" "if" "switch" "while")
--
Alan Mackenzie (Nuremberg, Germany).
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- bug#14593: 24.3; java-mode indentation of try-with-resources statement,
Alan Mackenzie <=