[clang-Format] Fix indentation of member call after block

Summary:
before patch:
> echo "test() {([]() -> {int b = 32;return 3;}).as("");});" | clang-format -style=Google

```
test() {
  ([]() -> {
    int b = 32;
    return 3;
  })
      .as();
});
```

after patch:
> echo "test() {([]() -> {int b = 32;return 3;}).as("");});" | clang-format -style=Google

```
test() {
  ([]() -> {
    int b = 32;
    return 3;
  }).as();
});
```

Patch by Anders Karlsson (ank)!

Reviewers: klimek

Reviewed By: klimek

Subscribers: danilaml, acoomans, klimek, cfe-commits

Differential Revision: https://reviews.llvm.org/D45719

llvm-svn: 342363
This commit is contained in:
Ilya Biryukov 2018-09-17 07:46:20 +00:00
parent a57afd091f
commit 370eff85b9
3 changed files with 45 additions and 1 deletions

View File

@ -403,7 +403,9 @@ bool ContinuationIndenter::mustBreak(const LineState &State) {
// }.bind(...));
// FIXME: We should find a more generic solution to this problem.
!(State.Column <= NewLineColumn &&
Style.Language == FormatStyle::LK_JavaScript))
Style.Language == FormatStyle::LK_JavaScript) &&
!(Previous.closesScopeAfterBlock() &&
State.Column <= NewLineColumn))
return true;
// If the template declaration spans multiple lines, force wrap before the

View File

@ -325,6 +325,14 @@ struct FormatToken {
}
template <typename T> bool isNot(T Kind) const { return !is(Kind); }
bool closesScopeAfterBlock() const {
if (BlockKind == BK_Block)
return true;
if (closesScope())
return Previous->closesScopeAfterBlock();
return false;
}
/// \c true if this token starts a sequence with the given tokens in order,
/// following the ``Next`` pointers, ignoring comments.
template <typename A, typename... Ts>

View File

@ -4557,6 +4557,40 @@ TEST_F(FormatTest, FormatsBuilderPattern) {
verifyFormat("aaaa.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
" aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
" .aaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
// Dont break if only closing statements before member call
verifyFormat("test() {\n"
" ([]() -> {\n"
" int b = 32;\n"
" return 3;\n"
" }).foo();\n"
"}");
verifyFormat("test() {\n"
" (\n"
" []() -> {\n"
" int b = 32;\n"
" return 3;\n"
" },\n"
" foo, bar)\n"
" .foo();\n"
"}");
verifyFormat("test() {\n"
" ([]() -> {\n"
" int b = 32;\n"
" return 3;\n"
" })\n"
" .foo()\n"
" .bar();\n"
"}");
verifyFormat("test() {\n"
" ([]() -> {\n"
" int b = 32;\n"
" return 3;\n"
" })\n"
" .foo(\"aaaaaaaaaaaaaaaaa\"\n"
" \"bbbb\");\n"
"}",
getLLVMStyleWithColumns(30));
}
TEST_F(FormatTest, BreaksAccordingToOperatorPrecedence) {