[clang-format] Don't remove parentheses separated from ellipsis by co… · llvm/llvm-project@f7a4e3a (original) (raw)

`@@ -2562,12 +2562,12 @@ bool UnwrappedLineParser::parseBracedList(bool IsAngleBracket, bool IsEnum) {

`

2562

2562

`` /// Returns whether there is a = token between the parentheses.

``

2563

2563

`bool UnwrappedLineParser::parseParens(TokenType AmpAmpTokenType) {

`

2564

2564

`assert(FormatTok->is(tok::l_paren) && "'(' expected.");

`

2565

``

`-

auto *LeftParen = FormatTok;

`

``

2565

`+

auto *LParen = FormatTok;

`

2566

2566

`bool SeenComma = false;

`

2567

2567

`bool SeenEqual = false;

`

2568

2568

`bool MightBeFoldExpr = false;

`

2569

``

`-

const bool MightBeStmtExpr = Tokens->peekNextToken()->is(tok::l_brace);

`

2570

2569

`nextToken();

`

``

2570

`+

const bool MightBeStmtExpr = FormatTok->is(tok::l_brace);

`

2571

2571

`do {

`

2572

2572

`switch (FormatTok->Tok.getKind()) {

`

2573

2573

`case tok::l_paren:

`

`@@ -2577,44 +2577,60 @@ bool UnwrappedLineParser::parseParens(TokenType AmpAmpTokenType) {

`

2577

2577

`parseChildBlock();

`

2578

2578

`break;

`

2579

2579

`case tok::r_paren: {

`

2580

``

`-

auto *Prev = LeftParen->Previous;

`

2581

``

`-

if (!MightBeStmtExpr && !MightBeFoldExpr && !Line->InMacroBody &&

`

2582

``

`-

Style.RemoveParentheses > FormatStyle::RPS_Leave) {

`

2583

``

`-

const auto *Next = Tokens->peekNextToken();

`

2584

``

`-

const bool DoubleParens =

`

2585

``

`-

Prev && Prev->is(tok::l_paren) && Next && Next->is(tok::r_paren);

`

2586

``

`-

const bool CommaSeparated =

`

2587

``

`-

!DoubleParens && Prev && Prev->isOneOf(tok::l_paren, tok::comma) &&

`

2588

``

`-

Next && Next->isOneOf(tok::comma, tok::r_paren);

`

2589

``

`-

const auto *PrevPrev = Prev ? Prev->getPreviousNonComment() : nullptr;

`

2590

``

`-

const bool Excluded =

`

2591

``

`-

PrevPrev &&

`

2592

``

`-

(PrevPrev->isOneOf(tok::kw___attribute, tok::kw_decltype) ||

`

2593

``

`-

SeenComma ||

`

2594

``

`-

(SeenEqual &&

`

2595

``

`-

(PrevPrev->isOneOf(tok::kw_if, tok::kw_while) ||

`

2596

``

`-

PrevPrev->endsSequence(tok::kw_constexpr, tok::kw_if))));

`

2597

``

`-

const bool ReturnParens =

`

2598

``

`-

Style.RemoveParentheses == FormatStyle::RPS_ReturnStatement &&

`

2599

``

`-

((NestedLambdas.empty() && !IsDecltypeAutoFunction) ||

`

2600

``

`-

(!NestedLambdas.empty() && !NestedLambdas.back())) &&

`

2601

``

`-

Prev && Prev->isOneOf(tok::kw_return, tok::kw_co_return) && Next &&

`

2602

``

`-

Next->is(tok::semi);

`

2603

``

`-

if ((DoubleParens && !Excluded) || (CommaSeparated && !SeenComma) ||

`

2604

``

`-

ReturnParens) {

`

2605

``

`-

LeftParen->Optional = true;

`

2606

``

`-

FormatTok->Optional = true;

`

2607

``

`-

}

`

2608

``

`-

}

`

``

2580

`+

auto *Prev = LParen->Previous;

`

``

2581

`+

auto *RParen = FormatTok;

`

``

2582

`+

nextToken();

`

2609

2583

`if (Prev) {

`

``

2584

`+

auto OptionalParens = [&] {

`

``

2585

`+

if (MightBeStmtExpr || MightBeFoldExpr || Line->InMacroBody ||

`

``

2586

`+

SeenComma || Style.RemoveParentheses == FormatStyle::RPS_Leave) {

`

``

2587

`+

return false;

`

``

2588

`+

}

`

``

2589

`+

const bool DoubleParens =

`

``

2590

`+

Prev->is(tok::l_paren) && FormatTok->is(tok::r_paren);

`

``

2591

`+

if (DoubleParens) {

`

``

2592

`+

const auto *PrevPrev = Prev->getPreviousNonComment();

`

``

2593

`+

const bool Excluded =

`

``

2594

`+

PrevPrev &&

`

``

2595

`+

(PrevPrev->isOneOf(tok::kw___attribute, tok::kw_decltype) ||

`

``

2596

`+

(SeenEqual &&

`

``

2597

`+

(PrevPrev->isOneOf(tok::kw_if, tok::kw_while) ||

`

``

2598

`+

PrevPrev->endsSequence(tok::kw_constexpr, tok::kw_if))));

`

``

2599

`+

if (!Excluded)

`

``

2600

`+

return true;

`

``

2601

`+

} else {

`

``

2602

`+

const bool CommaSeparated =

`

``

2603

`+

Prev->isOneOf(tok::l_paren, tok::comma) &&

`

``

2604

`+

FormatTok->isOneOf(tok::comma, tok::r_paren);

`

``

2605

`+

if (CommaSeparated &&

`

``

2606

`+

// LParen is not preceded by ellipsis, comma.

`

``

2607

`+

!Prev->endsSequence(tok::comma, tok::ellipsis) &&

`

``

2608

`+

// RParen is not followed by comma, ellipsis.

`

``

2609

`+

!(FormatTok->is(tok::comma) &&

`

``

2610

`+

Tokens->peekNextToken()->is(tok::ellipsis))) {

`

``

2611

`+

return true;

`

``

2612

`+

}

`

``

2613

`+

const bool ReturnParens =

`

``

2614

`+

Style.RemoveParentheses == FormatStyle::RPS_ReturnStatement &&

`

``

2615

`+

((NestedLambdas.empty() && !IsDecltypeAutoFunction) ||

`

``

2616

`+

(!NestedLambdas.empty() && !NestedLambdas.back())) &&

`

``

2617

`+

Prev->isOneOf(tok::kw_return, tok::kw_co_return) &&

`

``

2618

`+

FormatTok->is(tok::semi);

`

``

2619

`+

if (ReturnParens)

`

``

2620

`+

return true;

`

``

2621

`+

}

`

``

2622

`+

return false;

`

``

2623

`+

};

`

2610

2624

`if (Prev->is(TT_TypenameMacro)) {

`

2611

``

`-

LeftParen->setFinalizedType(TT_TypeDeclarationParen);

`

2612

``

`-

FormatTok->setFinalizedType(TT_TypeDeclarationParen);

`

2613

``

`-

} else if (Prev->is(tok::greater) && FormatTok->Previous == LeftParen) {

`

``

2625

`+

LParen->setFinalizedType(TT_TypeDeclarationParen);

`

``

2626

`+

RParen->setFinalizedType(TT_TypeDeclarationParen);

`

``

2627

`+

} else if (Prev->is(tok::greater) && RParen->Previous == LParen) {

`

2614

2628

` Prev->setFinalizedType(TT_TemplateCloser);

`

``

2629

`+

} else if (OptionalParens()) {

`

``

2630

`+

LParen->Optional = true;

`

``

2631

`+

RParen->Optional = true;

`

2615

2632

` }

`

2616

2633

` }

`

2617

``

`-

nextToken();

`

2618

2634

`return SeenEqual;

`

2619

2635

` }

`

2620

2636

`case tok::r_brace:

`