From: Dinesh Dwivedi Date: Mon, 5 May 2014 11:36:35 +0000 (+0000) Subject: Fix bug in clang-format while merging short function X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=4114947c775bbd2b0182a4aefc1c9fe2d4f9a1b0;p=clang Fix bug in clang-format while merging short function Before: #ifdef _DEBUG int foo( int i = 0 ) #else int foo( int i = 5 ) #endif { return i; } After: #ifdef _DEBUG int foo( int i = 0 ) #else int foo( int i = 5 ) #endif { return i; } git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@207958 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Format/Format.cpp b/lib/Format/Format.cpp index 3544cff4dd..21334ad9c8 100644 --- a/lib/Format/Format.cpp +++ b/lib/Format/Format.cpp @@ -532,7 +532,7 @@ public: ? 0 : Limit - TheLine->Last->TotalLength; - if (I + 1 == E || I[1]->Type == LT_Invalid) + if (I + 1 == E || I[1]->Type == LT_Invalid || I[1]->First->MustBreakBefore) return 0; // FIXME: TheLine->Level != 0 might or might not be the right check to do. @@ -664,7 +664,7 @@ private: // Second, check that the next line does not contain any braces - if it // does, readability declines when putting it into a single line. - if (I[1]->Last->Type == TT_LineComment || Tok->MustBreakBefore) + if (I[1]->Last->Type == TT_LineComment) return 0; do { if (Tok->isOneOf(tok::l_brace, tok::r_brace)) @@ -674,8 +674,7 @@ private: // Last, check that the third line contains a single closing brace. Tok = I[2]->First; - if (Tok->getNextNonComment() != NULL || Tok->isNot(tok::r_brace) || - Tok->MustBreakBefore) + if (Tok->getNextNonComment() != NULL || Tok->isNot(tok::r_brace)) return 0; return 2; @@ -698,6 +697,8 @@ private: bool nextTwoLinesFitInto(SmallVectorImpl::const_iterator I, unsigned Limit) { + if (I[1]->First->MustBreakBefore || I[2]->First->MustBreakBefore) + return false; return 1 + I[1]->Last->TotalLength + 1 + I[2]->Last->TotalLength <= Limit; } diff --git a/unittests/Format/FormatTest.cpp b/unittests/Format/FormatTest.cpp index 009df106e4..1380dd85a4 100644 --- a/unittests/Format/FormatTest.cpp +++ b/unittests/Format/FormatTest.cpp @@ -7367,6 +7367,36 @@ TEST_F(FormatTest, StroustrupBraceBreaking) { "}\n" "}", BreakBeforeBrace); + + verifyFormat("#ifdef _DEBUG\n" + "int foo(int i = 0)\n" + "#else\n" + "int foo(int i = 5)\n" + "#endif\n" + "{\n" + " return i;\n" + "}", + BreakBeforeBrace); + + verifyFormat("void foo() {}\n" + "void bar()\n" + "#ifdef _DEBUG\n" + "{\n" + " foo();\n" + "}\n" + "#else\n" + "{\n" + "}\n" + "#endif", + BreakBeforeBrace); + + verifyFormat("void foobar() { int i = 5; }\n" + "#ifdef _DEBUG\n" + "void bar() {}\n" + "#else\n" + "void bar() { foobar(); }\n" + "#endif", + BreakBeforeBrace); } TEST_F(FormatTest, AllmanBraceBreaking) { @@ -7457,6 +7487,36 @@ TEST_F(FormatTest, AllmanBraceBreaking) { "@end\n", BreakBeforeBrace); + verifyFormat("#ifdef _DEBUG\n" + "int foo(int i = 0)\n" + "#else\n" + "int foo(int i = 5)\n" + "#endif\n" + "{\n" + " return i;\n" + "}", + BreakBeforeBrace); + + verifyFormat("void foo() {}\n" + "void bar()\n" + "#ifdef _DEBUG\n" + "{\n" + " foo();\n" + "}\n" + "#else\n" + "{\n" + "}\n" + "#endif", + BreakBeforeBrace); + + verifyFormat("void foobar() { int i = 5; }\n" + "#ifdef _DEBUG\n" + "void bar() {}\n" + "#else\n" + "void bar() { foobar(); }\n" + "#endif", + BreakBeforeBrace); + BreakBeforeBrace.ColumnLimit = 19; verifyFormat("void f() { int i; }", BreakBeforeBrace); BreakBeforeBrace.ColumnLimit = 18; @@ -7585,6 +7645,36 @@ TEST_F(FormatTest, GNUBraceBreaking) { "}\n" "@end\n", GNUBraceStyle); + + verifyFormat("#ifdef _DEBUG\n" + "int foo(int i = 0)\n" + "#else\n" + "int foo(int i = 5)\n" + "#endif\n" + "{\n" + " return i;\n" + "}", + GNUBraceStyle); + + verifyFormat("void foo() {}\n" + "void bar()\n" + "#ifdef _DEBUG\n" + "{\n" + " foo();\n" + "}\n" + "#else\n" + "{\n" + "}\n" + "#endif", + GNUBraceStyle); + + verifyFormat("void foobar() { int i = 5; }\n" + "#ifdef _DEBUG\n" + "void bar() {}\n" + "#else\n" + "void bar() { foobar(); }\n" + "#endif", + GNUBraceStyle); } TEST_F(FormatTest, CatchExceptionReferenceBinding) { verifyFormat("void f() {\n"