From 964293e46d72a07a53f91e3ee7e5fd528cf036cf Mon Sep 17 00:00:00 2001 From: Krasimir Georgiev Date: Mon, 14 May 2018 10:33:40 +0000 Subject: [PATCH] [clang-format] Continue after non-scope-closers in getLengthToMatchingParen Summary: This fixes a regression introduced by `r331857` where we stop the search for the End token as soon as we hit a non-scope-closer, which prematurely stops before semicolons for example, which should otherwise be considered as part of the unbreakable tail. Subscribers: klimek, cfe-commits Differential Revision: https://reviews.llvm.org/D46824 llvm-svn: 332225 --- clang/lib/Format/ContinuationIndenter.cpp | 4 +++- clang/unittests/Format/FormatTestObjC.cpp | 12 ++++++++++++ 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/clang/lib/Format/ContinuationIndenter.cpp b/clang/lib/Format/ContinuationIndenter.cpp index 82e5f6e5197bc8..1d04ad0a49999b 100644 --- a/clang/lib/Format/ContinuationIndenter.cpp +++ b/clang/lib/Format/ContinuationIndenter.cpp @@ -90,8 +90,10 @@ static unsigned getLengthToMatchingParen(const FormatToken &Tok, return MatchingStackIndex >= 0 ? &Stack[MatchingStackIndex] : nullptr; }; for (; End->Next; End = End->Next) { - if (End->Next->CanBreakBefore || !End->Next->closesScope()) + if (End->Next->CanBreakBefore) break; + if (!End->Next->closesScope()) + continue; if (End->Next->MatchingParen->isOneOf(tok::l_brace, TT_ArrayInitializerLSquare, tok::less)) { diff --git a/clang/unittests/Format/FormatTestObjC.cpp b/clang/unittests/Format/FormatTestObjC.cpp index c6246fd502540b..459e522308ac61 100644 --- a/clang/unittests/Format/FormatTestObjC.cpp +++ b/clang/unittests/Format/FormatTestObjC.cpp @@ -1142,6 +1142,18 @@ TEST_F(FormatTestObjC, ObjCArrayLiterals) { " @\"aaaaaaaaaaaaaaaaaaaaaaaaaa\"\n" "];\n"); } + +TEST_F(FormatTestObjC, BreaksCallStatementWhereSemiJustOverTheLimit) { + Style.ColumnLimit = 60; + // If the statement starting with 'a = ...' is put on a single line, the ';' + // is at line 61. + verifyFormat("int f(int a) {\n" + " a = [self aaaaaaaaaa:bbbbbbbbb\n" + " ccccccccc:dddddddd\n" + " ee:fddd];\n" + "}"); +} + } // end namespace } // end namespace format } // end namespace clang