UnwrappedLineParser.cpp revision 3f4535e44965f46cf603146141d2d27a1cef1f7f
1//===--- UnwrappedLineParser.cpp - Format C++ code ------------------------===// 2// 3// The LLVM Compiler Infrastructure 4// 5// This file is distributed under the University of Illinois Open Source 6// License. See LICENSE.TXT for details. 7// 8//===----------------------------------------------------------------------===// 9/// 10/// \file 11/// \brief This file contains the implementation of the UnwrappedLineParser, 12/// which turns a stream of tokens into UnwrappedLines. 13/// 14//===----------------------------------------------------------------------===// 15 16#define DEBUG_TYPE "format-parser" 17 18#include "UnwrappedLineParser.h" 19#include "clang/Basic/Diagnostic.h" 20#include "llvm/Support/Debug.h" 21 22namespace clang { 23namespace format { 24 25class ScopedDeclarationState { 26public: 27 ScopedDeclarationState(UnwrappedLine &Line, std::vector<bool> &Stack, 28 bool MustBeDeclaration) 29 : Line(Line), Stack(Stack) { 30 Line.MustBeDeclaration = MustBeDeclaration; 31 Stack.push_back(MustBeDeclaration); 32 } 33 ~ScopedDeclarationState() { 34 Stack.pop_back(); 35 if (!Stack.empty()) 36 Line.MustBeDeclaration = Stack.back(); 37 else 38 Line.MustBeDeclaration = true; 39 } 40private: 41 UnwrappedLine &Line; 42 std::vector<bool> &Stack; 43}; 44 45class ScopedMacroState : public FormatTokenSource { 46public: 47 ScopedMacroState(UnwrappedLine &Line, FormatTokenSource *&TokenSource, 48 FormatToken &ResetToken) 49 : Line(Line), TokenSource(TokenSource), ResetToken(ResetToken), 50 PreviousLineLevel(Line.Level), PreviousTokenSource(TokenSource) { 51 TokenSource = this; 52 Line.Level = 0; 53 Line.InPPDirective = true; 54 } 55 56 ~ScopedMacroState() { 57 TokenSource = PreviousTokenSource; 58 ResetToken = Token; 59 Line.InPPDirective = false; 60 Line.Level = PreviousLineLevel; 61 } 62 63 virtual FormatToken getNextToken() { 64 // The \c UnwrappedLineParser guards against this by never calling 65 // \c getNextToken() after it has encountered the first eof token. 66 assert(!eof()); 67 Token = PreviousTokenSource->getNextToken(); 68 if (eof()) 69 return createEOF(); 70 return Token; 71 } 72 73private: 74 bool eof() { 75 return Token.NewlinesBefore > 0 && Token.HasUnescapedNewline; 76 } 77 78 FormatToken createEOF() { 79 FormatToken FormatTok; 80 FormatTok.Tok.startToken(); 81 FormatTok.Tok.setKind(tok::eof); 82 return FormatTok; 83 } 84 85 UnwrappedLine &Line; 86 FormatTokenSource *&TokenSource; 87 FormatToken &ResetToken; 88 unsigned PreviousLineLevel; 89 FormatTokenSource *PreviousTokenSource; 90 91 FormatToken Token; 92}; 93 94class ScopedLineState { 95public: 96 ScopedLineState(UnwrappedLineParser &Parser, 97 bool SwitchToPreprocessorLines = false) 98 : Parser(Parser), SwitchToPreprocessorLines(SwitchToPreprocessorLines) { 99 if (SwitchToPreprocessorLines) 100 Parser.CurrentLines = &Parser.PreprocessorDirectives; 101 PreBlockLine = Parser.Line.take(); 102 Parser.Line.reset(new UnwrappedLine()); 103 Parser.Line->Level = PreBlockLine->Level; 104 Parser.Line->InPPDirective = PreBlockLine->InPPDirective; 105 } 106 107 ~ScopedLineState() { 108 if (!Parser.Line->Tokens.empty()) { 109 Parser.addUnwrappedLine(); 110 } 111 assert(Parser.Line->Tokens.empty()); 112 Parser.Line.reset(PreBlockLine); 113 Parser.MustBreakBeforeNextToken = true; 114 if (SwitchToPreprocessorLines) 115 Parser.CurrentLines = &Parser.Lines; 116 } 117 118private: 119 UnwrappedLineParser &Parser; 120 const bool SwitchToPreprocessorLines; 121 122 UnwrappedLine *PreBlockLine; 123}; 124 125UnwrappedLineParser::UnwrappedLineParser( 126 clang::DiagnosticsEngine &Diag, const FormatStyle &Style, 127 FormatTokenSource &Tokens, UnwrappedLineConsumer &Callback) 128 : Line(new UnwrappedLine), MustBreakBeforeNextToken(false), 129 CurrentLines(&Lines), Diag(Diag), Style(Style), Tokens(&Tokens), 130 Callback(Callback) {} 131 132bool UnwrappedLineParser::parse() { 133 DEBUG(llvm::dbgs() << "----\n"); 134 readToken(); 135 bool Error = parseFile(); 136 for (std::vector<UnwrappedLine>::iterator I = Lines.begin(), 137 E = Lines.end(); 138 I != E; ++I) { 139 Callback.consumeUnwrappedLine(*I); 140 } 141 return Error; 142} 143 144bool UnwrappedLineParser::parseFile() { 145 ScopedDeclarationState DeclarationState(*Line, DeclarationScopeStack, 146 /*MustBeDeclaration=*/ true); 147 bool Error = parseLevel(/*HasOpeningBrace=*/false); 148 // Make sure to format the remaining tokens. 149 flushComments(true); 150 addUnwrappedLine(); 151 return Error; 152} 153 154bool UnwrappedLineParser::parseLevel(bool HasOpeningBrace) { 155 bool Error = false; 156 do { 157 switch (FormatTok.Tok.getKind()) { 158 case tok::comment: 159 nextToken(); 160 addUnwrappedLine(); 161 break; 162 case tok::l_brace: 163 // FIXME: Add parameter whether this can happen - if this happens, we must 164 // be in a non-declaration context. 165 Error |= parseBlock(/*MustBeDeclaration=*/ false); 166 addUnwrappedLine(); 167 break; 168 case tok::r_brace: 169 if (HasOpeningBrace) { 170 return false; 171 } else { 172 Diag.Report(FormatTok.Tok.getLocation(), 173 Diag.getCustomDiagID(clang::DiagnosticsEngine::Error, 174 "unexpected '}'")); 175 Error = true; 176 nextToken(); 177 addUnwrappedLine(); 178 } 179 break; 180 default: 181 parseStructuralElement(); 182 break; 183 } 184 } while (!eof()); 185 return Error; 186} 187 188bool UnwrappedLineParser::parseBlock(bool MustBeDeclaration, 189 unsigned AddLevels) { 190 assert(FormatTok.Tok.is(tok::l_brace) && "'{' expected"); 191 nextToken(); 192 193 addUnwrappedLine(); 194 195 ScopedDeclarationState DeclarationState(*Line, DeclarationScopeStack, 196 MustBeDeclaration); 197 Line->Level += AddLevels; 198 parseLevel(/*HasOpeningBrace=*/true); 199 200 if (!FormatTok.Tok.is(tok::r_brace)) { 201 Line->Level -= AddLevels; 202 return true; 203 } 204 205 nextToken(); // Munch the closing brace. 206 Line->Level -= AddLevels; 207 return false; 208} 209 210void UnwrappedLineParser::parsePPDirective() { 211 assert(FormatTok.Tok.is(tok::hash) && "'#' expected"); 212 ScopedMacroState MacroState(*Line, Tokens, FormatTok); 213 nextToken(); 214 215 if (FormatTok.Tok.getIdentifierInfo() == NULL) { 216 parsePPUnknown(); 217 return; 218 } 219 220 switch (FormatTok.Tok.getIdentifierInfo()->getPPKeywordID()) { 221 case tok::pp_define: 222 parsePPDefine(); 223 break; 224 default: 225 parsePPUnknown(); 226 break; 227 } 228} 229 230void UnwrappedLineParser::parsePPDefine() { 231 nextToken(); 232 233 if (FormatTok.Tok.getKind() != tok::identifier) { 234 parsePPUnknown(); 235 return; 236 } 237 nextToken(); 238 if (FormatTok.Tok.getKind() == tok::l_paren && 239 FormatTok.WhiteSpaceLength == 0) { 240 parseParens(); 241 } 242 addUnwrappedLine(); 243 Line->Level = 1; 244 245 // Errors during a preprocessor directive can only affect the layout of the 246 // preprocessor directive, and thus we ignore them. An alternative approach 247 // would be to use the same approach we use on the file level (no 248 // re-indentation if there was a structural error) within the macro 249 // definition. 250 parseFile(); 251} 252 253void UnwrappedLineParser::parsePPUnknown() { 254 do { 255 nextToken(); 256 } while (!eof()); 257 addUnwrappedLine(); 258} 259 260void UnwrappedLineParser::parseStructuralElement() { 261 assert(!FormatTok.Tok.is(tok::l_brace)); 262 int TokenNumber = 0; 263 switch (FormatTok.Tok.getKind()) { 264 case tok::at: 265 nextToken(); 266 if (FormatTok.Tok.is(tok::l_brace)) { 267 parseBracedList(); 268 break; 269 } 270 switch (FormatTok.Tok.getObjCKeywordID()) { 271 case tok::objc_public: 272 case tok::objc_protected: 273 case tok::objc_package: 274 case tok::objc_private: 275 return parseAccessSpecifier(); 276 case tok::objc_interface: 277 case tok::objc_implementation: 278 return parseObjCInterfaceOrImplementation(); 279 case tok::objc_protocol: 280 return parseObjCProtocol(); 281 case tok::objc_end: 282 return; // Handled by the caller. 283 case tok::objc_optional: 284 case tok::objc_required: 285 nextToken(); 286 addUnwrappedLine(); 287 return; 288 default: 289 break; 290 } 291 break; 292 case tok::kw_namespace: 293 parseNamespace(); 294 return; 295 case tok::kw_inline: 296 nextToken(); 297 TokenNumber++; 298 if (FormatTok.Tok.is(tok::kw_namespace)) { 299 parseNamespace(); 300 return; 301 } 302 break; 303 case tok::kw_public: 304 case tok::kw_protected: 305 case tok::kw_private: 306 parseAccessSpecifier(); 307 return; 308 case tok::kw_if: 309 parseIfThenElse(); 310 return; 311 case tok::kw_for: 312 case tok::kw_while: 313 parseForOrWhileLoop(); 314 return; 315 case tok::kw_do: 316 parseDoWhile(); 317 return; 318 case tok::kw_switch: 319 parseSwitch(); 320 return; 321 case tok::kw_default: 322 nextToken(); 323 parseLabel(); 324 return; 325 case tok::kw_case: 326 parseCaseLabel(); 327 return; 328 case tok::kw_return: 329 parseReturn(); 330 return; 331 case tok::kw_extern: 332 nextToken(); 333 if (FormatTok.Tok.is(tok::string_literal)) { 334 nextToken(); 335 if (FormatTok.Tok.is(tok::l_brace)) { 336 parseBlock(/*MustBeDeclaration=*/ true, 0); 337 addUnwrappedLine(); 338 return; 339 } 340 } 341 // In all other cases, parse the declaration. 342 break; 343 default: 344 break; 345 } 346 do { 347 ++TokenNumber; 348 switch (FormatTok.Tok.getKind()) { 349 case tok::at: 350 nextToken(); 351 if (FormatTok.Tok.is(tok::l_brace)) 352 parseBracedList(); 353 break; 354 case tok::kw_enum: 355 parseEnum(); 356 break; 357 case tok::kw_struct: 358 case tok::kw_union: 359 case tok::kw_class: 360 parseRecord(); 361 // A record declaration or definition is always the start of a structural 362 // element. 363 break; 364 case tok::semi: 365 nextToken(); 366 addUnwrappedLine(); 367 return; 368 case tok::r_brace: 369 addUnwrappedLine(); 370 return; 371 case tok::l_paren: 372 parseParens(); 373 break; 374 case tok::l_brace: 375 // A block outside of parentheses must be the last part of a 376 // structural element. 377 // FIXME: Figure out cases where this is not true, and add projections for 378 // them (the one we know is missing are lambdas). 379 parseBlock(/*MustBeDeclaration=*/ false); 380 addUnwrappedLine(); 381 return; 382 case tok::identifier: 383 nextToken(); 384 if (TokenNumber == 1 && FormatTok.Tok.is(tok::colon)) { 385 parseLabel(); 386 return; 387 } 388 break; 389 case tok::equal: 390 nextToken(); 391 if (FormatTok.Tok.is(tok::l_brace)) { 392 parseBracedList(); 393 } 394 break; 395 default: 396 nextToken(); 397 break; 398 } 399 } while (!eof()); 400} 401 402void UnwrappedLineParser::parseBracedList() { 403 nextToken(); 404 405 do { 406 switch (FormatTok.Tok.getKind()) { 407 case tok::l_brace: 408 parseBracedList(); 409 break; 410 case tok::r_brace: 411 nextToken(); 412 return; 413 default: 414 nextToken(); 415 break; 416 } 417 } while (!eof()); 418} 419 420void UnwrappedLineParser::parseReturn() { 421 nextToken(); 422 423 do { 424 switch (FormatTok.Tok.getKind()) { 425 case tok::l_brace: 426 parseBracedList(); 427 break; 428 case tok::l_paren: 429 parseParens(); 430 break; 431 case tok::r_brace: 432 // Assume missing ';'. 433 addUnwrappedLine(); 434 return; 435 case tok::semi: 436 nextToken(); 437 addUnwrappedLine(); 438 return; 439 default: 440 nextToken(); 441 break; 442 } 443 } while (!eof()); 444} 445 446void UnwrappedLineParser::parseParens() { 447 assert(FormatTok.Tok.is(tok::l_paren) && "'(' expected."); 448 nextToken(); 449 do { 450 switch (FormatTok.Tok.getKind()) { 451 case tok::l_paren: 452 parseParens(); 453 break; 454 case tok::r_paren: 455 nextToken(); 456 return; 457 case tok::l_brace: { 458 nextToken(); 459 ScopedLineState LineState(*this); 460 ScopedDeclarationState DeclarationState(*Line, DeclarationScopeStack, 461 /*MustBeDeclaration=*/ false); 462 Line->Level += 1; 463 parseLevel(/*HasOpeningBrace=*/ true); 464 Line->Level -= 1; 465 break; 466 } 467 case tok::at: 468 nextToken(); 469 if (FormatTok.Tok.is(tok::l_brace)) 470 parseBracedList(); 471 break; 472 default: 473 nextToken(); 474 break; 475 } 476 } while (!eof()); 477} 478 479void UnwrappedLineParser::parseIfThenElse() { 480 assert(FormatTok.Tok.is(tok::kw_if) && "'if' expected"); 481 nextToken(); 482 if (FormatTok.Tok.is(tok::l_paren)) 483 parseParens(); 484 bool NeedsUnwrappedLine = false; 485 if (FormatTok.Tok.is(tok::l_brace)) { 486 parseBlock(/*MustBeDeclaration=*/ false); 487 NeedsUnwrappedLine = true; 488 } else { 489 addUnwrappedLine(); 490 ++Line->Level; 491 parseStructuralElement(); 492 --Line->Level; 493 } 494 if (FormatTok.Tok.is(tok::kw_else)) { 495 nextToken(); 496 if (FormatTok.Tok.is(tok::l_brace)) { 497 parseBlock(/*MustBeDeclaration=*/ false); 498 addUnwrappedLine(); 499 } else if (FormatTok.Tok.is(tok::kw_if)) { 500 parseIfThenElse(); 501 } else { 502 addUnwrappedLine(); 503 ++Line->Level; 504 parseStructuralElement(); 505 --Line->Level; 506 } 507 } else if (NeedsUnwrappedLine) { 508 addUnwrappedLine(); 509 } 510} 511 512void UnwrappedLineParser::parseNamespace() { 513 assert(FormatTok.Tok.is(tok::kw_namespace) && "'namespace' expected"); 514 nextToken(); 515 if (FormatTok.Tok.is(tok::identifier)) 516 nextToken(); 517 if (FormatTok.Tok.is(tok::l_brace)) { 518 parseBlock(/*MustBeDeclaration=*/ true, 0); 519 // Munch the semicolon after a namespace. This is more common than one would 520 // think. Puttin the semicolon into its own line is very ugly. 521 if (FormatTok.Tok.is(tok::semi)) 522 nextToken(); 523 addUnwrappedLine(); 524 } 525 // FIXME: Add error handling. 526} 527 528void UnwrappedLineParser::parseForOrWhileLoop() { 529 assert((FormatTok.Tok.is(tok::kw_for) || FormatTok.Tok.is(tok::kw_while)) && 530 "'for' or 'while' expected"); 531 nextToken(); 532 if (FormatTok.Tok.is(tok::l_paren)) 533 parseParens(); 534 if (FormatTok.Tok.is(tok::l_brace)) { 535 parseBlock(/*MustBeDeclaration=*/ false); 536 addUnwrappedLine(); 537 } else { 538 addUnwrappedLine(); 539 ++Line->Level; 540 parseStructuralElement(); 541 --Line->Level; 542 } 543} 544 545void UnwrappedLineParser::parseDoWhile() { 546 assert(FormatTok.Tok.is(tok::kw_do) && "'do' expected"); 547 nextToken(); 548 if (FormatTok.Tok.is(tok::l_brace)) { 549 parseBlock(/*MustBeDeclaration=*/ false); 550 } else { 551 addUnwrappedLine(); 552 ++Line->Level; 553 parseStructuralElement(); 554 --Line->Level; 555 } 556 557 // FIXME: Add error handling. 558 if (!FormatTok.Tok.is(tok::kw_while)) { 559 addUnwrappedLine(); 560 return; 561 } 562 563 nextToken(); 564 parseStructuralElement(); 565} 566 567void UnwrappedLineParser::parseLabel() { 568 // FIXME: remove all asserts. 569 assert(FormatTok.Tok.is(tok::colon) && "':' expected"); 570 nextToken(); 571 unsigned OldLineLevel = Line->Level; 572 if (Line->Level > 0) 573 --Line->Level; 574 if (FormatTok.Tok.is(tok::l_brace)) { 575 parseBlock(/*MustBeDeclaration=*/ false); 576 if (FormatTok.Tok.is(tok::kw_break)) 577 parseStructuralElement(); // "break;" after "}" goes on the same line. 578 } 579 addUnwrappedLine(); 580 Line->Level = OldLineLevel; 581} 582 583void UnwrappedLineParser::parseCaseLabel() { 584 assert(FormatTok.Tok.is(tok::kw_case) && "'case' expected"); 585 // FIXME: fix handling of complex expressions here. 586 do { 587 nextToken(); 588 } while (!eof() && !FormatTok.Tok.is(tok::colon)); 589 parseLabel(); 590} 591 592void UnwrappedLineParser::parseSwitch() { 593 assert(FormatTok.Tok.is(tok::kw_switch) && "'switch' expected"); 594 nextToken(); 595 if (FormatTok.Tok.is(tok::l_paren)) 596 parseParens(); 597 if (FormatTok.Tok.is(tok::l_brace)) { 598 parseBlock(/*MustBeDeclaration=*/ false, Style.IndentCaseLabels ? 2 : 1); 599 addUnwrappedLine(); 600 } else { 601 addUnwrappedLine(); 602 Line->Level += (Style.IndentCaseLabels ? 2 : 1); 603 parseStructuralElement(); 604 Line->Level -= (Style.IndentCaseLabels ? 2 : 1); 605 } 606} 607 608void UnwrappedLineParser::parseAccessSpecifier() { 609 nextToken(); 610 // Otherwise, we don't know what it is, and we'd better keep the next token. 611 if (FormatTok.Tok.is(tok::colon)) 612 nextToken(); 613 addUnwrappedLine(); 614} 615 616void UnwrappedLineParser::parseEnum() { 617 nextToken(); 618 if (FormatTok.Tok.is(tok::identifier) || 619 FormatTok.Tok.is(tok::kw___attribute) || 620 FormatTok.Tok.is(tok::kw___declspec)) { 621 nextToken(); 622 // We can have macros or attributes in between 'enum' and the enum name. 623 if (FormatTok.Tok.is(tok::l_paren)) { 624 parseParens(); 625 } 626 if (FormatTok.Tok.is(tok::identifier)) 627 nextToken(); 628 } 629 if (FormatTok.Tok.is(tok::l_brace)) { 630 nextToken(); 631 addUnwrappedLine(); 632 ++Line->Level; 633 do { 634 switch (FormatTok.Tok.getKind()) { 635 case tok::l_paren: 636 parseParens(); 637 break; 638 case tok::r_brace: 639 addUnwrappedLine(); 640 nextToken(); 641 --Line->Level; 642 return; 643 case tok::comma: 644 nextToken(); 645 addUnwrappedLine(); 646 break; 647 default: 648 nextToken(); 649 break; 650 } 651 } while (!eof()); 652 } 653 // We fall through to parsing a structural element afterwards, so that in 654 // enum A {} n, m; 655 // "} n, m;" will end up in one unwrapped line. 656} 657 658void UnwrappedLineParser::parseRecord() { 659 nextToken(); 660 if (FormatTok.Tok.is(tok::identifier) || 661 FormatTok.Tok.is(tok::kw___attribute) || 662 FormatTok.Tok.is(tok::kw___declspec)) { 663 nextToken(); 664 // We can have macros or attributes in between 'class' and the class name. 665 if (FormatTok.Tok.is(tok::l_paren)) { 666 parseParens(); 667 } 668 // The actual identifier can be a nested name specifier, and in macros 669 // it is often token-pasted. 670 while (FormatTok.Tok.is(tok::identifier) || 671 FormatTok.Tok.is(tok::coloncolon) || 672 FormatTok.Tok.is(tok::hashhash)) 673 nextToken(); 674 675 // Note that parsing away template declarations here leads to incorrectly 676 // accepting function declarations as record declarations. 677 // In general, we cannot solve this problem. Consider: 678 // class A<int> B() {} 679 // which can be a function definition or a class definition when B() is a 680 // macro. If we find enough real-world cases where this is a problem, we 681 // can parse for the 'template' keyword in the beginning of the statement, 682 // and thus rule out the record production in case there is no template 683 // (this would still leave us with an ambiguity between template function 684 // and class declarations). 685 if (FormatTok.Tok.is(tok::colon) || FormatTok.Tok.is(tok::less)) { 686 while (FormatTok.Tok.isNot(tok::l_brace)) { 687 if (FormatTok.Tok.is(tok::semi)) 688 return; 689 nextToken(); 690 } 691 } 692 } 693 if (FormatTok.Tok.is(tok::l_brace)) 694 parseBlock(/*MustBeDeclaration=*/ true); 695 // We fall through to parsing a structural element afterwards, so 696 // class A {} n, m; 697 // will end up in one unwrapped line. 698} 699 700void UnwrappedLineParser::parseObjCProtocolList() { 701 assert(FormatTok.Tok.is(tok::less) && "'<' expected."); 702 do 703 nextToken(); 704 while (!eof() && FormatTok.Tok.isNot(tok::greater)); 705 nextToken(); // Skip '>'. 706} 707 708void UnwrappedLineParser::parseObjCUntilAtEnd() { 709 do { 710 if (FormatTok.Tok.isObjCAtKeyword(tok::objc_end)) { 711 nextToken(); 712 addUnwrappedLine(); 713 break; 714 } 715 parseStructuralElement(); 716 } while (!eof()); 717} 718 719void UnwrappedLineParser::parseObjCInterfaceOrImplementation() { 720 nextToken(); 721 nextToken(); // interface name 722 723 // @interface can be followed by either a base class, or a category. 724 if (FormatTok.Tok.is(tok::colon)) { 725 nextToken(); 726 nextToken(); // base class name 727 } else if (FormatTok.Tok.is(tok::l_paren)) 728 // Skip category, if present. 729 parseParens(); 730 731 if (FormatTok.Tok.is(tok::less)) 732 parseObjCProtocolList(); 733 734 // If instance variables are present, keep the '{' on the first line too. 735 if (FormatTok.Tok.is(tok::l_brace)) 736 parseBlock(/*MustBeDeclaration=*/ true); 737 738 // With instance variables, this puts '}' on its own line. Without instance 739 // variables, this ends the @interface line. 740 addUnwrappedLine(); 741 742 parseObjCUntilAtEnd(); 743} 744 745void UnwrappedLineParser::parseObjCProtocol() { 746 nextToken(); 747 nextToken(); // protocol name 748 749 if (FormatTok.Tok.is(tok::less)) 750 parseObjCProtocolList(); 751 752 // Check for protocol declaration. 753 if (FormatTok.Tok.is(tok::semi)) { 754 nextToken(); 755 return addUnwrappedLine(); 756 } 757 758 addUnwrappedLine(); 759 parseObjCUntilAtEnd(); 760} 761 762void UnwrappedLineParser::addUnwrappedLine() { 763 if (Line->Tokens.empty()) 764 return; 765 DEBUG({ 766 llvm::dbgs() << "Line(" << Line->Level << ")" 767 << (Line->InPPDirective ? " MACRO" : "") << ": "; 768 for (std::list<FormatToken>::iterator I = Line->Tokens.begin(), 769 E = Line->Tokens.end(); 770 I != E; ++I) { 771 llvm::dbgs() << I->Tok.getName() << " "; 772 773 } 774 llvm::dbgs() << "\n"; 775 }); 776 CurrentLines->push_back(*Line); 777 Line->Tokens.clear(); 778 if (CurrentLines == &Lines && !PreprocessorDirectives.empty()) { 779 for (std::vector<UnwrappedLine>::iterator I = PreprocessorDirectives 780 .begin(), E = PreprocessorDirectives.end(); 781 I != E; ++I) { 782 CurrentLines->push_back(*I); 783 } 784 PreprocessorDirectives.clear(); 785 } 786 787} 788 789bool UnwrappedLineParser::eof() const { 790 return FormatTok.Tok.is(tok::eof); 791} 792 793void UnwrappedLineParser::flushComments(bool NewlineBeforeNext) { 794 bool JustComments = Line->Tokens.empty(); 795 for (SmallVectorImpl<FormatToken>::const_iterator 796 I = CommentsBeforeNextToken.begin(), 797 E = CommentsBeforeNextToken.end(); 798 I != E; ++I) { 799 if (I->NewlinesBefore && JustComments) { 800 addUnwrappedLine(); 801 } 802 pushToken(*I); 803 } 804 if (NewlineBeforeNext && JustComments) { 805 addUnwrappedLine(); 806 } 807 CommentsBeforeNextToken.clear(); 808} 809 810void UnwrappedLineParser::nextToken() { 811 if (eof()) 812 return; 813 flushComments(FormatTok.NewlinesBefore > 0); 814 pushToken(FormatTok); 815 readToken(); 816} 817 818void UnwrappedLineParser::readToken() { 819 bool CommentsInCurrentLine = true; 820 do { 821 FormatTok = Tokens->getNextToken(); 822 while (!Line->InPPDirective && FormatTok.Tok.is(tok::hash) && 823 ((FormatTok.NewlinesBefore > 0 && FormatTok.HasUnescapedNewline) || 824 FormatTok.IsFirst)) { 825 // If there is an unfinished unwrapped line, we flush the preprocessor 826 // directives only after that unwrapped line was finished later. 827 bool SwitchToPreprocessorLines = !Line->Tokens.empty() && 828 CurrentLines == &Lines; 829 ScopedLineState BlockState(*this, SwitchToPreprocessorLines); 830 parsePPDirective(); 831 } 832 if (!FormatTok.Tok.is(tok::comment)) 833 return; 834 if (FormatTok.NewlinesBefore > 0 || FormatTok.IsFirst) { 835 CommentsInCurrentLine = false; 836 } 837 if (CommentsInCurrentLine) { 838 pushToken(FormatTok); 839 } else { 840 CommentsBeforeNextToken.push_back(FormatTok); 841 } 842 } while (!eof()); 843} 844 845void UnwrappedLineParser::pushToken(const FormatToken &Tok) { 846 Line->Tokens.push_back(Tok); 847 if (MustBreakBeforeNextToken) { 848 Line->Tokens.back().MustBreakBefore = true; 849 MustBreakBeforeNextToken = false; 850 } 851} 852 853} // end namespace format 854} // end namespace clang 855