Lines Matching +full:js +full:- +full:tokens
1 //===--- UnwrappedLineParser.cpp - Format C++ code ------------------------===//
8 //===----------------------------------------------------------------------===//
12 /// which turns a stream of tokens into UnwrappedLines.
14 //===----------------------------------------------------------------------===//
21 #define DEBUG_TYPE "format-parser"
81 Token = PreviousTokenSource->getNextToken(); in getNextToken()
87 unsigned getPosition() override { return PreviousTokenSource->getPosition(); } in getPosition()
90 Token = PreviousTokenSource->setPosition(Position); in setPosition()
95 bool eof() { return Token && Token->HasUnescapedNewline; } in eof()
126 else if (!Parser.Line->Tokens.empty()) in ScopedLineState()
127 Parser.CurrentLines = &Parser.Line->Tokens.back().Children; in ScopedLineState()
130 Parser.Line->Level = PreBlockLine->Level; in ScopedLineState()
131 Parser.Line->InPPDirective = PreBlockLine->InPPDirective; in ScopedLineState()
135 if (!Parser.Line->Tokens.empty()) { in ~ScopedLineState()
138 assert(Parser.Line->Tokens.empty()); in ~ScopedLineState()
158 Parser->addUnwrappedLine(); in CompoundStatementIndenter()
173 IndexedTokenSource(ArrayRef<FormatToken *> Tokens) in IndexedTokenSource() argument
174 : Tokens(Tokens), Position(-1) {} in IndexedTokenSource()
178 return Tokens[Position]; in getNextToken()
188 return Tokens[Position]; in setPosition()
191 void reset() { Position = -1; } in reset()
194 ArrayRef<FormatToken *> Tokens; member in clang::format::__anon527479d30211::IndexedTokenSource
202 ArrayRef<FormatToken *> Tokens, in UnwrappedLineParser() argument
205 CurrentLines(&Lines), Style(Style), Keywords(Keywords), Tokens(nullptr), in UnwrappedLineParser()
206 Callback(Callback), AllTokens(Tokens), PPBranchLevel(-1) {} in UnwrappedLineParser()
209 PPBranchLevel = -1; in reset()
223 DEBUG(llvm::dbgs() << "----\n"); in parse()
225 Tokens = &TokenSource; in parse()
243 PPLevelBranchIndex.resize(PPLevelBranchIndex.size() - 1); in parse()
244 PPLevelBranchCount.resize(PPLevelBranchCount.size() - 1); in parse()
255 // The top-level context in a file always has declarations, except for pre- in parseFile()
258 !Line->InPPDirective && Style.Language != FormatStyle::LK_JavaScript; in parseFile()
262 // Make sure to format the remaining tokens. in parseFile()
270 tok::TokenKind kind = FormatTok->Tok.getKind(); in parseLevel()
271 if (FormatTok->Type == TT_MacroBlockBegin) { in parseLevel()
273 } else if (FormatTok->Type == TT_MacroBlockEnd) { in parseLevel()
283 // FIXME: Add parameter whether this can happen - if this happens, we must in parseLevel()
284 // be in a non-declaration context. in parseLevel()
285 if (!FormatTok->is(TT_MacroBlockBegin) && tryToParseBracedList()) in parseLevel()
299 (Style.IndentCaseLabels || (Line->InPPDirective && Line->Level == 1))) in parseLevel()
300 ++Line->Level; in parseLevel()
312 // We'll parse forward through the tokens until we hit in calculateBraceTypes()
313 // a closing brace or eof - note that getNextToken() will in calculateBraceTypes()
316 unsigned StoredPosition = Tokens->getPosition(); in calculateBraceTypes()
319 // Keep a stack of positions of lbrace tokens. We will in calculateBraceTypes()
323 assert(Tok->Tok.is(tok::l_brace)); in calculateBraceTypes()
325 // Get next non-comment token. in calculateBraceTypes()
329 NextTok = Tokens->getNextToken(); in calculateBraceTypes()
331 } while (NextTok->is(tok::comment)); in calculateBraceTypes()
333 switch (Tok->Tok.getKind()) { in calculateBraceTypes()
336 PrevTok->is(tok::colon)) in calculateBraceTypes()
339 Tok->BlockKind = BK_BracedInit; in calculateBraceTypes()
341 Tok->BlockKind = BK_Unknown; in calculateBraceTypes()
347 if (LBraceStack.back()->BlockKind == BK_Unknown) { in calculateBraceTypes()
350 ProbablyBracedList = NextTok->isOneOf(tok::comma, tok::r_square); in calculateBraceTypes()
354 bool NextIsObjCMethod = NextTok->isOneOf(tok::plus, tok::minus) && in calculateBraceTypes()
355 NextTok->OriginalColumn == 0; in calculateBraceTypes()
364 // We exclude + and - as they can be ObjC visibility modifiers. in calculateBraceTypes()
367 NextTok->isOneOf(Keywords.kw_of, Keywords.kw_in)) || in calculateBraceTypes()
368 NextTok->isOneOf(tok::comma, tok::period, tok::colon, in calculateBraceTypes()
371 (NextTok->is(tok::semi) && in calculateBraceTypes()
373 (NextTok->isBinaryOperator() && !NextIsObjCMethod); in calculateBraceTypes()
376 Tok->BlockKind = BK_BracedInit; in calculateBraceTypes()
377 LBraceStack.back()->BlockKind = BK_BracedInit; in calculateBraceTypes()
379 Tok->BlockKind = BK_Block; in calculateBraceTypes()
380 LBraceStack.back()->BlockKind = BK_Block; in calculateBraceTypes()
393 if (!LBraceStack.empty() && LBraceStack.back()->BlockKind == BK_Unknown) in calculateBraceTypes()
394 LBraceStack.back()->BlockKind = BK_Block; in calculateBraceTypes()
401 } while (Tok->Tok.isNot(tok::eof) && !LBraceStack.empty()); in calculateBraceTypes()
405 if (LBraceStack[i]->BlockKind == BK_Unknown) in calculateBraceTypes()
406 LBraceStack[i]->BlockKind = BK_Block; in calculateBraceTypes()
409 FormatTok = Tokens->setPosition(StoredPosition); in calculateBraceTypes()
414 assert(FormatTok->isOneOf(tok::l_brace, TT_MacroBlockBegin) && in parseBlock()
416 const bool MacroBlock = FormatTok->is(TT_MacroBlockBegin); in parseBlock()
417 FormatTok->BlockKind = BK_Block; in parseBlock()
419 unsigned InitialLevel = Line->Level; in parseBlock()
422 if (MacroBlock && FormatTok->is(tok::l_paren)) in parseBlock()
430 ++Line->Level; in parseBlock()
436 if (MacroBlock ? !FormatTok->is(TT_MacroBlockEnd) in parseBlock()
437 : !FormatTok->is(tok::r_brace)) { in parseBlock()
438 Line->Level = InitialLevel; in parseBlock()
439 FormatTok->BlockKind = BK_Block; in parseBlock()
445 if (MacroBlock && FormatTok->is(tok::l_paren)) in parseBlock()
448 if (MunchSemi && FormatTok->Tok.is(tok::semi)) in parseBlock()
450 Line->Level = InitialLevel; in parseBlock()
454 // FIXME: Closure-library specific stuff should not be hard-coded but be in isGoogScope()
456 if (Line.Tokens.size() < 4) in isGoogScope()
458 auto I = Line.Tokens.begin(); in isGoogScope()
459 if (I->Tok->TokenText != "goog") in isGoogScope()
462 if (I->Tok->isNot(tok::period)) in isGoogScope()
465 if (I->Tok->TokenText != "scope") in isGoogScope()
468 return I->Tok->is(tok::l_paren); in isGoogScope()
485 FormatTok->BlockKind = BK_Block; in parseChildBlock()
493 Line->Level += GoogScope ? 0 : 1; in parseChildBlock()
496 Line->Level -= GoogScope ? 0 : 1; in parseChildBlock()
502 assert(FormatTok->Tok.is(tok::hash) && "'#' expected"); in parsePPDirective()
503 ScopedMacroState MacroState(*Line, Tokens, FormatTok); in parsePPDirective()
506 if (!FormatTok->Tok.getIdentifierInfo()) { in parsePPDirective()
511 switch (FormatTok->Tok.getIdentifierInfo()->getPPKeywordID()) { in parsePPDirective()
576 --PPBranchLevel; in conditionalCompilationEnd()
585 bool IsLiteralFalse = (FormatTok->Tok.isLiteral() && in parsePPIf()
586 FormatTok->Tok.getLiteralData() != nullptr && in parsePPIf()
587 StringRef(FormatTok->Tok.getLiteralData(), in parsePPIf()
588 FormatTok->Tok.getLength()) == "0") || in parsePPIf()
589 FormatTok->Tok.is(tok::kw_false); in parsePPIf()
609 if (FormatTok->Tok.getKind() != tok::identifier) { in parsePPDefine()
614 if (FormatTok->Tok.getKind() == tok::l_paren && in parsePPDefine()
615 FormatTok->WhitespaceRange.getBegin() == in parsePPDefine()
616 FormatTok->WhitespaceRange.getEnd()) { in parsePPDefine()
620 Line->Level = 1; in parsePPDefine()
625 // re-indentation if there was a structural error) within the macro in parsePPDefine()
637 // Here we blacklist certain tokens that are not usually the first token in an
641 // Semicolon can be a null-statement, l_square can be a start of a macro or in tokenCanStartNewLine()
645 // Tokens that can only be used as binary operators and a part of in tokenCanStartNewLine()
659 // range-based for loops, ternary operator, but should never be the in tokenCanStartNewLine()
669 return FormatTok->is(tok::identifier) && in mustBeJSIdent()
670 (FormatTok->Tok.getIdentifierInfo() == nullptr || in mustBeJSIdent()
671 !FormatTok->isOneOf(Keywords.kw_in, Keywords.kw_of, Keywords.kw_as, in mustBeJSIdent()
683 return FormatTok->Tok.isLiteral() || mustBeJSIdent(Keywords, FormatTok); in mustBeJSIdentOrValue()
690 return FormatTok->isOneOf( in isJSDeclOrStmt()
711 // This method is conservative - it cannot cover all edge cases of JavaScript,
721 ? Next->NewlinesBefore == 0 in readTokenWithJavaScriptASI()
722 : CommentsBeforeNextToken.front()->NewlinesBefore == 0; in readTokenWithJavaScriptASI()
727 if (PreviousMustBeValue && Line && Line->Tokens.size() > 1) { in readTokenWithJavaScriptASI()
730 const FormatToken *PrePrevious = std::prev(Line->Tokens.end(), 2)->Tok; in readTokenWithJavaScriptASI()
731 if (PrePrevious->is(tok::at)) in readTokenWithJavaScriptASI()
734 if (Next->is(tok::exclaim) && PreviousMustBeValue) in readTokenWithJavaScriptASI()
738 Previous->isOneOf(tok::r_square, tok::r_paren, in readTokenWithJavaScriptASI()
746 assert(!FormatTok->is(tok::l_brace)); in parseStructuralElement()
748 FormatTok->is(tok::pp_include)) { in parseStructuralElement()
750 if (FormatTok->is(tok::string_literal)) in parseStructuralElement()
755 switch (FormatTok->Tok.getKind()) { in parseStructuralElement()
758 if (FormatTok->Tok.is(tok::l_brace)) { in parseStructuralElement()
762 switch (FormatTok->Tok.getObjCKeywordID()) { in parseStructuralElement()
782 if (FormatTok->Tok.is(tok::l_brace)) { in parseStructuralElement()
800 if (FormatTok->is(tok::l_brace)) { in parseStructuralElement()
801 FormatTok->Type = TT_InlineASMBrace; in parseStructuralElement()
803 while (FormatTok && FormatTok->isNot(tok::eof)) { in parseStructuralElement()
804 if (FormatTok->is(tok::r_brace)) { in parseStructuralElement()
805 FormatTok->Type = TT_InlineASMBrace; in parseStructuralElement()
810 FormatTok->Finalized = true; in parseStructuralElement()
820 if (FormatTok->Tok.is(tok::kw_namespace)) { in parseStructuralElement()
860 if (FormatTok->Tok.is(tok::string_literal)) { in parseStructuralElement()
862 if (FormatTok->Tok.is(tok::l_brace)) { in parseStructuralElement()
876 if (FormatTok->is(TT_ForEachMacro)) { in parseStructuralElement()
880 if (FormatTok->is(TT_MacroBlockBegin)) { in parseStructuralElement()
885 if (FormatTok->is(Keywords.kw_import)) { in parseStructuralElement()
892 if (FormatTok->is(tok::kw_public)) in parseStructuralElement()
894 if (!FormatTok->is(tok::string_literal)) in parseStructuralElement()
897 if (FormatTok->is(tok::semi)) in parseStructuralElement()
903 if (FormatTok->isOneOf(Keywords.kw_signals, Keywords.kw_qsignals, in parseStructuralElement()
906 if (FormatTok->is(tok::colon)) { in parseStructuralElement()
919 switch (FormatTok->Tok.getKind()) { in parseStructuralElement()
922 if (FormatTok->Tok.is(tok::l_brace)) in parseStructuralElement()
927 if (Previous && Previous->is(tok::less)) { in parseStructuralElement()
944 if (FormatTok->isOneOf(Keywords.kw_NS_ENUM, Keywords.kw_NS_OPTIONS, in parseStructuralElement()
957 if (FormatTok->is(tok::semi)) in parseStructuralElement()
967 FormatTok->is(tok::kw_class)) in parseStructuralElement()
970 FormatTok->Tok.getIdentifierInfo()) in parseStructuralElement()
987 if (FormatTok->isBinaryOperator()) in parseStructuralElement()
992 if (FormatTok->Tok.isAnyIdentifier() || in parseStructuralElement()
993 FormatTok->isSimpleTypeSpecifier()) in parseStructuralElement()
995 if (FormatTok->is(tok::l_paren)) in parseStructuralElement()
997 if (FormatTok->is(tok::l_brace)) in parseStructuralElement()
1008 FormatTok->Type = TT_FunctionLBrace; in parseStructuralElement()
1017 // We arrive here when parsing function-try blocks. in parseStructuralElement()
1021 if (FormatTok->is(TT_MacroBlockEnd)) { in parseStructuralElement()
1027 // in which case this should be treated as a free-standing function. in parseStructuralElement()
1029 (FormatTok->is(Keywords.kw_function) || in parseStructuralElement()
1030 FormatTok->startsSequence(Keywords.kw_async, in parseStructuralElement()
1032 Line->Tokens.size() > 0) { in parseStructuralElement()
1038 FormatTok->is(Keywords.kw_interface)) { in parseStructuralElement()
1044 unsigned StoredPosition = Tokens->getPosition(); in parseStructuralElement()
1045 FormatToken *Next = Tokens->getNextToken(); in parseStructuralElement()
1046 FormatTok = Tokens->setPosition(StoredPosition); in parseStructuralElement()
1058 StringRef Text = FormatTok->TokenText; in parseStructuralElement()
1060 if (Line->Tokens.size() == 1 && in parseStructuralElement()
1061 // JS doesn't have macros, and within classes colons indicate fields, in parseStructuralElement()
1064 if (FormatTok->Tok.is(tok::colon) && !Line->MustBeDeclaration) { in parseStructuralElement()
1065 Line->Tokens.begin()->Tok->MustBreakBefore = true; in parseStructuralElement()
1069 // Recognize function-like macro usages without trailing semicolon as in parseStructuralElement()
1070 // well as free-standing macros like Q_OBJECT. in parseStructuralElement()
1071 bool FunctionLike = FormatTok->is(tok::l_paren); in parseStructuralElement()
1077 ? FormatTok->NewlinesBefore > 0 in parseStructuralElement()
1078 : CommentsBeforeNextToken.front()->NewlinesBefore > 0; in parseStructuralElement()
1081 tokenCanStartNewLine(FormatTok->Tok) && Text == Text.upper()) { in parseStructuralElement()
1092 if (FormatTok->is(TT_JsFatArrow)) { in parseStructuralElement()
1094 if (FormatTok->is(tok::l_brace)) in parseStructuralElement()
1100 if (FormatTok->Tok.is(tok::l_brace)) { in parseStructuralElement()
1124 (Previous->isOneOf(tok::identifier, tok::kw_operator, tok::kw_new, in tryToParseLambda()
1126 Previous->closesScope() || Previous->isSimpleTypeSpecifier())) { in tryToParseLambda()
1130 assert(FormatTok->is(tok::l_square)); in tryToParseLambda()
1135 while (FormatTok->isNot(tok::l_brace)) { in tryToParseLambda()
1136 if (FormatTok->isSimpleTypeSpecifier()) { in tryToParseLambda()
1140 switch (FormatTok->Tok.getKind()) { in tryToParseLambda()
1159 FormatTok->Type = TT_LambdaArrow; in tryToParseLambda()
1173 if (FormatTok->is(tok::equal)) { in tryToParseLambdaIntroducer()
1175 if (FormatTok->is(tok::r_square)) { in tryToParseLambdaIntroducer()
1179 if (FormatTok->isNot(tok::comma)) in tryToParseLambdaIntroducer()
1182 } else if (FormatTok->is(tok::amp)) { in tryToParseLambdaIntroducer()
1184 if (FormatTok->is(tok::r_square)) { in tryToParseLambdaIntroducer()
1188 if (!FormatTok->isOneOf(tok::comma, tok::identifier)) { in tryToParseLambdaIntroducer()
1191 if (FormatTok->is(tok::comma)) in tryToParseLambdaIntroducer()
1193 } else if (FormatTok->is(tok::r_square)) { in tryToParseLambdaIntroducer()
1198 if (FormatTok->is(tok::amp)) in tryToParseLambdaIntroducer()
1200 if (!FormatTok->isOneOf(tok::identifier, tok::kw_this)) in tryToParseLambdaIntroducer()
1203 if (FormatTok->is(tok::ellipsis)) in tryToParseLambdaIntroducer()
1205 if (FormatTok->is(tok::comma)) { in tryToParseLambdaIntroducer()
1207 } else if (FormatTok->is(tok::r_square)) { in tryToParseLambdaIntroducer()
1218 assert(FormatTok->is(Keywords.kw_function) || in tryToParseJSFunction()
1219 FormatTok->startsSequence(Keywords.kw_async, Keywords.kw_function)); in tryToParseJSFunction()
1220 if (FormatTok->is(Keywords.kw_async)) in tryToParseJSFunction()
1226 if (FormatTok->is(tok::star)) in tryToParseJSFunction()
1230 if (FormatTok->is(tok::identifier)) in tryToParseJSFunction()
1233 if (FormatTok->isNot(tok::l_paren)) in tryToParseJSFunction()
1239 if (FormatTok->is(tok::colon)) { in tryToParseJSFunction()
1245 if (FormatTok->is(tok::l_brace)) in tryToParseJSFunction()
1248 while (FormatTok->isNot(tok::l_brace) && !eof()) in tryToParseJSFunction()
1256 if (FormatTok->BlockKind == BK_Unknown) in tryToParseBracedList()
1258 assert(FormatTok->BlockKind != BK_Unknown); in tryToParseBracedList()
1259 if (FormatTok->BlockKind == BK_Block) in tryToParseBracedList()
1273 if (FormatTok->is(Keywords.kw_function) || in parseBracedList()
1274 FormatTok->startsSequence(Keywords.kw_async, Keywords.kw_function)) { in parseBracedList()
1278 if (FormatTok->is(TT_JsFatArrow)) { in parseBracedList()
1282 if (FormatTok->is(tok::l_brace)) { in parseBracedList()
1288 switch (FormatTok->Tok.getKind()) { in parseBracedList()
1291 if (FormatTok->is(tok::l_brace)) { in parseBracedList()
1301 FormatTok->BlockKind = BK_BracedInit; in parseBracedList()
1309 if (FormatTok->is(tok::l_brace)) in parseBracedList()
1319 // lists (in so-called TypeMemberLists). Thus, the semicolon cannot be in parseBracedList()
1343 assert(FormatTok->Tok.is(tok::l_paren) && "'(' expected."); in parseParens()
1346 switch (FormatTok->Tok.getKind()) { in parseParens()
1349 if (Style.Language == FormatStyle::LK_Java && FormatTok->is(tok::l_brace)) in parseParens()
1367 if (FormatTok->Tok.is(tok::l_brace)) in parseParens()
1372 (FormatTok->is(Keywords.kw_function) || in parseParens()
1373 FormatTok->startsSequence(Keywords.kw_async, Keywords.kw_function))) in parseParens()
1386 assert(FormatTok->Tok.is(tok::l_square) && "'[' expected."); in parseSquare()
1390 switch (FormatTok->Tok.getKind()) { in parseSquare()
1410 if (FormatTok->Tok.is(tok::l_brace)) in parseSquare()
1421 assert(FormatTok->Tok.is(tok::kw_if) && "'if' expected"); in parseIfThenElse()
1423 if (FormatTok->Tok.is(tok::l_paren)) in parseIfThenElse()
1426 if (FormatTok->Tok.is(tok::l_brace)) { in parseIfThenElse()
1427 CompoundStatementIndenter Indenter(this, Style, Line->Level); in parseIfThenElse()
1435 ++Line->Level; in parseIfThenElse()
1437 --Line->Level; in parseIfThenElse()
1439 if (FormatTok->Tok.is(tok::kw_else)) { in parseIfThenElse()
1441 if (FormatTok->Tok.is(tok::l_brace)) { in parseIfThenElse()
1442 CompoundStatementIndenter Indenter(this, Style, Line->Level); in parseIfThenElse()
1445 } else if (FormatTok->Tok.is(tok::kw_if)) { in parseIfThenElse()
1449 ++Line->Level; in parseIfThenElse()
1451 if (FormatTok->is(tok::eof)) in parseIfThenElse()
1453 --Line->Level; in parseIfThenElse()
1461 assert(FormatTok->isOneOf(tok::kw_try, tok::kw___try) && "'try' expected"); in parseTryCatch()
1464 if (FormatTok->is(tok::colon)) { in parseTryCatch()
1467 while (FormatTok->is(tok::identifier)) { in parseTryCatch()
1469 if (FormatTok->is(tok::l_paren)) in parseTryCatch()
1471 if (FormatTok->is(tok::comma)) in parseTryCatch()
1476 if (Style.Language == FormatStyle::LK_Java && FormatTok->is(tok::l_paren)) { in parseTryCatch()
1479 if (FormatTok->is(tok::l_brace)) { in parseTryCatch()
1480 CompoundStatementIndenter Indenter(this, Style, Line->Level); in parseTryCatch()
1487 } else if (!FormatTok->is(tok::kw_catch)) { in parseTryCatch()
1488 // The C++ standard requires a compound-statement after a try. in parseTryCatch()
1492 ++Line->Level; in parseTryCatch()
1494 --Line->Level; in parseTryCatch()
1497 if (FormatTok->is(tok::at)) in parseTryCatch()
1499 if (!(FormatTok->isOneOf(tok::kw_catch, Keywords.kw___except, in parseTryCatch()
1503 FormatTok->is(Keywords.kw_finally)) || in parseTryCatch()
1504 (FormatTok->Tok.isObjCAtKeyword(tok::objc_catch) || in parseTryCatch()
1505 FormatTok->Tok.isObjCAtKeyword(tok::objc_finally)))) in parseTryCatch()
1508 while (FormatTok->isNot(tok::l_brace)) { in parseTryCatch()
1509 if (FormatTok->is(tok::l_paren)) { in parseTryCatch()
1513 if (FormatTok->isOneOf(tok::semi, tok::r_brace, tok::eof)) in parseTryCatch()
1518 CompoundStatementIndenter Indenter(this, Style, Line->Level); in parseTryCatch()
1530 assert(FormatTok->Tok.is(tok::kw_namespace) && "'namespace' expected"); in parseNamespace()
1534 while (FormatTok->isOneOf(tok::identifier, tok::coloncolon)) in parseNamespace()
1536 if (FormatTok->Tok.is(tok::l_brace)) { in parseNamespace()
1546 if (FormatTok->Tok.is(tok::semi)) in parseNamespace()
1554 assert(FormatTok->is(tok::kw_new) && "'new' expected"); in parseNew()
1562 if (FormatTok->isOneOf(tok::semi, tok::l_brace, tok::r_brace)) in parseNew()
1566 if (FormatTok->is(tok::l_paren)) { in parseNew()
1570 if (FormatTok->is(tok::l_brace)) in parseNew()
1579 assert(FormatTok->isOneOf(tok::kw_for, tok::kw_while, TT_ForEachMacro) && in parseForOrWhileLoop()
1582 if (FormatTok->Tok.is(tok::l_paren)) in parseForOrWhileLoop()
1584 if (FormatTok->Tok.is(tok::l_brace)) { in parseForOrWhileLoop()
1585 CompoundStatementIndenter Indenter(this, Style, Line->Level); in parseForOrWhileLoop()
1590 ++Line->Level; in parseForOrWhileLoop()
1592 --Line->Level; in parseForOrWhileLoop()
1597 assert(FormatTok->Tok.is(tok::kw_do) && "'do' expected"); in parseDoWhile()
1599 if (FormatTok->Tok.is(tok::l_brace)) { in parseDoWhile()
1600 CompoundStatementIndenter Indenter(this, Style, Line->Level); in parseDoWhile()
1606 ++Line->Level; in parseDoWhile()
1608 --Line->Level; in parseDoWhile()
1612 if (!FormatTok->Tok.is(tok::kw_while)) { in parseDoWhile()
1623 unsigned OldLineLevel = Line->Level; in parseLabel()
1624 if (Line->Level > 1 || (!Line->InPPDirective && Line->Level > 0)) in parseLabel()
1625 --Line->Level; in parseLabel()
1626 if (CommentsBeforeNextToken.empty() && FormatTok->Tok.is(tok::l_brace)) { in parseLabel()
1627 CompoundStatementIndenter Indenter(this, Style, Line->Level); in parseLabel()
1629 if (FormatTok->Tok.is(tok::kw_break)) { in parseLabel()
1636 if (FormatTok->is(tok::semi)) in parseLabel()
1640 Line->Level = OldLineLevel; in parseLabel()
1641 if (FormatTok->isNot(tok::l_brace)) { in parseLabel()
1648 assert(FormatTok->Tok.is(tok::kw_case) && "'case' expected"); in parseCaseLabel()
1652 } while (!eof() && !FormatTok->Tok.is(tok::colon)); in parseCaseLabel()
1657 assert(FormatTok->Tok.is(tok::kw_switch) && "'switch' expected"); in parseSwitch()
1659 if (FormatTok->Tok.is(tok::l_paren)) in parseSwitch()
1661 if (FormatTok->Tok.is(tok::l_brace)) { in parseSwitch()
1662 CompoundStatementIndenter Indenter(this, Style, Line->Level); in parseSwitch()
1667 ++Line->Level; in parseSwitch()
1669 --Line->Level; in parseSwitch()
1676 if (FormatTok->isOneOf(Keywords.kw_slots, Keywords.kw_qslots)) in parseAccessSpecifier()
1679 if (FormatTok->Tok.is(tok::colon)) in parseAccessSpecifier()
1686 if (FormatTok->Tok.is(tok::kw_enum)) in parseEnum()
1693 FormatTok->isOneOf(tok::colon, tok::question)) in parseEnum()
1697 if (FormatTok->Tok.is(tok::kw_class) || FormatTok->Tok.is(tok::kw_struct)) in parseEnum()
1700 while (FormatTok->Tok.getIdentifierInfo() || in parseEnum()
1701 FormatTok->isOneOf(tok::colon, tok::coloncolon, tok::less, in parseEnum()
1705 if (FormatTok->is(tok::l_paren)) in parseEnum()
1707 if (FormatTok->is(tok::identifier)) { in parseEnum()
1712 FormatTok->is(tok::identifier)) in parseEnum()
1718 if (FormatTok->isNot(tok::l_brace)) in parseEnum()
1720 FormatTok->BlockKind = BK_Block; in parseEnum()
1735 if (FormatTok->is(tok::semi)) in parseEnum()
1750 unsigned StoredPosition = Tokens->getPosition(); in parseJavaEnumBody()
1752 FormatToken *Tok = Tokens->getNextToken(); in parseJavaEnumBody()
1754 if (Tok->is(tok::r_brace)) in parseJavaEnumBody()
1756 if (Tok->isOneOf(tok::l_brace, tok::semi)) { in parseJavaEnumBody()
1762 Tok = Tokens->getNextToken(); in parseJavaEnumBody()
1764 FormatTok = Tokens->setPosition(StoredPosition); in parseJavaEnumBody()
1776 ++Line->Level; in parseJavaEnumBody()
1780 if (FormatTok->is(tok::l_brace)) { in parseJavaEnumBody()
1784 } else if (FormatTok->is(tok::l_paren)) { in parseJavaEnumBody()
1786 } else if (FormatTok->is(tok::comma)) { in parseJavaEnumBody()
1789 } else if (FormatTok->is(tok::semi)) { in parseJavaEnumBody()
1793 } else if (FormatTok->is(tok::r_brace)) { in parseJavaEnumBody()
1804 --Line->Level; in parseJavaEnumBody()
1813 // it is often token-pasted. in parseRecord()
1814 while (FormatTok->isOneOf(tok::identifier, tok::coloncolon, tok::hashhash, in parseRecord()
1819 FormatTok->isOneOf(tok::period, tok::comma))) { in parseRecord()
1821 FormatTok->is(tok::identifier) && in parseRecord()
1822 FormatTok->TokenText != FormatTok->TokenText.upper(); in parseRecord()
1825 if (!IsNonMacroIdentifier && FormatTok->Tok.is(tok::l_paren)) in parseRecord()
1834 // macro. If we find enough real-world cases where this is a problem, we in parseRecord()
1839 if (FormatTok->isOneOf(tok::colon, tok::less)) { in parseRecord()
1841 if (FormatTok->is(tok::l_brace)) { in parseRecord()
1846 if (FormatTok->Tok.is(tok::semi)) in parseRecord()
1851 if (FormatTok->Tok.is(tok::l_brace)) { in parseRecord()
1864 assert(FormatTok->Tok.is(tok::less) && "'<' expected."); in parseObjCProtocolList()
1867 while (!eof() && FormatTok->Tok.isNot(tok::greater)); in parseObjCProtocolList()
1873 if (FormatTok->Tok.isObjCAtKeyword(tok::objc_end)) { in parseObjCUntilAtEnd()
1878 if (FormatTok->is(tok::l_brace)) { in parseObjCUntilAtEnd()
1882 } else if (FormatTok->is(tok::r_brace)) { in parseObjCUntilAtEnd()
1897 if (FormatTok->Tok.is(tok::colon)) { in parseObjCInterfaceOrImplementation()
1900 } else if (FormatTok->Tok.is(tok::l_paren)) in parseObjCInterfaceOrImplementation()
1904 if (FormatTok->Tok.is(tok::less)) in parseObjCInterfaceOrImplementation()
1907 if (FormatTok->Tok.is(tok::l_brace)) { in parseObjCInterfaceOrImplementation()
1924 if (FormatTok->Tok.is(tok::less)) in parseObjCProtocol()
1928 if (FormatTok->Tok.is(tok::semi)) { in parseObjCProtocol()
1938 bool IsImport = FormatTok->is(Keywords.kw_import); in parseJavaScriptEs6ImportExport()
1939 assert(IsImport || FormatTok->is(tok::kw_export)); in parseJavaScriptEs6ImportExport()
1943 if (FormatTok->is(tok::kw_default)) in parseJavaScriptEs6ImportExport()
1947 // get parsed as free-standing JS functions, i.e. do not require a trailing in parseJavaScriptEs6ImportExport()
1949 if (FormatTok->is(Keywords.kw_async)) in parseJavaScriptEs6ImportExport()
1951 if (FormatTok->is(Keywords.kw_function)) { in parseJavaScriptEs6ImportExport()
1960 if (!IsImport && !FormatTok->isOneOf(tok::l_brace, tok::star) && in parseJavaScriptEs6ImportExport()
1961 !FormatTok->isStringLiteral()) in parseJavaScriptEs6ImportExport()
1964 while (!eof() && FormatTok->isNot(tok::semi)) { in parseJavaScriptEs6ImportExport()
1965 if (FormatTok->is(tok::l_brace)) { in parseJavaScriptEs6ImportExport()
1966 FormatTok->BlockKind = BK_Block; in parseJavaScriptEs6ImportExport()
1978 for (std::list<UnwrappedLineNode>::const_iterator I = Line.Tokens.begin(), in printDebugInfo()
1979 E = Line.Tokens.end(); in printDebugInfo()
1981 llvm::dbgs() << I->Tok->Tok.getName() << "[" << I->Tok->Type << "] "; in printDebugInfo()
1983 for (std::list<UnwrappedLineNode>::const_iterator I = Line.Tokens.begin(), in printDebugInfo()
1984 E = Line.Tokens.end(); in printDebugInfo()
1998 if (Line->Tokens.empty()) in addUnwrappedLine()
2004 CurrentLines->push_back(std::move(*Line)); in addUnwrappedLine()
2005 Line->Tokens.clear(); in addUnwrappedLine()
2007 CurrentLines->append( in addUnwrappedLine()
2014 bool UnwrappedLineParser::eof() const { return FormatTok->Tok.is(tok::eof); } in eof()
2017 return (Line->InPPDirective || FormatTok.HasUnescapedNewline) && in isOnNewLine()
2022 bool JustComments = Line->Tokens.empty(); in flushComments()
2050 if (!Line || Line->Tokens.empty()) in getPreviousToken()
2052 return Line->Tokens.back().Tok; in getPreviousToken()
2058 FormatTok = Tokens->getNextToken(); in readToken()
2060 while (!Line->InPPDirective && FormatTok->Tok.is(tok::hash) && in readToken()
2061 (FormatTok->HasUnescapedNewline || FormatTok->IsFirst)) { in readToken()
2064 bool SwitchToPreprocessorLines = !Line->Tokens.empty(); in readToken()
2072 while (FormatTok->Type == TT_ConflictStart || in readToken()
2073 FormatTok->Type == TT_ConflictEnd || in readToken()
2074 FormatTok->Type == TT_ConflictAlternative) { in readToken()
2075 if (FormatTok->Type == TT_ConflictStart) { in readToken()
2077 } else if (FormatTok->Type == TT_ConflictAlternative) { in readToken()
2079 } else if (FormatTok->Type == TT_ConflictEnd) { in readToken()
2082 FormatTok = Tokens->getNextToken(); in readToken()
2083 FormatTok->MustBreakBefore = true; in readToken()
2087 !Line->InPPDirective) { in readToken()
2091 if (!FormatTok->Tok.is(tok::comment)) in readToken()
2093 if (isOnNewLine(*FormatTok) || FormatTok->IsFirst) { in readToken()
2105 Line->Tokens.push_back(UnwrappedLineNode(Tok)); in pushToken()
2107 Line->Tokens.back().Tok->MustBreakBefore = true; in pushToken()