summaryrefslogtreecommitdiffstats
path: root/clang/lib/Format
diff options
context:
space:
mode:
authorDaniel Jasper <djasper@google.com>2013-09-17 09:52:48 +0000
committerDaniel Jasper <djasper@google.com>2013-09-17 09:52:48 +0000
commitfb81b09d8702f5c8d08d6a019331638c13bf71bb (patch)
treee32fe6937f9fbbd36a39440982a1bcf4f05c3732 /clang/lib/Format
parentc947eb08b5ff1a38c1a962cc38399376f4bf63b6 (diff)
downloadbcm5719-llvm-fb81b09d8702f5c8d08d6a019331638c13bf71bb.tar.gz
bcm5719-llvm-fb81b09d8702f5c8d08d6a019331638c13bf71bb.zip
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 { } llvm-svn: 190861
Diffstat (limited to 'clang/lib/Format')
-rw-r--r--clang/lib/Format/TokenAnnotator.cpp65
-rw-r--r--clang/lib/Format/TokenAnnotator.h2
2 files changed, 38 insertions, 29 deletions
diff --git a/clang/lib/Format/TokenAnnotator.cpp b/clang/lib/Format/TokenAnnotator.cpp
index 58a1eeb5a6d..0f9f5780245 100644
--- a/clang/lib/Format/TokenAnnotator.cpp
+++ b/clang/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/clang/lib/Format/TokenAnnotator.h b/clang/lib/Format/TokenAnnotator.h
index 06f335215d1..91f1b4678a1 100644
--- a/clang/lib/Format/TokenAnnotator.h
+++ b/clang/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);
OpenPOWER on IntegriCloud