From: Daniel Jasper Date: Wed, 7 May 2014 09:23:05 +0000 (+0000) Subject: clang-format: Fix corner cases for comments in if conditions. X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=e486bd0da69731e0242e44fdf6a805b3a8a47344;p=clang clang-format: Fix corner cases for comments in if conditions. Before: if ( // a x + 3) { .. After: if ( // a x + 3) { .. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@208175 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Format/ContinuationIndenter.cpp b/lib/Format/ContinuationIndenter.cpp index f18984bb15..d225bce8bf 100644 --- a/lib/Format/ContinuationIndenter.cpp +++ b/lib/Format/ContinuationIndenter.cpp @@ -290,10 +290,11 @@ void ContinuationIndenter::addTokenOnCurrentLine(LineState &State, bool DryRun, State.Stack.back().ContainsUnwrappedBuilder = true; State.Column += Spaces; - if (Current.is(tok::l_paren) && Previous.isOneOf(tok::kw_if, tok::kw_for)) + if (Current.isNot(tok::comment) && Previous.is(tok::l_paren) && + Previous.Previous && Previous.Previous->isOneOf(tok::kw_if, tok::kw_for)) // Treat the condition inside an if as if it was a second function // parameter, i.e. let nested calls have a continuation indent. - State.Stack.back().LastSpace = State.Column + 1; // 1 is length of "(". + State.Stack.back().LastSpace = State.Column; else if (Current.isNot(tok::comment) && (Previous.is(tok::comma) || (Previous.is(tok::colon) && Previous.Type == TT_ObjCMethodExpr))) diff --git a/lib/Format/TokenAnnotator.cpp b/lib/Format/TokenAnnotator.cpp index a41992679a..21cec905a8 100644 --- a/lib/Format/TokenAnnotator.cpp +++ b/lib/Format/TokenAnnotator.cpp @@ -1667,7 +1667,7 @@ bool TokenAnnotator::canBreakBefore(const AnnotatedLine &Line, return false; if (Left.is(tok::l_paren) && Left.Previous && (Left.Previous->Type == TT_BinaryOperator || - Left.Previous->Type == TT_CastRParen)) + Left.Previous->Type == TT_CastRParen || Left.Previous->is(tok::kw_if))) return false; if (Right.Type == TT_ImplicitStringLiteral) return false; diff --git a/unittests/Format/FormatTest.cpp b/unittests/Format/FormatTest.cpp index bd7e23f60b..75f1854666 100644 --- a/unittests/Format/FormatTest.cpp +++ b/unittests/Format/FormatTest.cpp @@ -390,6 +390,11 @@ TEST_F(FormatTest, ElseIf) { "else {\n" " g()\n" "}"); + + verifyFormat("if (a) {\n" + "} else if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" + " aaaaaaaaaaaaaaaaaaaaaaaaaaaa)) {\n" + "}"); } TEST_F(FormatTest, FormatsForLoop) { @@ -847,6 +852,18 @@ TEST_F(FormatTest, UnderstandsSingleLineComments) { " int i; /* iiiiiiiiiiiiiiiiiiiii */ \\\n" " int jjjjjjjjjjjjjjjjjjjjjjjj; /* */", getLLVMStyleWithColumns(61)); + + verifyFormat("if ( // This is some comment\n" + " x + 3) {\n" + "}"); + EXPECT_EQ("if ( // This is some comment\n" + " // spanning two lines\n" + " x + 3) {\n" + "}", + format("if( // This is some comment\n" + " // spanning two lines\n" + " x + 3) {\n" + "}")); } TEST_F(FormatTest, KeepsParameterWithTrailingCommentsOnTheirOwnLine) {