[clang-format] restore indent in conditionals when AlignOperands is DontAlign

Summary:
After D50078, we're experiencing unexpected un-indent using a style combining `AlignOperands: DontAlign` with `BreakBeforeTernaryOperators: false`, such as Google's JavaScript style:
```
% bin/clang-format -style=google ~/test.js
aaaaaaaaaaa = bbbbbbbb ? cccccccccccccccccc() :
dddddddddd             ? eeeeeeeeeeeeee :
                         fffff;
```
The issue lies with the interaction of `AlignOperands: DontAlign` and the edited code section in ContinuationIndenter.cpp, which de-dents the intent by `Style.ContinuationIndentWidth`. From [[ ac3e5c4d93/clang/include/clang/Format/Format.h (L170) | the documentation ]] of AlignOperands: DontAlign:
> The wrapped lines are indented `ContinuationIndentWidth` spaces from the start of the line.
So the de-dent effectively erases the necessary `ContinuationIndentWidth` in that case.

This patch restores the `AlignOperands: DontAlign` behavior, producing:
```
% bin/clang-format -style=google ~/test.js
aaaaaaaaaaa = bbbbbbbb ? cccccccccccccccccc() :
    dddddddddd         ? eeeeeeeeeeeeee :
                         fffff;
```

Reviewers: sammccall

Reviewed By: sammccall

Subscribers: cfe-commits

Tags: #clang

Differential Revision: https://reviews.llvm.org/D82199
This commit is contained in:
Krasimir Georgiev 2020-06-24 12:55:05 +02:00
parent 31fe8c2763
commit 0fad648b65
2 changed files with 15 additions and 2 deletions

View File

@ -1041,8 +1041,10 @@ unsigned ContinuationIndenter::getNewLineColumn(const LineState &State) {
// * not remove the 'lead' ContinuationIndentWidth
// * always un-indent by the operator when
// BreakBeforeTernaryOperators=true
unsigned Indent =
State.Stack.back().Indent - Style.ContinuationIndentWidth;
unsigned Indent = State.Stack.back().Indent;
if (Style.AlignOperands != FormatStyle::OAS_DontAlign) {
Indent -= Style.ContinuationIndentWidth;
}
if (Style.BreakBeforeTernaryOperators &&
State.Stack.back().UnindentOperator)
Indent -= 2;

View File

@ -6281,6 +6281,17 @@ TEST_F(FormatTest, BreaksConditionalExpressions) {
" : bbbbbbbbbbbbbbbbbbbbbbb ? 2222222222222222\n"
" : 3333333333333333;",
Style);
Style.AlignOperands = FormatStyle::OAS_DontAlign;
Style.BreakBeforeTernaryOperators = false;
// FIXME: Aligning the question marks is weird given DontAlign.
// Consider disabling this alignment in this case. Also check whether this
// will render the adjustment from https://reviews.llvm.org/D82199
// unnecessary.
verifyFormat("int x = aaaaaaaaaaaaaaa ? aaaaaaaaaaaaaaaaaa :\n"
" bbbb ? cccccccccccccccccc :\n"
" ddddd;\n",
Style);
}
TEST_F(FormatTest, BreaksConditionalExpressionsAfterOperator) {