1 //===--- UnwrappedLineFormatter.cpp - Format C++ code ---------------------===// 2 // 3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4 // See https://llvm.org/LICENSE.txt for license information. 5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6 // 7 //===----------------------------------------------------------------------===// 8 9 #include "UnwrappedLineFormatter.h" 10 #include "FormatToken.h" 11 #include "NamespaceEndCommentsFixer.h" 12 #include "WhitespaceManager.h" 13 #include "llvm/Support/Debug.h" 14 #include <queue> 15 16 #define DEBUG_TYPE "format-formatter" 17 18 namespace clang { 19 namespace format { 20 21 namespace { 22 23 bool startsExternCBlock(const AnnotatedLine &Line) { 24 const FormatToken *Next = Line.First->getNextNonComment(); 25 const FormatToken *NextNext = Next ? Next->getNextNonComment() : nullptr; 26 return Line.startsWith(tok::kw_extern) && Next && Next->isStringLiteral() && 27 NextNext && NextNext->is(tok::l_brace); 28 } 29 30 bool isRecordLBrace(const FormatToken &Tok) { 31 return Tok.isOneOf(TT_ClassLBrace, TT_EnumLBrace, TT_RecordLBrace, 32 TT_StructLBrace, TT_UnionLBrace); 33 } 34 35 /// Tracks the indent level of \c AnnotatedLines across levels. 36 /// 37 /// \c nextLine must be called for each \c AnnotatedLine, after which \c 38 /// getIndent() will return the indent for the last line \c nextLine was called 39 /// with. 40 /// If the line is not formatted (and thus the indent does not change), calling 41 /// \c adjustToUnmodifiedLine after the call to \c nextLine will cause 42 /// subsequent lines on the same level to be indented at the same level as the 43 /// given line. 44 class LevelIndentTracker { 45 public: 46 LevelIndentTracker(const FormatStyle &Style, 47 const AdditionalKeywords &Keywords, unsigned StartLevel, 48 int AdditionalIndent) 49 : Style(Style), Keywords(Keywords), AdditionalIndent(AdditionalIndent) { 50 for (unsigned i = 0; i != StartLevel; ++i) 51 IndentForLevel.push_back(Style.IndentWidth * i + AdditionalIndent); 52 } 53 54 /// Returns the indent for the current line. 55 unsigned getIndent() const { return Indent; } 56 57 /// Update the indent state given that \p Line is going to be formatted 58 /// next. 59 void nextLine(const AnnotatedLine &Line) { 60 Offset = getIndentOffset(Line); 61 // Update the indent level cache size so that we can rely on it 62 // having the right size in adjustToUnmodifiedline. 63 if (Line.Level >= IndentForLevel.size()) 64 IndentForLevel.resize(Line.Level + 1, -1); 65 if (Style.IndentPPDirectives != FormatStyle::PPDIS_None && 66 (Line.InPPDirective || 67 (Style.IndentPPDirectives == FormatStyle::PPDIS_BeforeHash && 68 Line.Type == LT_CommentAbovePPDirective))) { 69 unsigned PPIndentWidth = 70 (Style.PPIndentWidth >= 0) ? Style.PPIndentWidth : Style.IndentWidth; 71 Indent = Line.InMacroBody 72 ? Line.PPLevel * PPIndentWidth + 73 (Line.Level - Line.PPLevel) * Style.IndentWidth 74 : Line.Level * PPIndentWidth; 75 Indent += AdditionalIndent; 76 } else { 77 // When going to lower levels, forget previous higher levels so that we 78 // recompute future higher levels. But don't forget them if we enter a PP 79 // directive, since these do not terminate a C++ code block. 80 if (!Line.InPPDirective) { 81 assert(Line.Level <= IndentForLevel.size()); 82 IndentForLevel.resize(Line.Level + 1); 83 } 84 Indent = getIndent(Line.Level); 85 } 86 if (static_cast<int>(Indent) + Offset >= 0) 87 Indent += Offset; 88 if (Line.IsContinuation) 89 Indent = Line.Level * Style.IndentWidth + Style.ContinuationIndentWidth; 90 } 91 92 /// Update the level indent to adapt to the given \p Line. 93 /// 94 /// When a line is not formatted, we move the subsequent lines on the same 95 /// level to the same indent. 96 /// Note that \c nextLine must have been called before this method. 97 void adjustToUnmodifiedLine(const AnnotatedLine &Line) { 98 if (Line.InPPDirective || Line.IsContinuation) 99 return; 100 assert(Line.Level < IndentForLevel.size()); 101 if (Line.First->is(tok::comment) && IndentForLevel[Line.Level] != -1) 102 return; 103 unsigned LevelIndent = Line.First->OriginalColumn; 104 if (static_cast<int>(LevelIndent) - Offset >= 0) 105 LevelIndent -= Offset; 106 IndentForLevel[Line.Level] = LevelIndent; 107 } 108 109 private: 110 /// Get the offset of the line relatively to the level. 111 /// 112 /// For example, 'public:' labels in classes are offset by 1 or 2 113 /// characters to the left from their level. 114 int getIndentOffset(const AnnotatedLine &Line) { 115 if (Style.Language == FormatStyle::LK_Java || Style.isJavaScript() || 116 Style.isCSharp()) { 117 return 0; 118 } 119 120 auto IsAccessModifier = [&](const FormatToken &RootToken) { 121 if (Line.Type == LT_AccessModifier || RootToken.isObjCAccessSpecifier()) 122 return true; 123 124 const auto *Next = RootToken.Next; 125 126 // Handle Qt signals. 127 if (RootToken.isOneOf(Keywords.kw_signals, Keywords.kw_qsignals) && 128 Next && Next->is(tok::colon)) { 129 return true; 130 } 131 132 if (Next && Next->isOneOf(Keywords.kw_slots, Keywords.kw_qslots) && 133 Next->Next && Next->Next->is(tok::colon)) { 134 return true; 135 } 136 137 // Handle malformed access specifier e.g. 'private' without trailing ':'. 138 return !Next && RootToken.isAccessSpecifier(false); 139 }; 140 141 if (IsAccessModifier(*Line.First)) { 142 // The AccessModifierOffset may be overridden by IndentAccessModifiers, 143 // in which case we take a negative value of the IndentWidth to simulate 144 // the upper indent level. 145 return Style.IndentAccessModifiers ? -Style.IndentWidth 146 : Style.AccessModifierOffset; 147 } 148 149 return 0; 150 } 151 152 /// Get the indent of \p Level from \p IndentForLevel. 153 /// 154 /// \p IndentForLevel must contain the indent for the level \c l 155 /// at \p IndentForLevel[l], or a value < 0 if the indent for 156 /// that level is unknown. 157 unsigned getIndent(unsigned Level) const { 158 assert(Level < IndentForLevel.size()); 159 if (IndentForLevel[Level] != -1) 160 return IndentForLevel[Level]; 161 if (Level == 0) 162 return 0; 163 return getIndent(Level - 1) + Style.IndentWidth; 164 } 165 166 const FormatStyle &Style; 167 const AdditionalKeywords &Keywords; 168 const unsigned AdditionalIndent; 169 170 /// The indent in characters for each level. It remembers the indent of 171 /// previous lines (that are not PP directives) of equal or lower levels. This 172 /// is used to align formatted lines to the indent of previous non-formatted 173 /// lines. Think about the --lines parameter of clang-format. 174 SmallVector<int> IndentForLevel; 175 176 /// Offset of the current line relative to the indent level. 177 /// 178 /// For example, the 'public' keywords is often indented with a negative 179 /// offset. 180 int Offset = 0; 181 182 /// The current line's indent. 183 unsigned Indent = 0; 184 }; 185 186 const FormatToken * 187 getMatchingNamespaceToken(const AnnotatedLine *Line, 188 const ArrayRef<AnnotatedLine *> &AnnotatedLines) { 189 if (!Line->startsWith(tok::r_brace)) 190 return nullptr; 191 size_t StartLineIndex = Line->MatchingOpeningBlockLineIndex; 192 if (StartLineIndex == UnwrappedLine::kInvalidIndex) 193 return nullptr; 194 assert(StartLineIndex < AnnotatedLines.size()); 195 return AnnotatedLines[StartLineIndex]->First->getNamespaceToken(); 196 } 197 198 StringRef getNamespaceTokenText(const AnnotatedLine *Line) { 199 const FormatToken *NamespaceToken = Line->First->getNamespaceToken(); 200 return NamespaceToken ? NamespaceToken->TokenText : StringRef(); 201 } 202 203 StringRef 204 getMatchingNamespaceTokenText(const AnnotatedLine *Line, 205 const ArrayRef<AnnotatedLine *> &AnnotatedLines) { 206 const FormatToken *NamespaceToken = 207 getMatchingNamespaceToken(Line, AnnotatedLines); 208 return NamespaceToken ? NamespaceToken->TokenText : StringRef(); 209 } 210 211 class LineJoiner { 212 public: 213 LineJoiner(const FormatStyle &Style, const AdditionalKeywords &Keywords, 214 const SmallVectorImpl<AnnotatedLine *> &Lines) 215 : Style(Style), Keywords(Keywords), End(Lines.end()), Next(Lines.begin()), 216 AnnotatedLines(Lines) {} 217 218 /// Returns the next line, merging multiple lines into one if possible. 219 const AnnotatedLine *getNextMergedLine(bool DryRun, 220 LevelIndentTracker &IndentTracker) { 221 if (Next == End) 222 return nullptr; 223 const AnnotatedLine *Current = *Next; 224 IndentTracker.nextLine(*Current); 225 unsigned MergedLines = tryFitMultipleLinesInOne(IndentTracker, Next, End); 226 if (MergedLines > 0 && Style.ColumnLimit == 0) { 227 // Disallow line merging if there is a break at the start of one of the 228 // input lines. 229 for (unsigned i = 0; i < MergedLines; ++i) 230 if (Next[i + 1]->First->NewlinesBefore > 0) 231 MergedLines = 0; 232 } 233 if (!DryRun) 234 for (unsigned i = 0; i < MergedLines; ++i) 235 join(*Next[0], *Next[i + 1]); 236 Next = Next + MergedLines + 1; 237 return Current; 238 } 239 240 private: 241 /// Calculates how many lines can be merged into 1 starting at \p I. 242 unsigned 243 tryFitMultipleLinesInOne(LevelIndentTracker &IndentTracker, 244 ArrayRef<AnnotatedLine *>::const_iterator I, 245 ArrayRef<AnnotatedLine *>::const_iterator E) { 246 const unsigned Indent = IndentTracker.getIndent(); 247 248 // Can't join the last line with anything. 249 if (I + 1 == E) 250 return 0; 251 // We can never merge stuff if there are trailing line comments. 252 const AnnotatedLine *TheLine = *I; 253 if (TheLine->Last->is(TT_LineComment)) 254 return 0; 255 const auto &NextLine = *I[1]; 256 if (NextLine.Type == LT_Invalid || NextLine.First->MustBreakBefore) 257 return 0; 258 if (TheLine->InPPDirective && 259 (!NextLine.InPPDirective || NextLine.First->HasUnescapedNewline)) { 260 return 0; 261 } 262 263 if (Style.ColumnLimit > 0 && Indent > Style.ColumnLimit) 264 return 0; 265 266 unsigned Limit = 267 Style.ColumnLimit == 0 ? UINT_MAX : Style.ColumnLimit - Indent; 268 // If we already exceed the column limit, we set 'Limit' to 0. The different 269 // tryMerge..() functions can then decide whether to still do merging. 270 Limit = TheLine->Last->TotalLength > Limit 271 ? 0 272 : Limit - TheLine->Last->TotalLength; 273 274 if (TheLine->Last->is(TT_FunctionLBrace) && 275 TheLine->First == TheLine->Last && 276 !Style.BraceWrapping.SplitEmptyFunction && 277 NextLine.First->is(tok::r_brace)) { 278 return tryMergeSimpleBlock(I, E, Limit); 279 } 280 281 const auto *PreviousLine = I != AnnotatedLines.begin() ? I[-1] : nullptr; 282 // Handle empty record blocks where the brace has already been wrapped. 283 if (PreviousLine && TheLine->Last->is(tok::l_brace) && 284 TheLine->First == TheLine->Last) { 285 bool EmptyBlock = NextLine.First->is(tok::r_brace); 286 287 const FormatToken *Tok = PreviousLine->First; 288 if (Tok && Tok->is(tok::comment)) 289 Tok = Tok->getNextNonComment(); 290 291 if (Tok && Tok->getNamespaceToken()) { 292 return !Style.BraceWrapping.SplitEmptyNamespace && EmptyBlock 293 ? tryMergeSimpleBlock(I, E, Limit) 294 : 0; 295 } 296 297 if (Tok && Tok->is(tok::kw_typedef)) 298 Tok = Tok->getNextNonComment(); 299 if (Tok && Tok->isOneOf(tok::kw_class, tok::kw_struct, tok::kw_union, 300 tok::kw_extern, Keywords.kw_interface)) { 301 return !Style.BraceWrapping.SplitEmptyRecord && EmptyBlock 302 ? tryMergeSimpleBlock(I, E, Limit) 303 : 0; 304 } 305 306 if (Tok && Tok->is(tok::kw_template) && 307 Style.BraceWrapping.SplitEmptyRecord && EmptyBlock) { 308 return 0; 309 } 310 } 311 312 auto ShouldMergeShortFunctions = [this, &I, &NextLine, PreviousLine, 313 TheLine]() { 314 if (Style.AllowShortFunctionsOnASingleLine == FormatStyle::SFS_All) 315 return true; 316 if (Style.AllowShortFunctionsOnASingleLine >= FormatStyle::SFS_Empty && 317 NextLine.First->is(tok::r_brace)) { 318 return true; 319 } 320 321 if (Style.AllowShortFunctionsOnASingleLine & 322 FormatStyle::SFS_InlineOnly) { 323 // Just checking TheLine->Level != 0 is not enough, because it 324 // provokes treating functions inside indented namespaces as short. 325 if (Style.isJavaScript() && TheLine->Last->is(TT_FunctionLBrace)) 326 return true; 327 328 if (TheLine->Level != 0) { 329 if (!PreviousLine) 330 return false; 331 332 // TODO: Use IndentTracker to avoid loop? 333 // Find the last line with lower level. 334 const AnnotatedLine *Line = nullptr; 335 for (auto J = I - 1; J >= AnnotatedLines.begin(); --J) { 336 assert(*J); 337 if (!(*J)->InPPDirective && !(*J)->isComment() && 338 (*J)->Level < TheLine->Level) { 339 Line = *J; 340 break; 341 } 342 } 343 344 if (!Line) 345 return false; 346 347 // Check if the found line starts a record. 348 const auto *LastNonComment = Line->getLastNonComment(); 349 // There must be another token (usually `{`), because we chose a 350 // non-PPDirective and non-comment line that has a smaller level. 351 assert(LastNonComment); 352 return isRecordLBrace(*LastNonComment); 353 } 354 } 355 356 return false; 357 }; 358 359 bool MergeShortFunctions = ShouldMergeShortFunctions(); 360 361 const auto *FirstNonComment = TheLine->getFirstNonComment(); 362 if (!FirstNonComment) 363 return 0; 364 365 // FIXME: There are probably cases where we should use FirstNonComment 366 // instead of TheLine->First. 367 368 if (Style.AllowShortNamespacesOnASingleLine && 369 TheLine->First->is(tok::kw_namespace) && 370 TheLine->Last->is(tok::l_brace)) { 371 const auto result = tryMergeNamespace(I, E, Limit); 372 if (result > 0) 373 return result; 374 } 375 376 if (Style.CompactNamespaces) { 377 if (const auto *NSToken = TheLine->First->getNamespaceToken()) { 378 int J = 1; 379 assert(TheLine->MatchingClosingBlockLineIndex > 0); 380 for (auto ClosingLineIndex = TheLine->MatchingClosingBlockLineIndex - 1; 381 I + J != E && NSToken->TokenText == getNamespaceTokenText(I[J]) && 382 ClosingLineIndex == I[J]->MatchingClosingBlockLineIndex && 383 I[J]->Last->TotalLength < Limit; 384 ++J, --ClosingLineIndex) { 385 Limit -= I[J]->Last->TotalLength + 1; 386 387 // Reduce indent level for bodies of namespaces which were compacted, 388 // but only if their content was indented in the first place. 389 auto *ClosingLine = AnnotatedLines.begin() + ClosingLineIndex + 1; 390 const int OutdentBy = I[J]->Level - TheLine->Level; 391 assert(OutdentBy >= 0); 392 for (auto *CompactedLine = I + J; CompactedLine <= ClosingLine; 393 ++CompactedLine) { 394 if (!(*CompactedLine)->InPPDirective) { 395 const int Level = (*CompactedLine)->Level; 396 (*CompactedLine)->Level = std::max(Level - OutdentBy, 0); 397 } 398 } 399 } 400 return J - 1; 401 } 402 403 if (auto nsToken = getMatchingNamespaceToken(TheLine, AnnotatedLines)) { 404 int i = 0; 405 unsigned openingLine = TheLine->MatchingOpeningBlockLineIndex - 1; 406 for (; I + 1 + i != E && 407 nsToken->TokenText == 408 getMatchingNamespaceTokenText(I[i + 1], AnnotatedLines) && 409 openingLine == I[i + 1]->MatchingOpeningBlockLineIndex; 410 i++, --openingLine) { 411 // No space between consecutive braces. 412 I[i + 1]->First->SpacesRequiredBefore = 413 I[i]->Last->isNot(tok::r_brace); 414 415 // Indent like the outer-most namespace. 416 IndentTracker.nextLine(*I[i + 1]); 417 } 418 return i; 419 } 420 } 421 422 const auto *LastNonComment = TheLine->getLastNonComment(); 423 assert(LastNonComment); 424 // FIXME: There are probably cases where we should use LastNonComment 425 // instead of TheLine->Last. 426 427 // Try to merge a function block with left brace unwrapped. 428 if (LastNonComment->is(TT_FunctionLBrace) && 429 TheLine->First != LastNonComment) { 430 return MergeShortFunctions ? tryMergeSimpleBlock(I, E, Limit) : 0; 431 } 432 433 // Try to merge a control statement block with left brace unwrapped. 434 if (TheLine->Last->is(tok::l_brace) && FirstNonComment != TheLine->Last && 435 (FirstNonComment->isOneOf(tok::kw_if, tok::kw_while, tok::kw_for, 436 TT_ForEachMacro) || 437 TheLine->startsWithExportBlock())) { 438 return Style.AllowShortBlocksOnASingleLine != FormatStyle::SBS_Never 439 ? tryMergeSimpleBlock(I, E, Limit) 440 : 0; 441 } 442 // Try to merge a control statement block with left brace wrapped. 443 if (NextLine.First->is(tok::l_brace)) { 444 if ((TheLine->First->isOneOf(tok::kw_if, tok::kw_else, tok::kw_while, 445 tok::kw_for, tok::kw_switch, tok::kw_try, 446 tok::kw_do, TT_ForEachMacro) || 447 (TheLine->First->is(tok::r_brace) && TheLine->First->Next && 448 TheLine->First->Next->isOneOf(tok::kw_else, tok::kw_catch))) && 449 Style.BraceWrapping.AfterControlStatement == 450 FormatStyle::BWACS_MultiLine) { 451 // If possible, merge the next line's wrapped left brace with the 452 // current line. Otherwise, leave it on the next line, as this is a 453 // multi-line control statement. 454 return (Style.ColumnLimit == 0 || TheLine->Level * Style.IndentWidth + 455 TheLine->Last->TotalLength <= 456 Style.ColumnLimit) 457 ? 1 458 : 0; 459 } 460 if (TheLine->First->isOneOf(tok::kw_if, tok::kw_else, tok::kw_while, 461 tok::kw_for, TT_ForEachMacro)) { 462 return (Style.BraceWrapping.AfterControlStatement == 463 FormatStyle::BWACS_Always) 464 ? tryMergeSimpleBlock(I, E, Limit) 465 : 0; 466 } 467 if (TheLine->First->isOneOf(tok::kw_else, tok::kw_catch) && 468 Style.BraceWrapping.AfterControlStatement == 469 FormatStyle::BWACS_MultiLine) { 470 // This case if different from the upper BWACS_MultiLine processing 471 // in that a preceding r_brace is not on the same line as else/catch 472 // most likely because of BeforeElse/BeforeCatch set to true. 473 // If the line length doesn't fit ColumnLimit, leave l_brace on the 474 // next line to respect the BWACS_MultiLine. 475 return (Style.ColumnLimit == 0 || 476 TheLine->Last->TotalLength <= Style.ColumnLimit) 477 ? 1 478 : 0; 479 } 480 } 481 if (PreviousLine && TheLine->First->is(tok::l_brace)) { 482 switch (PreviousLine->First->Tok.getKind()) { 483 case tok::at: 484 // Don't merge block with left brace wrapped after ObjC special blocks. 485 if (PreviousLine->First->Next) { 486 tok::ObjCKeywordKind kwId = 487 PreviousLine->First->Next->Tok.getObjCKeywordID(); 488 if (kwId == tok::objc_autoreleasepool || 489 kwId == tok::objc_synchronized) { 490 return 0; 491 } 492 } 493 break; 494 495 case tok::kw_case: 496 case tok::kw_default: 497 // Don't merge block with left brace wrapped after case labels. 498 return 0; 499 500 default: 501 break; 502 } 503 } 504 505 // Don't merge an empty template class or struct if SplitEmptyRecords 506 // is defined. 507 if (PreviousLine && Style.BraceWrapping.SplitEmptyRecord && 508 TheLine->Last->is(tok::l_brace) && PreviousLine->Last) { 509 const FormatToken *Previous = PreviousLine->Last; 510 if (Previous) { 511 if (Previous->is(tok::comment)) 512 Previous = Previous->getPreviousNonComment(); 513 if (Previous) { 514 if (Previous->is(tok::greater) && !PreviousLine->InPPDirective) 515 return 0; 516 if (Previous->is(tok::identifier)) { 517 const FormatToken *PreviousPrevious = 518 Previous->getPreviousNonComment(); 519 if (PreviousPrevious && 520 PreviousPrevious->isOneOf(tok::kw_class, tok::kw_struct)) { 521 return 0; 522 } 523 } 524 } 525 } 526 } 527 528 if (TheLine->First->is(TT_SwitchExpressionLabel)) { 529 return Style.AllowShortCaseExpressionOnASingleLine 530 ? tryMergeShortCaseLabels(I, E, Limit) 531 : 0; 532 } 533 534 if (TheLine->Last->is(tok::l_brace)) { 535 bool ShouldMerge = false; 536 // Try to merge records. 537 if (TheLine->Last->is(TT_EnumLBrace)) { 538 ShouldMerge = Style.AllowShortEnumsOnASingleLine; 539 } else if (TheLine->Last->is(TT_CompoundRequirementLBrace)) { 540 ShouldMerge = Style.AllowShortCompoundRequirementOnASingleLine; 541 } else if (TheLine->Last->isOneOf(TT_ClassLBrace, TT_StructLBrace)) { 542 // NOTE: We use AfterClass (whereas AfterStruct exists) for both classes 543 // and structs, but it seems that wrapping is still handled correctly 544 // elsewhere. 545 ShouldMerge = !Style.BraceWrapping.AfterClass || 546 (NextLine.First->is(tok::r_brace) && 547 !Style.BraceWrapping.SplitEmptyRecord); 548 } else if (TheLine->InPPDirective || 549 !TheLine->First->isOneOf(tok::kw_class, tok::kw_enum, 550 tok::kw_struct)) { 551 // Try to merge a block with left brace unwrapped that wasn't yet 552 // covered. 553 ShouldMerge = !Style.BraceWrapping.AfterFunction || 554 (NextLine.First->is(tok::r_brace) && 555 !Style.BraceWrapping.SplitEmptyFunction); 556 } 557 return ShouldMerge ? tryMergeSimpleBlock(I, E, Limit) : 0; 558 } 559 560 // Try to merge a function block with left brace wrapped. 561 if (NextLine.First->is(TT_FunctionLBrace) && 562 Style.BraceWrapping.AfterFunction) { 563 if (NextLine.Last->is(TT_LineComment)) 564 return 0; 565 566 // Check for Limit <= 2 to account for the " {". 567 if (Limit <= 2 || (Style.ColumnLimit == 0 && containsMustBreak(TheLine))) 568 return 0; 569 Limit -= 2; 570 571 unsigned MergedLines = 0; 572 if (MergeShortFunctions || 573 (Style.AllowShortFunctionsOnASingleLine >= FormatStyle::SFS_Empty && 574 NextLine.First == NextLine.Last && I + 2 != E && 575 I[2]->First->is(tok::r_brace))) { 576 MergedLines = tryMergeSimpleBlock(I + 1, E, Limit); 577 // If we managed to merge the block, count the function header, which is 578 // on a separate line. 579 if (MergedLines > 0) 580 ++MergedLines; 581 } 582 return MergedLines; 583 } 584 auto IsElseLine = [&TheLine]() -> bool { 585 const FormatToken *First = TheLine->First; 586 if (First->is(tok::kw_else)) 587 return true; 588 589 return First->is(tok::r_brace) && First->Next && 590 First->Next->is(tok::kw_else); 591 }; 592 if (TheLine->First->is(tok::kw_if) || 593 (IsElseLine() && (Style.AllowShortIfStatementsOnASingleLine == 594 FormatStyle::SIS_AllIfsAndElse))) { 595 return Style.AllowShortIfStatementsOnASingleLine 596 ? tryMergeSimpleControlStatement(I, E, Limit) 597 : 0; 598 } 599 if (TheLine->First->isOneOf(tok::kw_for, tok::kw_while, tok::kw_do, 600 TT_ForEachMacro)) { 601 return Style.AllowShortLoopsOnASingleLine 602 ? tryMergeSimpleControlStatement(I, E, Limit) 603 : 0; 604 } 605 if (TheLine->First->isOneOf(tok::kw_case, tok::kw_default)) { 606 return Style.AllowShortCaseLabelsOnASingleLine 607 ? tryMergeShortCaseLabels(I, E, Limit) 608 : 0; 609 } 610 if (TheLine->InPPDirective && 611 (TheLine->First->HasUnescapedNewline || TheLine->First->IsFirst)) { 612 return tryMergeSimplePPDirective(I, E, Limit); 613 } 614 return 0; 615 } 616 617 unsigned 618 tryMergeSimplePPDirective(ArrayRef<AnnotatedLine *>::const_iterator I, 619 ArrayRef<AnnotatedLine *>::const_iterator E, 620 unsigned Limit) { 621 if (Limit == 0) 622 return 0; 623 if (I + 2 != E && I[2]->InPPDirective && !I[2]->First->HasUnescapedNewline) 624 return 0; 625 if (1 + I[1]->Last->TotalLength > Limit) 626 return 0; 627 return 1; 628 } 629 630 unsigned tryMergeNamespace(ArrayRef<AnnotatedLine *>::const_iterator I, 631 ArrayRef<AnnotatedLine *>::const_iterator E, 632 unsigned Limit) { 633 if (Limit == 0) 634 return 0; 635 636 assert(I[1]); 637 const auto &L1 = *I[1]; 638 if (L1.InPPDirective != (*I)->InPPDirective || 639 (L1.InPPDirective && L1.First->HasUnescapedNewline)) { 640 return 0; 641 } 642 643 if (std::distance(I, E) <= 2) 644 return 0; 645 646 assert(I[2]); 647 const auto &L2 = *I[2]; 648 if (L2.Type == LT_Invalid) 649 return 0; 650 651 Limit = limitConsideringMacros(I + 1, E, Limit); 652 653 if (!nextTwoLinesFitInto(I, Limit)) 654 return 0; 655 656 // Check if it's a namespace inside a namespace, and call recursively if so. 657 // '3' is the sizes of the whitespace and closing brace for " _inner_ }". 658 if (L1.First->is(tok::kw_namespace)) { 659 if (L1.Last->is(tok::comment) || !Style.CompactNamespaces) 660 return 0; 661 662 assert(Limit >= L1.Last->TotalLength + 3); 663 const auto InnerLimit = Limit - L1.Last->TotalLength - 3; 664 const auto MergedLines = tryMergeNamespace(I + 1, E, InnerLimit); 665 if (MergedLines == 0) 666 return 0; 667 const auto N = MergedLines + 2; 668 // Check if there is even a line after the inner result. 669 if (std::distance(I, E) <= N) 670 return 0; 671 // Check that the line after the inner result starts with a closing brace 672 // which we are permitted to merge into one line. 673 if (I[N]->First->is(tok::r_brace) && !I[N]->First->MustBreakBefore && 674 I[MergedLines + 1]->Last->isNot(tok::comment) && 675 nextNLinesFitInto(I, I + N + 1, Limit)) { 676 return N; 677 } 678 return 0; 679 } 680 681 // There's no inner namespace, so we are considering to merge at most one 682 // line. 683 684 // The line which is in the namespace should end with semicolon. 685 if (L1.Last->isNot(tok::semi)) 686 return 0; 687 688 // Last, check that the third line starts with a closing brace. 689 if (L2.First->isNot(tok::r_brace) || L2.First->MustBreakBefore) 690 return 0; 691 692 // If so, merge all three lines. 693 return 2; 694 } 695 696 unsigned 697 tryMergeSimpleControlStatement(ArrayRef<AnnotatedLine *>::const_iterator I, 698 ArrayRef<AnnotatedLine *>::const_iterator E, 699 unsigned Limit) { 700 if (Limit == 0) 701 return 0; 702 if (Style.BraceWrapping.AfterControlStatement == 703 FormatStyle::BWACS_Always && 704 I[1]->First->is(tok::l_brace) && 705 Style.AllowShortBlocksOnASingleLine == FormatStyle::SBS_Never) { 706 return 0; 707 } 708 if (I[1]->InPPDirective != (*I)->InPPDirective || 709 (I[1]->InPPDirective && I[1]->First->HasUnescapedNewline)) { 710 return 0; 711 } 712 Limit = limitConsideringMacros(I + 1, E, Limit); 713 AnnotatedLine &Line = **I; 714 if (Line.First->isNot(tok::kw_do) && Line.First->isNot(tok::kw_else) && 715 Line.Last->isNot(tok::kw_else) && Line.Last->isNot(tok::r_paren)) { 716 return 0; 717 } 718 // Only merge `do while` if `do` is the only statement on the line. 719 if (Line.First->is(tok::kw_do) && Line.Last->isNot(tok::kw_do)) 720 return 0; 721 if (1 + I[1]->Last->TotalLength > Limit) 722 return 0; 723 // Don't merge with loops, ifs, a single semicolon or a line comment. 724 if (I[1]->First->isOneOf(tok::semi, tok::kw_if, tok::kw_for, tok::kw_while, 725 TT_ForEachMacro, TT_LineComment)) { 726 return 0; 727 } 728 // Only inline simple if's (no nested if or else), unless specified 729 if (Style.AllowShortIfStatementsOnASingleLine == 730 FormatStyle::SIS_WithoutElse) { 731 if (I + 2 != E && Line.startsWith(tok::kw_if) && 732 I[2]->First->is(tok::kw_else)) { 733 return 0; 734 } 735 } 736 return 1; 737 } 738 739 unsigned tryMergeShortCaseLabels(ArrayRef<AnnotatedLine *>::const_iterator I, 740 ArrayRef<AnnotatedLine *>::const_iterator E, 741 unsigned Limit) { 742 if (Limit == 0 || I + 1 == E || 743 I[1]->First->isOneOf(tok::kw_case, tok::kw_default)) { 744 return 0; 745 } 746 if (I[0]->Last->is(tok::l_brace) || I[1]->First->is(tok::l_brace)) 747 return 0; 748 unsigned NumStmts = 0; 749 unsigned Length = 0; 750 bool EndsWithComment = false; 751 bool InPPDirective = I[0]->InPPDirective; 752 bool InMacroBody = I[0]->InMacroBody; 753 const unsigned Level = I[0]->Level; 754 for (; NumStmts < 3; ++NumStmts) { 755 if (I + 1 + NumStmts == E) 756 break; 757 const AnnotatedLine *Line = I[1 + NumStmts]; 758 if (Line->InPPDirective != InPPDirective) 759 break; 760 if (Line->InMacroBody != InMacroBody) 761 break; 762 if (Line->First->isOneOf(tok::kw_case, tok::kw_default, tok::r_brace)) 763 break; 764 if (Line->First->isOneOf(tok::kw_if, tok::kw_for, tok::kw_switch, 765 tok::kw_while) || 766 EndsWithComment) { 767 return 0; 768 } 769 if (Line->First->is(tok::comment)) { 770 if (Level != Line->Level) 771 return 0; 772 const auto *J = I + 2 + NumStmts; 773 for (; J != E; ++J) { 774 Line = *J; 775 if (Line->InPPDirective != InPPDirective) 776 break; 777 if (Line->First->isOneOf(tok::kw_case, tok::kw_default, tok::r_brace)) 778 break; 779 if (Line->First->isNot(tok::comment) || Level != Line->Level) 780 return 0; 781 } 782 break; 783 } 784 if (Line->Last->is(tok::comment)) 785 EndsWithComment = true; 786 Length += I[1 + NumStmts]->Last->TotalLength + 1; // 1 for the space. 787 } 788 if (NumStmts == 0 || NumStmts == 3 || Length > Limit) 789 return 0; 790 return NumStmts; 791 } 792 793 unsigned tryMergeSimpleBlock(ArrayRef<AnnotatedLine *>::const_iterator I, 794 ArrayRef<AnnotatedLine *>::const_iterator E, 795 unsigned Limit) { 796 // Don't merge with a preprocessor directive. 797 if (I[1]->Type == LT_PreprocessorDirective) 798 return 0; 799 800 AnnotatedLine &Line = **I; 801 802 // Don't merge ObjC @ keywords and methods. 803 // FIXME: If an option to allow short exception handling clauses on a single 804 // line is added, change this to not return for @try and friends. 805 if (Style.Language != FormatStyle::LK_Java && 806 Line.First->isOneOf(tok::at, tok::minus, tok::plus)) { 807 return 0; 808 } 809 810 // Check that the current line allows merging. This depends on whether we 811 // are in a control flow statements as well as several style flags. 812 if (Line.First->is(tok::kw_case) || 813 (Line.First->Next && Line.First->Next->is(tok::kw_else))) { 814 return 0; 815 } 816 // default: in switch statement 817 if (Line.First->is(tok::kw_default)) { 818 const FormatToken *Tok = Line.First->getNextNonComment(); 819 if (Tok && Tok->is(tok::colon)) 820 return 0; 821 } 822 823 auto IsCtrlStmt = [](const auto &Line) { 824 return Line.First->isOneOf(tok::kw_if, tok::kw_else, tok::kw_while, 825 tok::kw_do, tok::kw_for, TT_ForEachMacro); 826 }; 827 828 const bool IsSplitBlock = 829 Style.AllowShortBlocksOnASingleLine == FormatStyle::SBS_Never || 830 (Style.AllowShortBlocksOnASingleLine == FormatStyle::SBS_Empty && 831 I[1]->First->isNot(tok::r_brace)); 832 833 if (IsCtrlStmt(Line) || 834 Line.First->isOneOf(tok::kw_try, tok::kw___try, tok::kw_catch, 835 tok::kw___finally, tok::r_brace, 836 Keywords.kw___except) || 837 Line.startsWithExportBlock()) { 838 if (IsSplitBlock) 839 return 0; 840 // Don't merge when we can't except the case when 841 // the control statement block is empty 842 if (!Style.AllowShortIfStatementsOnASingleLine && 843 Line.First->isOneOf(tok::kw_if, tok::kw_else) && 844 !Style.BraceWrapping.AfterControlStatement && 845 I[1]->First->isNot(tok::r_brace)) { 846 return 0; 847 } 848 if (!Style.AllowShortIfStatementsOnASingleLine && 849 Line.First->isOneOf(tok::kw_if, tok::kw_else) && 850 Style.BraceWrapping.AfterControlStatement == 851 FormatStyle::BWACS_Always && 852 I + 2 != E && I[2]->First->isNot(tok::r_brace)) { 853 return 0; 854 } 855 if (!Style.AllowShortLoopsOnASingleLine && 856 Line.First->isOneOf(tok::kw_while, tok::kw_do, tok::kw_for, 857 TT_ForEachMacro) && 858 !Style.BraceWrapping.AfterControlStatement && 859 I[1]->First->isNot(tok::r_brace)) { 860 return 0; 861 } 862 if (!Style.AllowShortLoopsOnASingleLine && 863 Line.First->isOneOf(tok::kw_while, tok::kw_do, tok::kw_for, 864 TT_ForEachMacro) && 865 Style.BraceWrapping.AfterControlStatement == 866 FormatStyle::BWACS_Always && 867 I + 2 != E && I[2]->First->isNot(tok::r_brace)) { 868 return 0; 869 } 870 // FIXME: Consider an option to allow short exception handling clauses on 871 // a single line. 872 // FIXME: This isn't covered by tests. 873 // FIXME: For catch, __except, __finally the first token on the line 874 // is '}', so this isn't correct here. 875 if (Line.First->isOneOf(tok::kw_try, tok::kw___try, tok::kw_catch, 876 Keywords.kw___except, tok::kw___finally)) { 877 return 0; 878 } 879 } 880 881 if (Line.endsWith(tok::l_brace)) { 882 if (Style.AllowShortBlocksOnASingleLine == FormatStyle::SBS_Never && 883 Line.First->is(TT_BlockLBrace)) { 884 return 0; 885 } 886 887 if (IsSplitBlock && Line.First == Line.Last && 888 I > AnnotatedLines.begin() && 889 (I[-1]->endsWith(tok::kw_else) || IsCtrlStmt(*I[-1]))) { 890 return 0; 891 } 892 FormatToken *Tok = I[1]->First; 893 auto ShouldMerge = [Tok]() { 894 if (Tok->isNot(tok::r_brace) || Tok->MustBreakBefore) 895 return false; 896 const FormatToken *Next = Tok->getNextNonComment(); 897 return !Next || Next->is(tok::semi); 898 }; 899 900 if (ShouldMerge()) { 901 // We merge empty blocks even if the line exceeds the column limit. 902 Tok->SpacesRequiredBefore = 903 (Style.SpaceInEmptyBlock || Line.Last->is(tok::comment)) ? 1 : 0; 904 Tok->CanBreakBefore = true; 905 return 1; 906 } else if (Limit != 0 && !Line.startsWithNamespace() && 907 !startsExternCBlock(Line)) { 908 // We don't merge short records. 909 if (isRecordLBrace(*Line.Last)) 910 return 0; 911 912 // Check that we still have three lines and they fit into the limit. 913 if (I + 2 == E || I[2]->Type == LT_Invalid) 914 return 0; 915 Limit = limitConsideringMacros(I + 2, E, Limit); 916 917 if (!nextTwoLinesFitInto(I, Limit)) 918 return 0; 919 920 // Second, check that the next line does not contain any braces - if it 921 // does, readability declines when putting it into a single line. 922 if (I[1]->Last->is(TT_LineComment)) 923 return 0; 924 do { 925 if (Tok->is(tok::l_brace) && Tok->isNot(BK_BracedInit)) 926 return 0; 927 Tok = Tok->Next; 928 } while (Tok); 929 930 // Last, check that the third line starts with a closing brace. 931 Tok = I[2]->First; 932 if (Tok->isNot(tok::r_brace)) 933 return 0; 934 935 // Don't merge "if (a) { .. } else {". 936 if (Tok->Next && Tok->Next->is(tok::kw_else)) 937 return 0; 938 939 // Don't merge a trailing multi-line control statement block like: 940 // } else if (foo && 941 // bar) 942 // { <-- current Line 943 // baz(); 944 // } 945 if (Line.First == Line.Last && Line.First->isNot(TT_FunctionLBrace) && 946 Style.BraceWrapping.AfterControlStatement == 947 FormatStyle::BWACS_MultiLine) { 948 return 0; 949 } 950 951 return 2; 952 } 953 } else if (I[1]->First->is(tok::l_brace)) { 954 if (I[1]->Last->is(TT_LineComment)) 955 return 0; 956 957 // Check for Limit <= 2 to account for the " {". 958 if (Limit <= 2 || (Style.ColumnLimit == 0 && containsMustBreak(*I))) 959 return 0; 960 Limit -= 2; 961 unsigned MergedLines = 0; 962 if (Style.AllowShortBlocksOnASingleLine != FormatStyle::SBS_Never || 963 (I[1]->First == I[1]->Last && I + 2 != E && 964 I[2]->First->is(tok::r_brace))) { 965 MergedLines = tryMergeSimpleBlock(I + 1, E, Limit); 966 // If we managed to merge the block, count the statement header, which 967 // is on a separate line. 968 if (MergedLines > 0) 969 ++MergedLines; 970 } 971 return MergedLines; 972 } 973 return 0; 974 } 975 976 /// Returns the modified column limit for \p I if it is inside a macro and 977 /// needs a trailing '\'. 978 unsigned limitConsideringMacros(ArrayRef<AnnotatedLine *>::const_iterator I, 979 ArrayRef<AnnotatedLine *>::const_iterator E, 980 unsigned Limit) { 981 if (I[0]->InPPDirective && I + 1 != E && 982 !I[1]->First->HasUnescapedNewline && I[1]->First->isNot(tok::eof)) { 983 return Limit < 2 ? 0 : Limit - 2; 984 } 985 return Limit; 986 } 987 988 bool nextTwoLinesFitInto(ArrayRef<AnnotatedLine *>::const_iterator I, 989 unsigned Limit) { 990 if (I[1]->First->MustBreakBefore || I[2]->First->MustBreakBefore) 991 return false; 992 return 1 + I[1]->Last->TotalLength + 1 + I[2]->Last->TotalLength <= Limit; 993 } 994 995 bool nextNLinesFitInto(ArrayRef<AnnotatedLine *>::const_iterator I, 996 ArrayRef<AnnotatedLine *>::const_iterator E, 997 unsigned Limit) { 998 unsigned JoinedLength = 0; 999 for (const auto *J = I + 1; J != E; ++J) { 1000 if ((*J)->First->MustBreakBefore) 1001 return false; 1002 1003 JoinedLength += 1 + (*J)->Last->TotalLength; 1004 if (JoinedLength > Limit) 1005 return false; 1006 } 1007 return true; 1008 } 1009 1010 bool containsMustBreak(const AnnotatedLine *Line) { 1011 assert(Line->First); 1012 // Ignore the first token, because in this situation, it applies more to the 1013 // last token of the previous line. 1014 for (const FormatToken *Tok = Line->First->Next; Tok; Tok = Tok->Next) 1015 if (Tok->MustBreakBefore) 1016 return true; 1017 return false; 1018 } 1019 1020 void join(AnnotatedLine &A, const AnnotatedLine &B) { 1021 assert(!A.Last->Next); 1022 assert(!B.First->Previous); 1023 if (B.Affected) 1024 A.Affected = true; 1025 A.Last->Next = B.First; 1026 B.First->Previous = A.Last; 1027 B.First->CanBreakBefore = true; 1028 unsigned LengthA = A.Last->TotalLength + B.First->SpacesRequiredBefore; 1029 for (FormatToken *Tok = B.First; Tok; Tok = Tok->Next) { 1030 Tok->TotalLength += LengthA; 1031 A.Last = Tok; 1032 } 1033 } 1034 1035 const FormatStyle &Style; 1036 const AdditionalKeywords &Keywords; 1037 const ArrayRef<AnnotatedLine *>::const_iterator End; 1038 1039 ArrayRef<AnnotatedLine *>::const_iterator Next; 1040 const SmallVectorImpl<AnnotatedLine *> &AnnotatedLines; 1041 }; 1042 1043 static void markFinalized(FormatToken *Tok) { 1044 if (Tok->is(tok::hash) && !Tok->Previous && Tok->Next && 1045 Tok->Next->isOneOf(tok::pp_if, tok::pp_ifdef, tok::pp_ifndef, 1046 tok::pp_elif, tok::pp_elifdef, tok::pp_elifndef, 1047 tok::pp_else, tok::pp_endif)) { 1048 Tok = Tok->Next; 1049 } 1050 for (; Tok; Tok = Tok->Next) { 1051 if (Tok->MacroCtx && Tok->MacroCtx->Role == MR_ExpandedArg) { 1052 // In the first pass we format all macro arguments in the expanded token 1053 // stream. Instead of finalizing the macro arguments, we mark that they 1054 // will be modified as unexpanded arguments (as part of the macro call 1055 // formatting) in the next pass. 1056 Tok->MacroCtx->Role = MR_UnexpandedArg; 1057 // Reset whether spaces or a line break are required before this token, as 1058 // that is context dependent, and that context may change when formatting 1059 // the macro call. For example, given M(x) -> 2 * x, and the macro call 1060 // M(var), the token 'var' will have SpacesRequiredBefore = 1 after being 1061 // formatted as part of the expanded macro, but SpacesRequiredBefore = 0 1062 // for its position within the macro call. 1063 Tok->SpacesRequiredBefore = 0; 1064 if (!Tok->MustBreakBeforeFinalized) 1065 Tok->MustBreakBefore = 0; 1066 } else { 1067 Tok->Finalized = true; 1068 } 1069 } 1070 } 1071 1072 #ifndef NDEBUG 1073 static void printLineState(const LineState &State) { 1074 llvm::dbgs() << "State: "; 1075 for (const ParenState &P : State.Stack) { 1076 llvm::dbgs() << (P.Tok ? P.Tok->TokenText : "F") << "|" << P.Indent << "|" 1077 << P.LastSpace << "|" << P.NestedBlockIndent << " "; 1078 } 1079 llvm::dbgs() << State.NextToken->TokenText << "\n"; 1080 } 1081 #endif 1082 1083 /// Base class for classes that format one \c AnnotatedLine. 1084 class LineFormatter { 1085 public: 1086 LineFormatter(ContinuationIndenter *Indenter, WhitespaceManager *Whitespaces, 1087 const FormatStyle &Style, 1088 UnwrappedLineFormatter *BlockFormatter) 1089 : Indenter(Indenter), Whitespaces(Whitespaces), Style(Style), 1090 BlockFormatter(BlockFormatter) {} 1091 virtual ~LineFormatter() {} 1092 1093 /// Formats an \c AnnotatedLine and returns the penalty. 1094 /// 1095 /// If \p DryRun is \c false, directly applies the changes. 1096 virtual unsigned formatLine(const AnnotatedLine &Line, unsigned FirstIndent, 1097 unsigned FirstStartColumn, bool DryRun) = 0; 1098 1099 protected: 1100 /// If the \p State's next token is an r_brace closing a nested block, 1101 /// format the nested block before it. 1102 /// 1103 /// Returns \c true if all children could be placed successfully and adapts 1104 /// \p Penalty as well as \p State. If \p DryRun is false, also directly 1105 /// creates changes using \c Whitespaces. 1106 /// 1107 /// The crucial idea here is that children always get formatted upon 1108 /// encountering the closing brace right after the nested block. Now, if we 1109 /// are currently trying to keep the "}" on the same line (i.e. \p NewLine is 1110 /// \c false), the entire block has to be kept on the same line (which is only 1111 /// possible if it fits on the line, only contains a single statement, etc. 1112 /// 1113 /// If \p NewLine is true, we format the nested block on separate lines, i.e. 1114 /// break after the "{", format all lines with correct indentation and the put 1115 /// the closing "}" on yet another new line. 1116 /// 1117 /// This enables us to keep the simple structure of the 1118 /// \c UnwrappedLineFormatter, where we only have two options for each token: 1119 /// break or don't break. 1120 bool formatChildren(LineState &State, bool NewLine, bool DryRun, 1121 unsigned &Penalty) { 1122 const FormatToken *LBrace = State.NextToken->getPreviousNonComment(); 1123 bool HasLBrace = LBrace && LBrace->is(tok::l_brace) && LBrace->is(BK_Block); 1124 FormatToken &Previous = *State.NextToken->Previous; 1125 if (Previous.Children.size() == 0 || (!HasLBrace && !LBrace->MacroParent)) { 1126 // The previous token does not open a block. Nothing to do. We don't 1127 // assert so that we can simply call this function for all tokens. 1128 return true; 1129 } 1130 1131 if (NewLine || Previous.MacroParent) { 1132 const ParenState &P = State.Stack.back(); 1133 1134 int AdditionalIndent = 1135 P.Indent - Previous.Children[0]->Level * Style.IndentWidth; 1136 Penalty += 1137 BlockFormatter->format(Previous.Children, DryRun, AdditionalIndent, 1138 /*FixBadIndentation=*/true); 1139 return true; 1140 } 1141 1142 if (Previous.Children[0]->First->MustBreakBefore) 1143 return false; 1144 1145 // Cannot merge into one line if this line ends on a comment. 1146 if (Previous.is(tok::comment)) 1147 return false; 1148 1149 // Cannot merge multiple statements into a single line. 1150 if (Previous.Children.size() > 1) 1151 return false; 1152 1153 const AnnotatedLine *Child = Previous.Children[0]; 1154 // We can't put the closing "}" on a line with a trailing comment. 1155 if (Child->Last->isTrailingComment()) 1156 return false; 1157 1158 // If the child line exceeds the column limit, we wouldn't want to merge it. 1159 // We add +2 for the trailing " }". 1160 if (Style.ColumnLimit > 0 && 1161 Child->Last->TotalLength + State.Column + 2 > Style.ColumnLimit) { 1162 return false; 1163 } 1164 1165 if (!DryRun) { 1166 Whitespaces->replaceWhitespace( 1167 *Child->First, /*Newlines=*/0, /*Spaces=*/1, 1168 /*StartOfTokenColumn=*/State.Column, /*IsAligned=*/false, 1169 State.Line->InPPDirective); 1170 } 1171 Penalty += 1172 formatLine(*Child, State.Column + 1, /*FirstStartColumn=*/0, DryRun); 1173 if (!DryRun) 1174 markFinalized(Child->First); 1175 1176 State.Column += 1 + Child->Last->TotalLength; 1177 return true; 1178 } 1179 1180 ContinuationIndenter *Indenter; 1181 1182 private: 1183 WhitespaceManager *Whitespaces; 1184 const FormatStyle &Style; 1185 UnwrappedLineFormatter *BlockFormatter; 1186 }; 1187 1188 /// Formatter that keeps the existing line breaks. 1189 class NoColumnLimitLineFormatter : public LineFormatter { 1190 public: 1191 NoColumnLimitLineFormatter(ContinuationIndenter *Indenter, 1192 WhitespaceManager *Whitespaces, 1193 const FormatStyle &Style, 1194 UnwrappedLineFormatter *BlockFormatter) 1195 : LineFormatter(Indenter, Whitespaces, Style, BlockFormatter) {} 1196 1197 /// Formats the line, simply keeping all of the input's line breaking 1198 /// decisions. 1199 unsigned formatLine(const AnnotatedLine &Line, unsigned FirstIndent, 1200 unsigned FirstStartColumn, bool DryRun) override { 1201 assert(!DryRun); 1202 LineState State = Indenter->getInitialState(FirstIndent, FirstStartColumn, 1203 &Line, /*DryRun=*/false); 1204 while (State.NextToken) { 1205 bool Newline = 1206 Indenter->mustBreak(State) || 1207 (Indenter->canBreak(State) && State.NextToken->NewlinesBefore > 0); 1208 unsigned Penalty = 0; 1209 formatChildren(State, Newline, /*DryRun=*/false, Penalty); 1210 Indenter->addTokenToState(State, Newline, /*DryRun=*/false); 1211 } 1212 return 0; 1213 } 1214 }; 1215 1216 /// Formatter that puts all tokens into a single line without breaks. 1217 class NoLineBreakFormatter : public LineFormatter { 1218 public: 1219 NoLineBreakFormatter(ContinuationIndenter *Indenter, 1220 WhitespaceManager *Whitespaces, const FormatStyle &Style, 1221 UnwrappedLineFormatter *BlockFormatter) 1222 : LineFormatter(Indenter, Whitespaces, Style, BlockFormatter) {} 1223 1224 /// Puts all tokens into a single line. 1225 unsigned formatLine(const AnnotatedLine &Line, unsigned FirstIndent, 1226 unsigned FirstStartColumn, bool DryRun) override { 1227 unsigned Penalty = 0; 1228 LineState State = 1229 Indenter->getInitialState(FirstIndent, FirstStartColumn, &Line, DryRun); 1230 while (State.NextToken) { 1231 formatChildren(State, /*NewLine=*/false, DryRun, Penalty); 1232 Indenter->addTokenToState( 1233 State, /*Newline=*/State.NextToken->MustBreakBefore, DryRun); 1234 } 1235 return Penalty; 1236 } 1237 }; 1238 1239 /// Finds the best way to break lines. 1240 class OptimizingLineFormatter : public LineFormatter { 1241 public: 1242 OptimizingLineFormatter(ContinuationIndenter *Indenter, 1243 WhitespaceManager *Whitespaces, 1244 const FormatStyle &Style, 1245 UnwrappedLineFormatter *BlockFormatter) 1246 : LineFormatter(Indenter, Whitespaces, Style, BlockFormatter) {} 1247 1248 /// Formats the line by finding the best line breaks with line lengths 1249 /// below the column limit. 1250 unsigned formatLine(const AnnotatedLine &Line, unsigned FirstIndent, 1251 unsigned FirstStartColumn, bool DryRun) override { 1252 LineState State = 1253 Indenter->getInitialState(FirstIndent, FirstStartColumn, &Line, DryRun); 1254 1255 // If the ObjC method declaration does not fit on a line, we should format 1256 // it with one arg per line. 1257 if (State.Line->Type == LT_ObjCMethodDecl) 1258 State.Stack.back().BreakBeforeParameter = true; 1259 1260 // Find best solution in solution space. 1261 return analyzeSolutionSpace(State, DryRun); 1262 } 1263 1264 private: 1265 struct CompareLineStatePointers { 1266 bool operator()(LineState *obj1, LineState *obj2) const { 1267 return *obj1 < *obj2; 1268 } 1269 }; 1270 1271 /// A pair of <penalty, count> that is used to prioritize the BFS on. 1272 /// 1273 /// In case of equal penalties, we want to prefer states that were inserted 1274 /// first. During state generation we make sure that we insert states first 1275 /// that break the line as late as possible. 1276 typedef std::pair<unsigned, unsigned> OrderedPenalty; 1277 1278 /// An edge in the solution space from \c Previous->State to \c State, 1279 /// inserting a newline dependent on the \c NewLine. 1280 struct StateNode { 1281 StateNode(const LineState &State, bool NewLine, StateNode *Previous) 1282 : State(State), NewLine(NewLine), Previous(Previous) {} 1283 LineState State; 1284 bool NewLine; 1285 StateNode *Previous; 1286 }; 1287 1288 /// An item in the prioritized BFS search queue. The \c StateNode's 1289 /// \c State has the given \c OrderedPenalty. 1290 typedef std::pair<OrderedPenalty, StateNode *> QueueItem; 1291 1292 /// The BFS queue type. 1293 typedef std::priority_queue<QueueItem, SmallVector<QueueItem>, 1294 std::greater<QueueItem>> 1295 QueueType; 1296 1297 /// Analyze the entire solution space starting from \p InitialState. 1298 /// 1299 /// This implements a variant of Dijkstra's algorithm on the graph that spans 1300 /// the solution space (\c LineStates are the nodes). The algorithm tries to 1301 /// find the shortest path (the one with lowest penalty) from \p InitialState 1302 /// to a state where all tokens are placed. Returns the penalty. 1303 /// 1304 /// If \p DryRun is \c false, directly applies the changes. 1305 unsigned analyzeSolutionSpace(LineState &InitialState, bool DryRun) { 1306 std::set<LineState *, CompareLineStatePointers> Seen; 1307 1308 // Increasing count of \c StateNode items we have created. This is used to 1309 // create a deterministic order independent of the container. 1310 unsigned Count = 0; 1311 QueueType Queue; 1312 1313 // Insert start element into queue. 1314 StateNode *RootNode = 1315 new (Allocator.Allocate()) StateNode(InitialState, false, nullptr); 1316 Queue.push(QueueItem(OrderedPenalty(0, Count), RootNode)); 1317 ++Count; 1318 1319 unsigned Penalty = 0; 1320 1321 // While not empty, take first element and follow edges. 1322 while (!Queue.empty()) { 1323 // Quit if we still haven't found a solution by now. 1324 if (Count > 25'000'000) 1325 return 0; 1326 1327 Penalty = Queue.top().first.first; 1328 StateNode *Node = Queue.top().second; 1329 if (!Node->State.NextToken) { 1330 LLVM_DEBUG(llvm::dbgs() 1331 << "\n---\nPenalty for line: " << Penalty << "\n"); 1332 break; 1333 } 1334 Queue.pop(); 1335 1336 // Cut off the analysis of certain solutions if the analysis gets too 1337 // complex. See description of IgnoreStackForComparison. 1338 if (Count > 50'000) 1339 Node->State.IgnoreStackForComparison = true; 1340 1341 if (!Seen.insert(&Node->State).second) { 1342 // State already examined with lower penalty. 1343 continue; 1344 } 1345 1346 FormatDecision LastFormat = Node->State.NextToken->getDecision(); 1347 if (LastFormat == FD_Unformatted || LastFormat == FD_Continue) 1348 addNextStateToQueue(Penalty, Node, /*NewLine=*/false, &Count, &Queue); 1349 if (LastFormat == FD_Unformatted || LastFormat == FD_Break) 1350 addNextStateToQueue(Penalty, Node, /*NewLine=*/true, &Count, &Queue); 1351 } 1352 1353 if (Queue.empty()) { 1354 // We were unable to find a solution, do nothing. 1355 // FIXME: Add diagnostic? 1356 LLVM_DEBUG(llvm::dbgs() << "Could not find a solution.\n"); 1357 return 0; 1358 } 1359 1360 // Reconstruct the solution. 1361 if (!DryRun) 1362 reconstructPath(InitialState, Queue.top().second); 1363 1364 LLVM_DEBUG(llvm::dbgs() 1365 << "Total number of analyzed states: " << Count << "\n"); 1366 LLVM_DEBUG(llvm::dbgs() << "---\n"); 1367 1368 return Penalty; 1369 } 1370 1371 /// Add the following state to the analysis queue \c Queue. 1372 /// 1373 /// Assume the current state is \p PreviousNode and has been reached with a 1374 /// penalty of \p Penalty. Insert a line break if \p NewLine is \c true. 1375 void addNextStateToQueue(unsigned Penalty, StateNode *PreviousNode, 1376 bool NewLine, unsigned *Count, QueueType *Queue) { 1377 if (NewLine && !Indenter->canBreak(PreviousNode->State)) 1378 return; 1379 if (!NewLine && Indenter->mustBreak(PreviousNode->State)) 1380 return; 1381 1382 StateNode *Node = new (Allocator.Allocate()) 1383 StateNode(PreviousNode->State, NewLine, PreviousNode); 1384 if (!formatChildren(Node->State, NewLine, /*DryRun=*/true, Penalty)) 1385 return; 1386 1387 Penalty += Indenter->addTokenToState(Node->State, NewLine, true); 1388 1389 Queue->push(QueueItem(OrderedPenalty(Penalty, *Count), Node)); 1390 ++(*Count); 1391 } 1392 1393 /// Applies the best formatting by reconstructing the path in the 1394 /// solution space that leads to \c Best. 1395 void reconstructPath(LineState &State, StateNode *Best) { 1396 llvm::SmallVector<StateNode *> Path; 1397 // We do not need a break before the initial token. 1398 while (Best->Previous) { 1399 Path.push_back(Best); 1400 Best = Best->Previous; 1401 } 1402 for (const auto &Node : llvm::reverse(Path)) { 1403 unsigned Penalty = 0; 1404 formatChildren(State, Node->NewLine, /*DryRun=*/false, Penalty); 1405 Penalty += Indenter->addTokenToState(State, Node->NewLine, false); 1406 1407 LLVM_DEBUG({ 1408 printLineState(Node->Previous->State); 1409 if (Node->NewLine) { 1410 llvm::dbgs() << "Penalty for placing " 1411 << Node->Previous->State.NextToken->Tok.getName() 1412 << " on a new line: " << Penalty << "\n"; 1413 } 1414 }); 1415 } 1416 } 1417 1418 llvm::SpecificBumpPtrAllocator<StateNode> Allocator; 1419 }; 1420 1421 } // anonymous namespace 1422 1423 unsigned UnwrappedLineFormatter::format( 1424 const SmallVectorImpl<AnnotatedLine *> &Lines, bool DryRun, 1425 int AdditionalIndent, bool FixBadIndentation, unsigned FirstStartColumn, 1426 unsigned NextStartColumn, unsigned LastStartColumn) { 1427 LineJoiner Joiner(Style, Keywords, Lines); 1428 1429 // Try to look up already computed penalty in DryRun-mode. 1430 std::pair<const SmallVectorImpl<AnnotatedLine *> *, unsigned> CacheKey( 1431 &Lines, AdditionalIndent); 1432 auto CacheIt = PenaltyCache.find(CacheKey); 1433 if (DryRun && CacheIt != PenaltyCache.end()) 1434 return CacheIt->second; 1435 1436 assert(!Lines.empty()); 1437 unsigned Penalty = 0; 1438 LevelIndentTracker IndentTracker(Style, Keywords, Lines[0]->Level, 1439 AdditionalIndent); 1440 const AnnotatedLine *PrevPrevLine = nullptr; 1441 const AnnotatedLine *PreviousLine = nullptr; 1442 const AnnotatedLine *NextLine = nullptr; 1443 1444 // The minimum level of consecutive lines that have been formatted. 1445 unsigned RangeMinLevel = UINT_MAX; 1446 1447 bool FirstLine = true; 1448 for (const AnnotatedLine *Line = 1449 Joiner.getNextMergedLine(DryRun, IndentTracker); 1450 Line; PrevPrevLine = PreviousLine, PreviousLine = Line, Line = NextLine, 1451 FirstLine = false) { 1452 assert(Line->First); 1453 const AnnotatedLine &TheLine = *Line; 1454 unsigned Indent = IndentTracker.getIndent(); 1455 1456 // We continue formatting unchanged lines to adjust their indent, e.g. if a 1457 // scope was added. However, we need to carefully stop doing this when we 1458 // exit the scope of affected lines to prevent indenting the entire 1459 // remaining file if it currently missing a closing brace. 1460 bool PreviousRBrace = 1461 PreviousLine && PreviousLine->startsWith(tok::r_brace); 1462 bool ContinueFormatting = 1463 TheLine.Level > RangeMinLevel || 1464 (TheLine.Level == RangeMinLevel && !PreviousRBrace && 1465 !TheLine.startsWith(TT_NamespaceRBrace)); 1466 1467 bool FixIndentation = (FixBadIndentation || ContinueFormatting) && 1468 Indent != TheLine.First->OriginalColumn; 1469 bool ShouldFormat = TheLine.Affected || FixIndentation; 1470 // We cannot format this line; if the reason is that the line had a 1471 // parsing error, remember that. 1472 if (ShouldFormat && TheLine.Type == LT_Invalid && Status) { 1473 Status->FormatComplete = false; 1474 Status->Line = 1475 SourceMgr.getSpellingLineNumber(TheLine.First->Tok.getLocation()); 1476 } 1477 1478 if (ShouldFormat && TheLine.Type != LT_Invalid) { 1479 if (!DryRun) { 1480 bool LastLine = TheLine.First->is(tok::eof); 1481 formatFirstToken(TheLine, PreviousLine, PrevPrevLine, Lines, Indent, 1482 LastLine ? LastStartColumn : NextStartColumn + Indent); 1483 } 1484 1485 NextLine = Joiner.getNextMergedLine(DryRun, IndentTracker); 1486 unsigned ColumnLimit = getColumnLimit(TheLine.InPPDirective, NextLine); 1487 bool FitsIntoOneLine = 1488 !TheLine.ContainsMacroCall && 1489 (TheLine.Last->TotalLength + Indent <= ColumnLimit || 1490 (TheLine.Type == LT_ImportStatement && 1491 (!Style.isJavaScript() || !Style.JavaScriptWrapImports)) || 1492 (Style.isCSharp() && 1493 TheLine.InPPDirective)); // don't split #regions in C# 1494 if (Style.ColumnLimit == 0) { 1495 NoColumnLimitLineFormatter(Indenter, Whitespaces, Style, this) 1496 .formatLine(TheLine, NextStartColumn + Indent, 1497 FirstLine ? FirstStartColumn : 0, DryRun); 1498 } else if (FitsIntoOneLine) { 1499 Penalty += NoLineBreakFormatter(Indenter, Whitespaces, Style, this) 1500 .formatLine(TheLine, NextStartColumn + Indent, 1501 FirstLine ? FirstStartColumn : 0, DryRun); 1502 } else { 1503 Penalty += OptimizingLineFormatter(Indenter, Whitespaces, Style, this) 1504 .formatLine(TheLine, NextStartColumn + Indent, 1505 FirstLine ? FirstStartColumn : 0, DryRun); 1506 } 1507 RangeMinLevel = std::min(RangeMinLevel, TheLine.Level); 1508 } else { 1509 // If no token in the current line is affected, we still need to format 1510 // affected children. 1511 if (TheLine.ChildrenAffected) { 1512 for (const FormatToken *Tok = TheLine.First; Tok; Tok = Tok->Next) 1513 if (!Tok->Children.empty()) 1514 format(Tok->Children, DryRun); 1515 } 1516 1517 // Adapt following lines on the current indent level to the same level 1518 // unless the current \c AnnotatedLine is not at the beginning of a line. 1519 bool StartsNewLine = 1520 TheLine.First->NewlinesBefore > 0 || TheLine.First->IsFirst; 1521 if (StartsNewLine) 1522 IndentTracker.adjustToUnmodifiedLine(TheLine); 1523 if (!DryRun) { 1524 bool ReformatLeadingWhitespace = 1525 StartsNewLine && ((PreviousLine && PreviousLine->Affected) || 1526 TheLine.LeadingEmptyLinesAffected); 1527 // Format the first token. 1528 if (ReformatLeadingWhitespace) { 1529 formatFirstToken(TheLine, PreviousLine, PrevPrevLine, Lines, 1530 TheLine.First->OriginalColumn, 1531 TheLine.First->OriginalColumn); 1532 } else { 1533 Whitespaces->addUntouchableToken(*TheLine.First, 1534 TheLine.InPPDirective); 1535 } 1536 1537 // Notify the WhitespaceManager about the unchanged whitespace. 1538 for (FormatToken *Tok = TheLine.First->Next; Tok; Tok = Tok->Next) 1539 Whitespaces->addUntouchableToken(*Tok, TheLine.InPPDirective); 1540 } 1541 NextLine = Joiner.getNextMergedLine(DryRun, IndentTracker); 1542 RangeMinLevel = UINT_MAX; 1543 } 1544 if (!DryRun) 1545 markFinalized(TheLine.First); 1546 } 1547 PenaltyCache[CacheKey] = Penalty; 1548 return Penalty; 1549 } 1550 1551 static auto computeNewlines(const AnnotatedLine &Line, 1552 const AnnotatedLine *PreviousLine, 1553 const AnnotatedLine *PrevPrevLine, 1554 const SmallVectorImpl<AnnotatedLine *> &Lines, 1555 const FormatStyle &Style) { 1556 const auto &RootToken = *Line.First; 1557 auto Newlines = 1558 std::min(RootToken.NewlinesBefore, Style.MaxEmptyLinesToKeep + 1); 1559 // Remove empty lines before "}" where applicable. 1560 if (RootToken.is(tok::r_brace) && 1561 (!RootToken.Next || 1562 (RootToken.Next->is(tok::semi) && !RootToken.Next->Next)) && 1563 // Do not remove empty lines before namespace closing "}". 1564 !getNamespaceToken(&Line, Lines)) { 1565 Newlines = std::min(Newlines, 1u); 1566 } 1567 // Remove empty lines at the start of nested blocks (lambdas/arrow functions) 1568 if (!PreviousLine && Line.Level > 0) 1569 Newlines = std::min(Newlines, 1u); 1570 if (Newlines == 0 && !RootToken.IsFirst) 1571 Newlines = 1; 1572 if (RootToken.IsFirst && 1573 (!Style.KeepEmptyLines.AtStartOfFile || !RootToken.HasUnescapedNewline)) { 1574 Newlines = 0; 1575 } 1576 1577 // Remove empty lines after "{". 1578 if (!Style.KeepEmptyLines.AtStartOfBlock && PreviousLine && 1579 PreviousLine->Last->is(tok::l_brace) && 1580 !PreviousLine->startsWithNamespace() && 1581 !(PrevPrevLine && PrevPrevLine->startsWithNamespace() && 1582 PreviousLine->startsWith(tok::l_brace)) && 1583 !startsExternCBlock(*PreviousLine)) { 1584 Newlines = 1; 1585 } 1586 1587 if (Style.WrapNamespaceBodyWithEmptyLines != FormatStyle::WNBWELS_Leave) { 1588 // Modify empty lines after TT_NamespaceLBrace. 1589 if (PreviousLine && PreviousLine->endsWith(TT_NamespaceLBrace)) { 1590 if (Style.WrapNamespaceBodyWithEmptyLines == FormatStyle::WNBWELS_Never) 1591 Newlines = 1; 1592 else if (!Line.startsWithNamespace()) 1593 Newlines = std::max(Newlines, 2u); 1594 } 1595 // Modify empty lines before TT_NamespaceRBrace. 1596 if (Line.startsWith(TT_NamespaceRBrace)) { 1597 if (Style.WrapNamespaceBodyWithEmptyLines == FormatStyle::WNBWELS_Never) 1598 Newlines = 1; 1599 else if (!PreviousLine->startsWith(TT_NamespaceRBrace)) 1600 Newlines = std::max(Newlines, 2u); 1601 } 1602 } 1603 1604 // Insert or remove empty line before access specifiers. 1605 if (PreviousLine && RootToken.isAccessSpecifier()) { 1606 switch (Style.EmptyLineBeforeAccessModifier) { 1607 case FormatStyle::ELBAMS_Never: 1608 if (Newlines > 1) 1609 Newlines = 1; 1610 break; 1611 case FormatStyle::ELBAMS_Leave: 1612 Newlines = std::max(RootToken.NewlinesBefore, 1u); 1613 break; 1614 case FormatStyle::ELBAMS_LogicalBlock: 1615 if (PreviousLine->Last->isOneOf(tok::semi, tok::r_brace) && Newlines <= 1) 1616 Newlines = 2; 1617 if (PreviousLine->First->isAccessSpecifier()) 1618 Newlines = 1; // Previous is an access modifier remove all new lines. 1619 break; 1620 case FormatStyle::ELBAMS_Always: { 1621 const FormatToken *previousToken; 1622 if (PreviousLine->Last->is(tok::comment)) 1623 previousToken = PreviousLine->Last->getPreviousNonComment(); 1624 else 1625 previousToken = PreviousLine->Last; 1626 if ((!previousToken || previousToken->isNot(tok::l_brace)) && 1627 Newlines <= 1) { 1628 Newlines = 2; 1629 } 1630 } break; 1631 } 1632 } 1633 1634 // Insert or remove empty line after access specifiers. 1635 if (PreviousLine && PreviousLine->First->isAccessSpecifier() && 1636 (!PreviousLine->InPPDirective || !RootToken.HasUnescapedNewline)) { 1637 // EmptyLineBeforeAccessModifier is handling the case when two access 1638 // modifiers follow each other. 1639 if (!RootToken.isAccessSpecifier()) { 1640 switch (Style.EmptyLineAfterAccessModifier) { 1641 case FormatStyle::ELAAMS_Never: 1642 Newlines = 1; 1643 break; 1644 case FormatStyle::ELAAMS_Leave: 1645 Newlines = std::max(Newlines, 1u); 1646 break; 1647 case FormatStyle::ELAAMS_Always: 1648 if (RootToken.is(tok::r_brace)) // Do not add at end of class. 1649 Newlines = 1u; 1650 else 1651 Newlines = std::max(Newlines, 2u); 1652 break; 1653 } 1654 } 1655 } 1656 1657 return Newlines; 1658 } 1659 1660 void UnwrappedLineFormatter::formatFirstToken( 1661 const AnnotatedLine &Line, const AnnotatedLine *PreviousLine, 1662 const AnnotatedLine *PrevPrevLine, 1663 const SmallVectorImpl<AnnotatedLine *> &Lines, unsigned Indent, 1664 unsigned NewlineIndent) { 1665 FormatToken &RootToken = *Line.First; 1666 if (RootToken.is(tok::eof)) { 1667 unsigned Newlines = std::min( 1668 RootToken.NewlinesBefore, 1669 Style.KeepEmptyLines.AtEndOfFile ? Style.MaxEmptyLinesToKeep + 1 : 1); 1670 unsigned TokenIndent = Newlines ? NewlineIndent : 0; 1671 Whitespaces->replaceWhitespace(RootToken, Newlines, TokenIndent, 1672 TokenIndent); 1673 return; 1674 } 1675 1676 if (RootToken.Newlines < 0) { 1677 RootToken.Newlines = 1678 computeNewlines(Line, PreviousLine, PrevPrevLine, Lines, Style); 1679 assert(RootToken.Newlines >= 0); 1680 } 1681 1682 if (RootToken.Newlines > 0) 1683 Indent = NewlineIndent; 1684 1685 // Preprocessor directives get indented before the hash only if specified. In 1686 // Javascript import statements are indented like normal statements. 1687 if (!Style.isJavaScript() && 1688 Style.IndentPPDirectives != FormatStyle::PPDIS_BeforeHash && 1689 (Line.Type == LT_PreprocessorDirective || 1690 Line.Type == LT_ImportStatement)) { 1691 Indent = 0; 1692 } 1693 1694 Whitespaces->replaceWhitespace(RootToken, RootToken.Newlines, Indent, Indent, 1695 /*IsAligned=*/false, 1696 Line.InPPDirective && 1697 !RootToken.HasUnescapedNewline); 1698 } 1699 1700 unsigned 1701 UnwrappedLineFormatter::getColumnLimit(bool InPPDirective, 1702 const AnnotatedLine *NextLine) const { 1703 // In preprocessor directives reserve two chars for trailing " \" if the 1704 // next line continues the preprocessor directive. 1705 bool ContinuesPPDirective = 1706 InPPDirective && 1707 // If there is no next line, this is likely a child line and the parent 1708 // continues the preprocessor directive. 1709 (!NextLine || 1710 (NextLine->InPPDirective && 1711 // If there is an unescaped newline between this line and the next, the 1712 // next line starts a new preprocessor directive. 1713 !NextLine->First->HasUnescapedNewline)); 1714 return Style.ColumnLimit - (ContinuesPPDirective ? 2 : 0); 1715 } 1716 1717 } // namespace format 1718 } // namespace clang 1719