diff options
Diffstat (limited to 'clang/lib/Format/UnwrappedLineParser.cpp')
| -rw-r--r-- | clang/lib/Format/UnwrappedLineParser.cpp | 61 |
1 files changed, 40 insertions, 21 deletions
diff --git a/clang/lib/Format/UnwrappedLineParser.cpp b/clang/lib/Format/UnwrappedLineParser.cpp index eb96b54ec4c9..d406a531a5c0 100644 --- a/clang/lib/Format/UnwrappedLineParser.cpp +++ b/clang/lib/Format/UnwrappedLineParser.cpp @@ -112,6 +112,7 @@ public: Parser.Line->PPLevel = PreBlockLine->PPLevel; Parser.Line->InPPDirective = PreBlockLine->InPPDirective; Parser.Line->InMacroBody = PreBlockLine->InMacroBody; + Parser.Line->UnbracedBodyLevel = PreBlockLine->UnbracedBodyLevel; } ~ScopedLineState() { @@ -367,6 +368,8 @@ bool UnwrappedLineParser::parseLevel(const FormatToken *OpeningBrace, do { if (FormatTok->isAttribute()) { nextToken(); + if (FormatTok->is(tok::l_paren)) + parseParens(); continue; } tok::TokenKind Kind = FormatTok->Tok.getKind(); @@ -1455,6 +1458,15 @@ void UnwrappedLineParser::parseStructuralElement( } // Tokens that only make sense at the beginning of a line. + if (FormatTok->isAccessSpecifierKeyword()) { + if (Style.Language == FormatStyle::LK_Java || Style.isJavaScript() || + Style.isCSharp()) { + nextToken(); + } else { + parseAccessSpecifier(); + } + return; + } switch (FormatTok->Tok.getKind()) { case tok::kw_asm: nextToken(); @@ -1476,16 +1488,6 @@ void UnwrappedLineParser::parseStructuralElement( case tok::kw_namespace: parseNamespace(); return; - case tok::kw_public: - case tok::kw_protected: - case tok::kw_private: - if (Style.Language == FormatStyle::LK_Java || Style.isJavaScript() || - Style.isCSharp()) { - nextToken(); - } else { - parseAccessSpecifier(); - } - return; case tok::kw_if: { if (Style.isJavaScript() && Line->MustBeDeclaration) { // field/method declaration. @@ -1908,7 +1910,8 @@ void UnwrappedLineParser::parseStructuralElement( } else if (Style.BraceWrapping.AfterFunction) { addUnwrappedLine(); } - FormatTok->setFinalizedType(TT_FunctionLBrace); + if (!Previous || Previous->isNot(TT_TypeDeclarationParen)) + FormatTok->setFinalizedType(TT_FunctionLBrace); parseBlock(); IsDecltypeAutoFunction = false; addUnwrappedLine(); @@ -2153,8 +2156,8 @@ bool UnwrappedLineParser::tryToParsePropertyAccessor() { bool HasSpecialAccessor = false; bool IsTrivialPropertyAccessor = true; while (!eof()) { - if (Tok->isOneOf(tok::semi, tok::kw_public, tok::kw_private, - tok::kw_protected, Keywords.kw_internal, Keywords.kw_get, + if (Tok->isAccessSpecifierKeyword() || + Tok->isOneOf(tok::semi, Keywords.kw_internal, Keywords.kw_get, Keywords.kw_init, Keywords.kw_set)) { if (Tok->isOneOf(Keywords.kw_get, Keywords.kw_init, Keywords.kw_set)) HasSpecialAccessor = true; @@ -2257,6 +2260,8 @@ bool UnwrappedLineParser::tryToParseLambda() { break; case tok::kw_auto: case tok::kw_class: + case tok::kw_struct: + case tok::kw_union: case tok::kw_template: case tok::kw_typename: case tok::amp: @@ -2541,10 +2546,10 @@ bool UnwrappedLineParser::parseParens(TokenType AmpAmpTokenType) { if (Style.Language == FormatStyle::LK_Java && FormatTok->is(tok::l_brace)) parseChildBlock(); break; - case tok::r_paren: + case tok::r_paren: { + const auto *Prev = LeftParen->Previous; if (!MightBeStmtExpr && !MightBeFoldExpr && !Line->InMacroBody && Style.RemoveParentheses > FormatStyle::RPS_Leave) { - const auto *Prev = LeftParen->Previous; const auto *Next = Tokens->peekNextToken(); const bool DoubleParens = Prev && Prev->is(tok::l_paren) && Next && Next->is(tok::r_paren); @@ -2566,8 +2571,13 @@ bool UnwrappedLineParser::parseParens(TokenType AmpAmpTokenType) { FormatTok->Optional = true; } } + if (Prev && Prev->is(TT_TypenameMacro)) { + LeftParen->setFinalizedType(TT_TypeDeclarationParen); + FormatTok->setFinalizedType(TT_TypeDeclarationParen); + } nextToken(); return SeenEqual; + } case tok::r_brace: // A "}" inside parenthesis is an error if there wasn't a matching "{". return SeenEqual; @@ -2706,7 +2716,9 @@ void UnwrappedLineParser::parseUnbracedBody(bool CheckEOF) { addUnwrappedLine(); ++Line->Level; + ++Line->UnbracedBodyLevel; parseStructuralElement(); + --Line->UnbracedBodyLevel; if (Tok) { assert(!Line->InPPDirective); @@ -2949,9 +2961,15 @@ void UnwrappedLineParser::parseTryCatch() { assert(FormatTok->isOneOf(tok::kw_try, tok::kw___try) && "'try' expected"); nextToken(); bool NeedsUnwrappedLine = false; + bool HasCtorInitializer = false; if (FormatTok->is(tok::colon)) { + auto *Colon = FormatTok; // We are in a function try block, what comes is an initializer list. nextToken(); + if (FormatTok->is(tok::identifier)) { + HasCtorInitializer = true; + Colon->setFinalizedType(TT_CtorInitializerColon); + } // In case identifiers were removed by clang-tidy, what might follow is // multiple commas in sequence - before the first identifier. @@ -2960,14 +2978,11 @@ void UnwrappedLineParser::parseTryCatch() { while (FormatTok->is(tok::identifier)) { nextToken(); - if (FormatTok->is(tok::l_paren)) + if (FormatTok->is(tok::l_paren)) { parseParens(); - if (FormatTok->Previous && FormatTok->Previous->is(tok::identifier) && - FormatTok->is(tok::l_brace)) { - do { - nextToken(); - } while (FormatTok->isNot(tok::r_brace)); + } else if (FormatTok->is(tok::l_brace)) { nextToken(); + parseBracedList(); } // In case identifiers were removed by clang-tidy, what might follow is @@ -2983,6 +2998,8 @@ void UnwrappedLineParser::parseTryCatch() { keepAncestorBraces(); if (FormatTok->is(tok::l_brace)) { + if (HasCtorInitializer) + FormatTok->setFinalizedType(TT_FunctionLBrace); CompoundStatementIndenter Indenter(this, Style, Line->Level); parseBlock(); if (Style.BraceWrapping.BeforeCatch) @@ -4834,6 +4851,8 @@ void UnwrappedLineParser::readToken(int LevelDifference) { PPBranchLevel > 0) { Line->Level += PPBranchLevel; } + assert(Line->Level >= Line->UnbracedBodyLevel); + Line->Level -= Line->UnbracedBodyLevel; flushComments(isOnNewLine(*FormatTok)); parsePPDirective(); PreviousWasComment = FormatTok->is(tok::comment); |
