From: Daniel Jasper Date: Tue, 17 Sep 2013 09:52:48 +0000 (+0000) Subject: clang-format: Don't accidentally move tokens into preprocessor directive. X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=ebaa1719fdd180e6dd9b4e6471e83500471a2f16;p=clang clang-format: Don't accidentally move tokens into preprocessor directive. This fixes llvm.org/PR17265. Before: Foo::Foo() #ifdef BAR : baz(0) #endif { } After: Foo::Foo() #ifdef BAR : baz(0) #endif { } git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@190861 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Format/TokenAnnotator.cpp b/lib/Format/TokenAnnotator.cpp index 58a1eeb5a6..0f9f578024 100644 --- a/lib/Format/TokenAnnotator.cpp +++ b/lib/Format/TokenAnnotator.cpp @@ -1039,35 +1039,9 @@ void TokenAnnotator::calculateFormattingInformation(AnnotatedLine &Line) { Current->SpacesRequiredBefore = spaceRequiredBefore(Line, *Current) ? 1 : 0; - if (Current->is(tok::comment)) { - Current->MustBreakBefore = Current->NewlinesBefore > 0; - } else if (Current->Previous->isTrailingComment() || - (Current->is(tok::string_literal) && - Current->Previous->is(tok::string_literal))) { - Current->MustBreakBefore = true; - } else if (Current->Previous->IsUnterminatedLiteral) { - Current->MustBreakBefore = true; - } else if (Current->is(tok::lessless) && Current->Next && - Current->Previous->is(tok::string_literal) && - Current->Next->is(tok::string_literal)) { - Current->MustBreakBefore = true; - } else if (Current->Previous->ClosesTemplateDeclaration && - Current->Previous->MatchingParen && - Current->Previous->MatchingParen->BindingStrength == 1 && - Style.AlwaysBreakTemplateDeclarations) { - // FIXME: Fix horrible hack of using BindingStrength to find top-level <>. - Current->MustBreakBefore = true; - } else if (Current->Type == TT_CtorInitializerComma && - Style.BreakConstructorInitializersBeforeComma) { - Current->MustBreakBefore = true; - } else if (Current->Previous->BlockKind == BK_Block && - Current->Previous->isNot(tok::r_brace) && - Current->isNot(tok::r_brace)) { - Current->MustBreakBefore = true; - } else if (Current->is(tok::l_brace) && (Current->BlockKind == BK_Block)) { - Current->MustBreakBefore = - Style.BreakBeforeBraces == FormatStyle::BS_Allman; - } + Current->MustBreakBefore = + Current->MustBreakBefore || mustBreakBefore(Line, *Current); + Current->CanBreakBefore = Current->MustBreakBefore || canBreakBefore(Line, *Current); if (Current->MustBreakBefore || !Current->Children.empty() || @@ -1357,6 +1331,39 @@ bool TokenAnnotator::spaceRequiredBefore(const AnnotatedLine &Line, return spaceRequiredBetween(Line, *Tok.Previous, Tok); } +bool TokenAnnotator::mustBreakBefore(const AnnotatedLine &Line, + const FormatToken &Right) { + if (Right.is(tok::comment)) { + return Right.NewlinesBefore > 0; + } else if (Right.Previous->isTrailingComment() || + (Right.is(tok::string_literal) && + Right.Previous->is(tok::string_literal))) { + return true; + } else if (Right.Previous->IsUnterminatedLiteral) { + return true; + } else if (Right.is(tok::lessless) && Right.Next && + Right.Previous->is(tok::string_literal) && + Right.Next->is(tok::string_literal)) { + return true; + } else if (Right.Previous->ClosesTemplateDeclaration && + Right.Previous->MatchingParen && + Right.Previous->MatchingParen->BindingStrength == 1 && + Style.AlwaysBreakTemplateDeclarations) { + // FIXME: Fix horrible hack of using BindingStrength to find top-level <>. + return true; + } else if (Right.Type == TT_CtorInitializerComma && + Style.BreakConstructorInitializersBeforeComma) { + return true; + } else if (Right.Previous->BlockKind == BK_Block && + Right.Previous->isNot(tok::r_brace) && + Right.isNot(tok::r_brace)) { + return true; + } else if (Right.is(tok::l_brace) && (Right.BlockKind == BK_Block)) { + return Style.BreakBeforeBraces == FormatStyle::BS_Allman; + } + return false; +} + bool TokenAnnotator::canBreakBefore(const AnnotatedLine &Line, const FormatToken &Right) { const FormatToken &Left = *Right.Previous; diff --git a/lib/Format/TokenAnnotator.h b/lib/Format/TokenAnnotator.h index 06f335215d..91f1b4678a 100644 --- a/lib/Format/TokenAnnotator.h +++ b/lib/Format/TokenAnnotator.h @@ -110,6 +110,8 @@ private: bool spaceRequiredBefore(const AnnotatedLine &Line, const FormatToken &Tok); + bool mustBreakBefore(const AnnotatedLine &Line, const FormatToken &Right); + bool canBreakBefore(const AnnotatedLine &Line, const FormatToken &Right); void printDebugInfo(const AnnotatedLine &Line); diff --git a/unittests/Format/FormatTest.cpp b/unittests/Format/FormatTest.cpp index c5d0171a71..fc13ad150b 100644 --- a/unittests/Format/FormatTest.cpp +++ b/unittests/Format/FormatTest.cpp @@ -2226,6 +2226,12 @@ TEST_F(FormatTest, LayoutStatementsAroundPreprocessorDirectives) { " andMoreParameters),\n" " trailing);", getLLVMStyleWithColumns(69)); + verifyFormat("Foo::Foo()\n" + "#ifdef BAR\n" + " : baz(0)\n" + "#endif\n" + "{\n" + "}"); } TEST_F(FormatTest, LayoutBlockInsideParens) {