From a1036e5d081dd800c71bdbdf858908b99eed03a4 Mon Sep 17 00:00:00 2001 From: Daniel Jasper Date: Wed, 28 Oct 2015 01:08:22 +0000 Subject: [PATCH] clang-format: When a line is formatted, also format subsequence lines if their indent is off. Summary: This is especially important so that if a change is solely inserting a block around a few statements, clang-format-diff.py will still clean up and add indentation to the inner parts. Reviewers: klimek Subscribers: cfe-commits, klimek Differential Revision: http://reviews.llvm.org/D14105 llvm-svn: 251474 --- clang/lib/Format/UnwrappedLineFormatter.cpp | 7 +++-- clang/test/Format/adjust-indent.cpp | 10 +++++++ clang/test/Format/line-ranges.cpp | 8 +++--- clang/test/Format/ranges.cpp | 10 +++---- .../unittests/Format/FormatTestSelective.cpp | 26 +++++++++++++------ 5 files changed, 42 insertions(+), 19 deletions(-) create mode 100644 clang/test/Format/adjust-indent.cpp diff --git a/clang/lib/Format/UnwrappedLineFormatter.cpp b/clang/lib/Format/UnwrappedLineFormatter.cpp index 8225a0375b4f..fcf45c9286f9 100644 --- a/clang/lib/Format/UnwrappedLineFormatter.cpp +++ b/clang/lib/Format/UnwrappedLineFormatter.cpp @@ -812,13 +812,14 @@ UnwrappedLineFormatter::format(const SmallVectorImpl &Lines, AdditionalIndent); const AnnotatedLine *PreviousLine = nullptr; const AnnotatedLine *NextLine = nullptr; + bool PreviousLineFormatted = false; for (const AnnotatedLine *Line = Joiner.getNextMergedLine(DryRun, IndentTracker); Line; Line = NextLine) { const AnnotatedLine &TheLine = *Line; unsigned Indent = IndentTracker.getIndent(); - bool FixIndentation = - FixBadIndentation && (Indent != TheLine.First->OriginalColumn); + bool FixIndentation = (FixBadIndentation || PreviousLineFormatted) && + Indent != TheLine.First->OriginalColumn; bool ShouldFormat = TheLine.Affected || FixIndentation; // We cannot format this line; if the reason is that the line had a // parsing error, remember that. @@ -845,6 +846,7 @@ UnwrappedLineFormatter::format(const SmallVectorImpl &Lines, else Penalty += OptimizingLineFormatter(Indenter, Whitespaces, Style, this) .formatLine(TheLine, Indent, DryRun); + PreviousLineFormatted = true; } else { // If no token in the current line is affected, we still need to format // affected children. @@ -875,6 +877,7 @@ UnwrappedLineFormatter::format(const SmallVectorImpl &Lines, Whitespaces->addUntouchableToken(*Tok, TheLine.InPPDirective); } NextLine = Joiner.getNextMergedLine(DryRun, IndentTracker); + PreviousLineFormatted = false; } if (!DryRun) markFinalized(TheLine.First); diff --git a/clang/test/Format/adjust-indent.cpp b/clang/test/Format/adjust-indent.cpp new file mode 100644 index 000000000000..5565dc00b62d --- /dev/null +++ b/clang/test/Format/adjust-indent.cpp @@ -0,0 +1,10 @@ +// RUN: grep -Ev "// *[A-Z-]+:" %s | clang-format -lines=2:2 \ +// RUN: | FileCheck -strict-whitespace %s + +void f() { +// CHECK: void f() { +int i; +// CHECK: {{^ int\ i;}} + int j; +// CHECK: {{^ int\ j;}} +} diff --git a/clang/test/Format/line-ranges.cpp b/clang/test/Format/line-ranges.cpp index 9099022b428c..e81e9624344d 100644 --- a/clang/test/Format/line-ranges.cpp +++ b/clang/test/Format/line-ranges.cpp @@ -4,8 +4,8 @@ // CHECK: {{^int\ \*i;$}} int*i; -// CHECK: {{^\ \ int\ \ \*\ \ i;$}} - int * i; +// CHECK: {{^int\ \ \*\ \ i;$}} +int * i; -// CHECK: {{^\ \ int\ \*i;$}} - int * i; +// CHECK: {{^int\ \*i;$}} +int * i; diff --git a/clang/test/Format/ranges.cpp b/clang/test/Format/ranges.cpp index ace528a9166c..66b984e037b3 100644 --- a/clang/test/Format/ranges.cpp +++ b/clang/test/Format/ranges.cpp @@ -2,10 +2,10 @@ // RUN: | clang-format -style=LLVM -offset=2 -length=0 -offset=28 -length=0 \ // RUN: | FileCheck -strict-whitespace %s // CHECK: {{^int\ \*i;$}} - int*i; +int*i; -// CHECK: {{^\ \ int\ \ \*\ \ i;$}} - int * i; +// CHECK: {{^int\ \ \*\ \ i;$}} +int * i; -// CHECK: {{^\ \ int\ \*i;$}} - int * i; +// CHECK: {{^int\ \*i;$}} +int * i; diff --git a/clang/unittests/Format/FormatTestSelective.cpp b/clang/unittests/Format/FormatTestSelective.cpp index 8d2cb5a2fcbd..a28dfd32e1ca 100644 --- a/clang/unittests/Format/FormatTestSelective.cpp +++ b/clang/unittests/Format/FormatTestSelective.cpp @@ -45,8 +45,14 @@ TEST_F(FormatTestSelective, RemovesTrailingWhitespaceOfFormattedLine) { } TEST_F(FormatTestSelective, FormatsCorrectRegionForLeadingWhitespace) { - EXPECT_EQ("int b;\nint a;", format("int b;\n int a;", 7, 0)); - EXPECT_EQ("int b;\n int a;", format("int b;\n int a;", 6, 0)); + EXPECT_EQ("{int b;\n" + " int a;\n" + "}", + format("{int b;\n int a;}", 8, 0)); + EXPECT_EQ("{\n" + " int b;\n" + " int a;}", + format("{int b;\n int a;}", 7, 0)); Style.ColumnLimit = 12; EXPECT_EQ("#define A \\\n" @@ -84,11 +90,11 @@ TEST_F(FormatTestSelective, ReformatsMovedLines) { "template T *getFETokenInfo() const {\n" " return static_cast(FETokenInfo);\n" "}\n" - " int a; // <- Should not be formatted", + "int a; // <- Should not be formatted", format( "template\n" "T *getFETokenInfo() const { return static_cast(FETokenInfo); }\n" - " int a; // <- Should not be formatted", + "int a; // <- Should not be formatted", 9, 5)); } @@ -142,12 +148,12 @@ TEST_F(FormatTestSelective, FormatsCommentsLocally) { " // is\n" " // a\n" "\n" - " // This is unrelated", + "//This is unrelated", format("int a; // This\n" " // is\n" " // a\n" "\n" - " // This is unrelated", + "//This is unrelated", 0, 0)); EXPECT_EQ("int a;\n" "// This is\n" @@ -310,13 +316,17 @@ TEST_F(FormatTestSelective, ReformatRegionAdjustsIndent) { EXPECT_EQ("{\n" "{\n" " a;\n" - "b;\n" + " b;\n" + " c;\n" + " d;\n" "}\n" "}", format("{\n" "{\n" " a;\n" - "b;\n" + " b;\n" + " c;\n" + " d;\n" "}\n" "}", 9, 2));