GNU bug report logs - #41923
CC Mode 5.33.2 (AWK//l); Bad indentation of gawk switch cases

Previous Next

Package: cc-mode;

Reported by: Peter Kozich <peter.kozich <at> upcmail.hu>

Date: Wed, 17 Jun 2020 17:17:02 UTC

Severity: normal

Done: Alan Mackenzie <acm <at> muc.de>

Bug is archived. No further changes may be made.

To add a comment to this bug, you must first unarchive it, by sending
a message to control AT debbugs.gnu.org, with unarchive 41923 in the body.
You can then email your comments to 41923 AT debbugs.gnu.org in the normal way.

Toggle the display of automated, internal messages from the tracker.

View this report as an mbox folder, status mbox, maintainer mbox


Report forwarded to bug-cc-mode <at> gnu.org:
bug#41923; Package cc-mode. (Wed, 17 Jun 2020 17:17:02 GMT) Full text and rfc822 format available.

Acknowledgement sent to Peter Kozich <peter.kozich <at> upcmail.hu>:
New bug report received and forwarded. Copy sent to bug-cc-mode <at> gnu.org. (Wed, 17 Jun 2020 17:17:02 GMT) Full text and rfc822 format available.

Message #5 received at submit <at> debbugs.gnu.org (full text, mbox):

From: Peter Kozich <peter.kozich <at> upcmail.hu>
To: submit <at> debbugs.gnu.org
Subject: CC Mode 5.33.2 (AWK//l); Bad indentation of gawk switch cases
Date: Wed, 17 Jun 2020 18:54:55 +0200
[Message part 1 (text/plain, inline)]
Package: cc-mode

Indentation of the case labels of the gawk switch is somehow strange:
the AWK mode does not seem to recognize the case keyword when indenting
(although it recognizes it as a keyword when coloring):
[case.awk (application/octet-stream, attachment)]
[Message part 3 (text/plain, inline)]
{

  switch (msg)
  {
    case 1:
      break;
      
      case 2:
        break;
        
        case 3:
          break;
          
          default:
            break;
  }
  
}


In a C buffer, the indentatation of the same works as expected:
[case.c (application/octet-stream, attachment)]
[Message part 5 (text/plain, inline)]
int main()
{
  switch (s)
  {
    case 1:
      break;

    case 2:
      break;

    default:
      break;
  }
}

Is this a bug, or am I missing something in my .emacs file?


br
pk


Emacs  : GNU Emacs 26.3 (build 1, x86_64-redhat-linux-gnu, GTK+ Version 3.24.13)
 of 2020-01-28
Package: CC Mode 5.33.2 (AWK//l)
Buffer Style: cello
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 2
 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 '(c-gnu-impose-minimum)
 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)
                   (access-label . -)
                   (substatement-label . 2)
                   (statement-case-intro . +)
                   (statement . 0)
                   (brace-entry-open . 0)
                   (brace-list-entry . c-lineup-under-anchor)
                   (brace-list-intro . +)
                   (brace-list-close . 0)
                   (brace-list-open . 0)
                   (block-close . 0)
                   (block-open . 0)
                   (inher-cont . c-lineup-multi-inher)
                   (inher-intro . +)
                   (member-init-cont . c-lineup-multi-inher)
                   (member-init-intro . +)
                   (annotation-var-cont . +)
                   (annotation-top-cont . 0)
                   (topmost-intro-cont . c-lineup-topmost-intro-cont)
                   (topmost-intro . 0)
                   (knr-argdecl . 0)
                   (func-decl-cont . +)
                   (inline-close . 0)
                   (inline-open . +)
                   (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)
                   (arglist-close . c-lineup-arglist)
                   (arglist-intro . c-lineup-arglist-intro-after-paren)
                   (statement-cont . +)
                   (label . 0)
                   (case-label . +)
                   (knr-argdecl-intro . 5)
                   (statement-block-intro . +)
                   (statement-case-open . +)
                   (substatement-open . 0)
                   (substatement . +)
                   )
 c-buffer-is-cc-mode 'awk-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 '((other . "cello"))
 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 "[ 	]*\\(\\(#+\\)[ 	]*\\)?$\\|^\f"
 adaptive-fill-mode t
 adaptive-fill-regexp "[ 	]*\\(#+\\)[ 	]*\\([ 	]*\\([-–!|#%;>*·•‣⁃◦]+[ 	]*\\)*\\)"
 )


Information forwarded to bug-cc-mode <at> gnu.org:
bug#41923; Package cc-mode. (Thu, 18 Jun 2020 18:57:01 GMT) Full text and rfc822 format available.

Message #8 received at 41923 <at> debbugs.gnu.org (full text, mbox):

From: Alan Mackenzie <acm <at> muc.de>
To: Peter Kozich <peter.kozich <at> upcmail.hu>
Cc: 41923 <at> debbugs.gnu.org
Subject: Re: bug#41923: CC Mode 5.33.2 (AWK//l); Bad indentation of gawk
 switch cases
Date: Thu, 18 Jun 2020 18:56:17 +0000
Hello, Peter.

On Wed, Jun 17, 2020 at 18:54:55 +0200, Peter Kozich wrote:
> Package: cc-mode

> Indentation of the case labels of the gawk switch is somehow strange:
> the AWK mode does not seem to recognize the case keyword when indenting
> (although it recognizes it as a keyword when coloring):



> {

>   switch (msg)
>   {
>     case 1:
>       break;
      
>       case 2:
>         break;
        
>         case 3:
>           break;
          
>           default:
>             break;
>   }
  
> }


> In a C buffer, the indentatation of the same works as expected:

[ .... ]

> Is this a bug, or am I missing something in my .emacs file?

This is indeed a bug.  At the time AWK Mode was written, switch didn't
exist in AWK, so special steps were taken to exclude switch and case
from AWK's indentation engine.  When it was introduced, CC Mode failed
to get updated to match.

The following patch puts switch/case/default into AWK Mode.  Would you
please apply it to ...../emacs/lisp/progmodes/cc-langs.el and
byte-compile all of CC Mode (i.e. ...../emacs/lisp/progmodes/cc-*.el).
(If you would like any help with the patching or byte-compilation, feel
free to send me private email.)  On reloading CC Mode (possibly, by
restarting Emacs), the indentation of case etc. should work.

Please then get back to me, confirming the patch works, or saying what
still needs fixing.  Thanks!



diff -r fd31432873bd cc-langs.el
--- a/cc-langs.el	Thu Jun 11 10:50:35 2020 +0000
+++ b/cc-langs.el	Thu Jun 18 18:53:00 2020 +0000
@@ -2772,7 +2772,7 @@
   java '("for" "if" "switch" "while" "catch" "synchronized")
   idl  nil
   pike '("for" "if" "switch" "while" "foreach")
-  awk  '("for" "if" "while"))
+  awk  '("for" "if" "switch" "while"))
 
 (c-lang-defconst c-block-stmt-2-key
   ;; Regexp matching the start of any statement followed by a paren sexp
@@ -2851,8 +2851,7 @@
 (c-lang-defconst c-case-kwds
   "The keyword(s) which introduce a \"case\" like construct.
 This construct is \"<keyword> <expression> :\"."
-  t '("case")
-  awk nil)
+  t '("case"))
 
 (c-lang-defconst c-case-kwds-regexp
   ;; Adorned regexp matching any "case"-like keyword.


> br
> pk


> Emacs  : GNU Emacs 26.3 (build 1, x86_64-redhat-linux-gnu, GTK+ Version 3.24.13)
>  of 2020-01-28
> Package: CC Mode 5.33.2 (AWK//l)
> Buffer Style: cello
> c-emacs-features: (pps-extended-state col-0-paren posix-char-classes gen-string-delim gen-comment-delim syntax-properties 1-bit)

[ CC Mode state dump snipped, but appreciated. ]

-- 
Alan Mackenzie (Nuremberg, Germany).




Reply sent to Alan Mackenzie <acm <at> muc.de>:
You have taken responsibility. (Wed, 24 Jun 2020 19:59:01 GMT) Full text and rfc822 format available.

Notification sent to Peter Kozich <peter.kozich <at> upcmail.hu>:
bug acknowledged by developer. (Wed, 24 Jun 2020 19:59:01 GMT) Full text and rfc822 format available.

Message #13 received at 41923-done <at> debbugs.gnu.org (full text, mbox):

From: Alan Mackenzie <acm <at> muc.de>
To: "Peter Kozich \(UM\)" <peter.kozich <at> upcmail.hu>
Cc: 41923-done <at> debbugs.gnu.org
Subject: Re: bug#41923: CC Mode 5.33.2 (AWK//l); Bad indentation of gawk
 switch cases
Date: Wed, 24 Jun 2020 19:57:59 +0000
Hello, Peter.

On Fri, Jun 19, 2020 at 21:20:37 +0200, Peter Kozich (UM) wrote:
> Hello Alan,

> I recompiled them and now case indentation works correctly in the AWK
> buffer, too.

Thanks.  I've committed the patch to the Emacs master branch, and it
will find its way into Emacs 28 when that is released (probably in about
a year and a half's time).  I suggest you keep the patch handy and apply
it to Emacs-27 when that gets released ("any time now").

> There is a 200+ lines difference somewhere between your el file and 
> mine.

Yes, sorry about that.  CC Mode is still a separate package from Emacs,
if only just, and I was working on the upstream version.  The line
number difference is harmless.

> Thank you for the help

Thanks again for the bug report.  I'm closing the bug with this post.

> br
> pk

-- 
Alan Mackenzie (Nuremberg, Germany).




bug archived. Request was from Debbugs Internal Request <help-debbugs <at> gnu.org> to internal_control <at> debbugs.gnu.org. (Thu, 23 Jul 2020 11:24:05 GMT) Full text and rfc822 format available.

This bug report was last modified 3 years and 278 days ago.

Previous Next


GNU bug tracking system
Copyright (C) 1999 Darren O. Benham, 1997,2003 nCipher Corporation Ltd, 1994-97 Ian Jackson.