r190861 - clang-format: Don't accidentally move tokens into preprocessor directive.
Daniel Jasper
djasper at google.com
Tue Sep 17 02:52:48 PDT 2013
Author: djasper
Date: Tue Sep 17 04:52:48 2013
New Revision: 190861
URL: http://llvm.org/viewvc/llvm-project?rev=190861&view=rev
Log:
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
{
}
Modified:
cfe/trunk/lib/Format/TokenAnnotator.cpp
cfe/trunk/lib/Format/TokenAnnotator.h
cfe/trunk/unittests/Format/FormatTest.cpp
Modified: cfe/trunk/lib/Format/TokenAnnotator.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Format/TokenAnnotator.cpp?rev=190861&r1=190860&r2=190861&view=diff
==============================================================================
--- cfe/trunk/lib/Format/TokenAnnotator.cpp (original)
+++ cfe/trunk/lib/Format/TokenAnnotator.cpp Tue Sep 17 04:52:48 2013
@@ -1039,35 +1039,9 @@ void TokenAnnotator::calculateFormatting
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
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;
Modified: cfe/trunk/lib/Format/TokenAnnotator.h
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Format/TokenAnnotator.h?rev=190861&r1=190860&r2=190861&view=diff
==============================================================================
--- cfe/trunk/lib/Format/TokenAnnotator.h (original)
+++ cfe/trunk/lib/Format/TokenAnnotator.h Tue Sep 17 04:52:48 2013
@@ -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);
Modified: cfe/trunk/unittests/Format/FormatTest.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/unittests/Format/FormatTest.cpp?rev=190861&r1=190860&r2=190861&view=diff
==============================================================================
--- cfe/trunk/unittests/Format/FormatTest.cpp (original)
+++ cfe/trunk/unittests/Format/FormatTest.cpp Tue Sep 17 04:52:48 2013
@@ -2226,6 +2226,12 @@ TEST_F(FormatTest, LayoutStatementsAroun
" andMoreParameters),\n"
" trailing);",
getLLVMStyleWithColumns(69));
+ verifyFormat("Foo::Foo()\n"
+ "#ifdef BAR\n"
+ " : baz(0)\n"
+ "#endif\n"
+ "{\n"
+ "}");
}
TEST_F(FormatTest, LayoutBlockInsideParens) {
More information about the cfe-commits
mailing list