r323904 - [clang-format] Align preprocessor comments with #

Hans Wennborg via cfe-commits cfe-commits at lists.llvm.org
Tue Feb 6 01:53:35 PST 2018


Merged in r324329.

On Wed, Jan 31, 2018 at 9:05 PM, Mark Zeren via cfe-commits
<cfe-commits at lists.llvm.org> wrote:
> Author: mzeren-vmw
> Date: Wed Jan 31 12:05:50 2018
> New Revision: 323904
>
> URL: http://llvm.org/viewvc/llvm-project?rev=323904&view=rev
> Log:
> [clang-format] Align preprocessor comments with #
>
> Summary:
> r312125, which introduced preprocessor indentation, shipped with a known
> issue where "indentation of comments immediately before indented
> preprocessor lines is toggled on each run". For example these two forms
> toggle:
>
>   #ifndef HEADER_H
>   #define HEADER_H
>   #if 1
>   // comment
>   #   define A 0
>   #endif
>   #endif
>
>   #ifndef HEADER_H
>   #define HEADER_H
>   #if 1
>      // comment
>   #   define A 0
>   #endif
>   #endif
>
> This happens because we check vertical alignment against the '#' yet
> indent to the level of the 'define'. This patch resolves this issue by
> aligning against the '#'.
>
> Reviewers: krasimir, klimek, djasper
>
> Reviewed By: krasimir
>
> Subscribers: cfe-commits
> Differential Revision: https://reviews.llvm.org/D42408
>
> Modified:
>     cfe/trunk/lib/Format/TokenAnnotator.cpp
>     cfe/trunk/unittests/Format/FormatTest.cpp
>
> Modified: cfe/trunk/lib/Format/TokenAnnotator.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Format/TokenAnnotator.cpp?rev=323904&r1=323903&r2=323904&view=diff
> ==============================================================================
> --- cfe/trunk/lib/Format/TokenAnnotator.cpp (original)
> +++ cfe/trunk/lib/Format/TokenAnnotator.cpp Wed Jan 31 12:05:50 2018
> @@ -1725,15 +1725,18 @@ void TokenAnnotator::setCommentLineLevel
>        }
>      }
>
> -    if (NextNonCommentLine && CommentLine) {
> -      // If the comment is currently aligned with the line immediately following
> -      // it, that's probably intentional and we should keep it.
> -      bool AlignedWithNextLine =
> -          NextNonCommentLine->First->NewlinesBefore <= 1 &&
> -          NextNonCommentLine->First->OriginalColumn ==
> -              (*I)->First->OriginalColumn;
> -      if (AlignedWithNextLine)
> -        (*I)->Level = NextNonCommentLine->Level;
> +    // If the comment is currently aligned with the line immediately following
> +    // it, that's probably intentional and we should keep it.
> +    if (NextNonCommentLine && CommentLine &&
> +        NextNonCommentLine->First->NewlinesBefore <= 1 &&
> +        NextNonCommentLine->First->OriginalColumn ==
> +            (*I)->First->OriginalColumn) {
> +      // Align comments for preprocessor lines with the # in column 0.
> +      // Otherwise, align with the next line.
> +      (*I)->Level = (NextNonCommentLine->Type == LT_PreprocessorDirective ||
> +                     NextNonCommentLine->Type == LT_ImportStatement)
> +                        ? 0
> +                        : NextNonCommentLine->Level;
>      } else {
>        NextNonCommentLine = (*I)->First->isNot(tok::r_brace) ? (*I) : nullptr;
>      }
>
> Modified: cfe/trunk/unittests/Format/FormatTest.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/unittests/Format/FormatTest.cpp?rev=323904&r1=323903&r2=323904&view=diff
> ==============================================================================
> --- cfe/trunk/unittests/Format/FormatTest.cpp (original)
> +++ cfe/trunk/unittests/Format/FormatTest.cpp Wed Jan 31 12:05:50 2018
> @@ -2595,21 +2595,85 @@ TEST_F(FormatTest, IndentPreprocessorDir
>                     "code();\n"
>                     "#endif",
>                     Style));
> -  // FIXME: The comment indent corrector in TokenAnnotator gets thrown off by
> -  // preprocessor indentation.
> -  EXPECT_EQ("#if 1\n"
> -            "  // comment\n"
> -            "#  define A 0\n"
> -            "// comment\n"
> -            "#  define B 0\n"
> -            "#endif",
> -            format("#if 1\n"
> -                   "// comment\n"
> -                   "#  define A 0\n"
> -                   "   // comment\n"
> -                   "#  define B 0\n"
> -                   "#endif",
> -                   Style));
> +  // Keep comments aligned with #, otherwise indent comments normally. These
> +  // tests cannot use verifyFormat because messUp manipulates leading
> +  // whitespace.
> +  {
> +    const char *Expected = ""
> +                           "void f() {\n"
> +                           "#if 1\n"
> +                           "// Preprocessor aligned.\n"
> +                           "#  define A 0\n"
> +                           "  // Code. Separated by blank line.\n"
> +                           "\n"
> +                           "#  define B 0\n"
> +                           "  // Code. Not aligned with #\n"
> +                           "#  define C 0\n"
> +                           "#endif";
> +    const char *ToFormat = ""
> +                           "void f() {\n"
> +                           "#if 1\n"
> +                           "// Preprocessor aligned.\n"
> +                           "#  define A 0\n"
> +                           "// Code. Separated by blank line.\n"
> +                           "\n"
> +                           "#  define B 0\n"
> +                           "   // Code. Not aligned with #\n"
> +                           "#  define C 0\n"
> +                           "#endif";
> +    EXPECT_EQ(Expected, format(ToFormat, Style));
> +    EXPECT_EQ(Expected, format(Expected, Style));
> +  }
> +  // Keep block quotes aligned.
> +  {
> +    const char *Expected = ""
> +                           "void f() {\n"
> +                           "#if 1\n"
> +                           "/* Preprocessor aligned. */\n"
> +                           "#  define A 0\n"
> +                           "  /* Code. Separated by blank line. */\n"
> +                           "\n"
> +                           "#  define B 0\n"
> +                           "  /* Code. Not aligned with # */\n"
> +                           "#  define C 0\n"
> +                           "#endif";
> +    const char *ToFormat = ""
> +                           "void f() {\n"
> +                           "#if 1\n"
> +                           "/* Preprocessor aligned. */\n"
> +                           "#  define A 0\n"
> +                           "/* Code. Separated by blank line. */\n"
> +                           "\n"
> +                           "#  define B 0\n"
> +                           "   /* Code. Not aligned with # */\n"
> +                           "#  define C 0\n"
> +                           "#endif";
> +    EXPECT_EQ(Expected, format(ToFormat, Style));
> +    EXPECT_EQ(Expected, format(Expected, Style));
> +  }
> +  // Keep comments aligned with un-indented directives.
> +  {
> +    const char *Expected = ""
> +                           "void f() {\n"
> +                           "// Preprocessor aligned.\n"
> +                           "#define A 0\n"
> +                           "  // Code. Separated by blank line.\n"
> +                           "\n"
> +                           "#define B 0\n"
> +                           "  // Code. Not aligned with #\n"
> +                           "#define C 0\n";
> +    const char *ToFormat = ""
> +                           "void f() {\n"
> +                           "// Preprocessor aligned.\n"
> +                           "#define A 0\n"
> +                           "// Code. Separated by blank line.\n"
> +                           "\n"
> +                           "#define B 0\n"
> +                           "   // Code. Not aligned with #\n"
> +                           "#define C 0\n";
> +    EXPECT_EQ(Expected, format(ToFormat, Style));
> +    EXPECT_EQ(Expected, format(Expected, Style));
> +  }
>    // Test with tabs.
>    Style.UseTab = FormatStyle::UT_Always;
>    Style.IndentWidth = 8;
>
>
> _______________________________________________
> cfe-commits mailing list
> cfe-commits at lists.llvm.org
> http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


More information about the cfe-commits mailing list