Subject: CC Mode 5.33 (Java/l); Wrong indentation of fallthrough switch/case with strings

From: Åsmund Grammeltvedt <[email-masked]>
Date: Tue, 5 Jul 2016 21:37:15 +0200

Hi!

Running indent-region on the following code produces wrong indentation
on all but the first statement in the last switch block.

I have included two cases that work correctly for comparison:

class Foo {
     public void Bar(String foo) {
         int a = 0;

         switch (a) {
         case 0:
         case 1:
             a += 1;
             a += 2;
             break;
         }

         switch (foo) {
         case "foo":
             a += 1;
             a += 2;
             break;
         }

         switch (foo) {
         case "foo":
         case "bar":
             a += 1;
         a += 2;
         break;
         }
     }
}

Emacs  : GNU Emacs 25.1.50.2 (x86_64-pc-linux-gnu, GTK+ Version 3.10.8)
  of 2016-04-15
Package: CC Mode 5.33 (Java/l)
Buffer Style: java
c-emacs-features: (pps-extended-state col-0-paren posix-char-classes 
gen-string-delim gen-comment-delim syntax-properties 1-bit)

current state:
==============
(setq
  c-basic-offset 4
  c-comment-only-line-offset '(0 . 0)
  c-indent-comment-alist '((anchored-comment column . 0) (end-block 
space . 1) (cpp-end-block space . 2))
  c-indent-comments-syntactically-p nil
  c-block-comment-prefix "* "
  c-comment-prefix-regexp '((pike-mode . "//+!?\\|\\**") (awk-mode . 
"#+") (other . "//+\\|\\**"))
  c-doc-comment-style '((java-mode . javadoc) (pike-mode . autodoc) 
(c-mode . gtkdoc))
  c-cleanup-list '(scope-operator)
  c-hanging-braces-alist '((brace-list-open) (brace-entry-open) 
(statement-cont) (substatement-open after)
                           (block-close . c-snug-do-while) 
(extern-lang-open after) (namespace-open after)
                           (module-open after) (composition-open after) 
(inexpr-class-open after)
                           (inexpr-class-close before) 
(arglist-cont-nonempty))
  c-hanging-colons-alist nil
  c-hanging-semi&comma-criteria '(c-semi&comma-inside-parenlist)
  c-backslash-column 48
  c-backslash-max-column 72
  c-special-indent-hook nil
  c-label-minimum-indentation 1
  c-offsets-alist '((inexpr-class . +)
                    (inexpr-statement . +)
                    (lambda-intro-cont . +)
                    (inlambda . c-lineup-inexpr-block)
                    (template-args-cont c-lineup-template-args +)
                    (incomposition . +)
                    (inmodule . +)
                    (innamespace . +)
                    (inextern-lang . +)
                    (composition-close . 0)
                    (module-close . 0)
                    (namespace-close . 0)
                    (extern-lang-close . 0)
                    (composition-open . 0)
                    (module-open . 0)
                    (namespace-open . 0)
                    (extern-lang-open . 0)
                    (objc-method-call-cont 
c-lineup-ObjC-method-call-colons c-lineup-ObjC-method-call +)
                    (objc-method-args-cont . c-lineup-ObjC-method-args)
                    (objc-method-intro . [0])
                    (friend . 0)
                    (cpp-define-intro c-lineup-cpp-define +)
                    (cpp-macro-cont . +)
                    (cpp-macro . [0])
                    (inclass . +)
                    (stream-op . c-lineup-streamop)
                    (arglist-cont-nonempty c-lineup-gcc-asm-reg 
c-lineup-arglist)
                    (arglist-cont c-lineup-gcc-asm-reg 0)
                    (comment-intro c-lineup-knr-region-comment 
c-lineup-comment)
                    (catch-clause . 0)
                    (else-clause . 0)
                    (do-while-closure . 0)
                    (case-label . 0)
                    (substatement . +)
                    (statement-case-intro . +)
                    (statement . 0)
                    (brace-entry-open . 0)
                    (brace-list-entry . 0)
                    (brace-list-intro . +)
                    (brace-list-close . 0)
                    (brace-list-open . 0)
                    (block-close . 0)
                    (block-open . 0)
                    (inher-intro . +)
                    (member-init-cont . c-lineup-multi-inher)
                    (member-init-intro . +)
                    (annotation-var-cont . +)
                    (annotation-top-cont . 0)
                    (topmost-intro . 0)
                    (knr-argdecl . 0)
                    (inline-close . 0)
                    (class-close . 0)
                    (class-open . 0)
                    (defun-block-intro . +)
                    (defun-close . 0)
                    (defun-open . 0)
                    (c . c-lineup-C-comments)
                    (string . c-lineup-dont-change)
                    (func-decl-cont . c-lineup-java-throws)
                    (inher-cont . c-lineup-java-inher)
                    (access-label . 0)
                    (arglist-close . c-lineup-arglist)
                    (arglist-intro . c-lineup-arglist-intro-after-paren)
                    (statement-cont . +)
                    (statement-case-open . +)
                    (label . +)
                    (substatement-label . +)
                    (substatement-open . +)
                    (knr-argdecl-intro . 5)
                    (statement-block-intro . +)
                    (topmost-intro-cont . +)
                    (inline-open . 0)
                    )
  c-buffer-is-cc-mode 'java-mode
  c-tab-always-indent t
  c-syntactic-indentation t
  c-syntactic-indentation-in-macros t
  c-ignore-auto-fill '(string cpp code)
  c-auto-align-backslashes t
  c-backspace-function 'backward-delete-char-untabify
  c-delete-function 'delete-char
  c-electric-pound-behavior nil
  c-default-style '((java-mode . "java") (awk-mode . "awk") (other . "gnu"))
  c-enable-xemacs-performance-kludge-p nil
  c-old-style-variable-behavior nil
  defun-prompt-regexp nil
  tab-width 4
  comment-column 32
  parse-sexp-ignore-comments t
  parse-sexp-lookup-properties t
  auto-fill-function nil
  comment-multi-line t
  comment-start-skip "\\(//+\\|/\\*+\\)\\s *"
  fill-prefix nil
  fill-column 70
  paragraph-start "[ 	]*\\(//+\\|\\**\\)[ 	]*\\(@[a-zA-Z]+\\>\\|$\\)\\|^\f"
  adaptive-fill-mode t
  adaptive-fill-regexp "[ 	]*\\(//+\\|\\**\\)[ 	]*\\([ 
]*\\([-–!|#%;>*·•‣⁃◦]+[ 	]*\\)*\\)"
  )

-- 
Åsmund Grammeltvedt