Skip to content

Commit 749876e

Browse files
authored
[clang-format[NFC] Clean up AnnotatingParser::rParenEndsCast() (#96128)
1 parent 1fafa32 commit 749876e

File tree

1 file changed

+46
-37
lines changed

1 file changed

+46
-37
lines changed

clang/lib/Format/TokenAnnotator.cpp

Lines changed: 46 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -2661,18 +2661,27 @@ class AnnotatingParser {
26612661

26622662
/// Determine whether ')' is ending a cast.
26632663
bool rParenEndsCast(const FormatToken &Tok) {
2664+
assert(Tok.is(tok::r_paren));
2665+
2666+
if (!Tok.MatchingParen || !Tok.Previous)
2667+
return false;
2668+
26642669
// C-style casts are only used in C++, C# and Java.
2665-
if (!Style.isCSharp() && !IsCpp && Style.Language != FormatStyle::LK_Java)
2670+
if (!IsCpp && !Style.isCSharp() && Style.Language != FormatStyle::LK_Java)
26662671
return false;
26672672

2673+
const auto *LParen = Tok.MatchingParen;
2674+
const auto *BeforeRParen = Tok.Previous;
2675+
const auto *AfterRParen = Tok.Next;
2676+
26682677
// Empty parens aren't casts and there are no casts at the end of the line.
2669-
if (Tok.Previous == Tok.MatchingParen || !Tok.Next || !Tok.MatchingParen)
2678+
if (BeforeRParen == LParen || !AfterRParen)
26702679
return false;
26712680

2672-
if (Tok.MatchingParen->is(TT_OverloadedOperatorLParen))
2681+
if (LParen->is(TT_OverloadedOperatorLParen))
26732682
return false;
26742683

2675-
FormatToken *LeftOfParens = Tok.MatchingParen->getPreviousNonComment();
2684+
auto *LeftOfParens = LParen->getPreviousNonComment();
26762685
if (LeftOfParens) {
26772686
// If there is a closing parenthesis left of the current
26782687
// parentheses, look past it as these might be chained casts.
@@ -2728,37 +2737,38 @@ class AnnotatingParser {
27282737
}
27292738
}
27302739

2731-
if (Tok.Next->is(tok::question) ||
2732-
(Tok.Next->is(tok::ampamp) && !Tok.Previous->isTypeName(LangOpts))) {
2740+
if (AfterRParen->is(tok::question) ||
2741+
(AfterRParen->is(tok::ampamp) && !BeforeRParen->isTypeName(LangOpts))) {
27332742
return false;
27342743
}
27352744

27362745
// `foreach((A a, B b) in someList)` should not be seen as a cast.
2737-
if (Tok.Next->is(Keywords.kw_in) && Style.isCSharp())
2746+
if (AfterRParen->is(Keywords.kw_in) && Style.isCSharp())
27382747
return false;
27392748

27402749
// Functions which end with decorations like volatile, noexcept are unlikely
27412750
// to be casts.
2742-
if (Tok.Next->isOneOf(tok::kw_noexcept, tok::kw_volatile, tok::kw_const,
2743-
tok::kw_requires, tok::kw_throw, tok::arrow,
2744-
Keywords.kw_override, Keywords.kw_final) ||
2745-
isCppAttribute(IsCpp, *Tok.Next)) {
2751+
if (AfterRParen->isOneOf(tok::kw_noexcept, tok::kw_volatile, tok::kw_const,
2752+
tok::kw_requires, tok::kw_throw, tok::arrow,
2753+
Keywords.kw_override, Keywords.kw_final) ||
2754+
isCppAttribute(IsCpp, *AfterRParen)) {
27462755
return false;
27472756
}
27482757

27492758
// As Java has no function types, a "(" after the ")" likely means that this
27502759
// is a cast.
2751-
if (Style.Language == FormatStyle::LK_Java && Tok.Next->is(tok::l_paren))
2760+
if (Style.Language == FormatStyle::LK_Java && AfterRParen->is(tok::l_paren))
27522761
return true;
27532762

27542763
// If a (non-string) literal follows, this is likely a cast.
2755-
if (Tok.Next->isOneOf(tok::kw_sizeof, tok::kw_alignof) ||
2756-
(Tok.Next->Tok.isLiteral() && Tok.Next->isNot(tok::string_literal))) {
2764+
if (AfterRParen->isOneOf(tok::kw_sizeof, tok::kw_alignof) ||
2765+
(AfterRParen->Tok.isLiteral() &&
2766+
AfterRParen->isNot(tok::string_literal))) {
27572767
return true;
27582768
}
27592769

27602770
// Heuristically try to determine whether the parentheses contain a type.
2761-
auto IsQualifiedPointerOrReference = [](FormatToken *T,
2771+
auto IsQualifiedPointerOrReference = [](const FormatToken *T,
27622772
const LangOptions &LangOpts) {
27632773
// This is used to handle cases such as x = (foo *const)&y;
27642774
assert(!T->isTypeName(LangOpts) && "Should have already been checked");
@@ -2791,12 +2801,11 @@ class AnnotatingParser {
27912801
return T && T->is(TT_PointerOrReference);
27922802
};
27932803
bool ParensAreType =
2794-
!Tok.Previous ||
2795-
Tok.Previous->isOneOf(TT_TemplateCloser, TT_TypeDeclarationParen) ||
2796-
Tok.Previous->isTypeName(LangOpts) ||
2797-
IsQualifiedPointerOrReference(Tok.Previous, LangOpts);
2804+
BeforeRParen->isOneOf(TT_TemplateCloser, TT_TypeDeclarationParen) ||
2805+
BeforeRParen->isTypeName(LangOpts) ||
2806+
IsQualifiedPointerOrReference(BeforeRParen, LangOpts);
27982807
bool ParensCouldEndDecl =
2799-
Tok.Next->isOneOf(tok::equal, tok::semi, tok::l_brace, tok::greater);
2808+
AfterRParen->isOneOf(tok::equal, tok::semi, tok::l_brace, tok::greater);
28002809
if (ParensAreType && !ParensCouldEndDecl)
28012810
return true;
28022811

@@ -2808,49 +2817,49 @@ class AnnotatingParser {
28082817

28092818
// Certain token types inside the parentheses mean that this can't be a
28102819
// cast.
2811-
for (const FormatToken *Token = Tok.MatchingParen->Next; Token != &Tok;
2812-
Token = Token->Next) {
2820+
for (const auto *Token = LParen->Next; Token != &Tok; Token = Token->Next)
28132821
if (Token->is(TT_BinaryOperator))
28142822
return false;
2815-
}
28162823

28172824
// If the following token is an identifier or 'this', this is a cast. All
28182825
// cases where this can be something else are handled above.
2819-
if (Tok.Next->isOneOf(tok::identifier, tok::kw_this))
2826+
if (AfterRParen->isOneOf(tok::identifier, tok::kw_this))
28202827
return true;
28212828

28222829
// Look for a cast `( x ) (`.
2823-
if (Tok.Next->is(tok::l_paren) && Tok.Previous && Tok.Previous->Previous) {
2824-
if (Tok.Previous->is(tok::identifier) &&
2825-
Tok.Previous->Previous->is(tok::l_paren)) {
2830+
if (AfterRParen->is(tok::l_paren) && BeforeRParen->Previous) {
2831+
if (BeforeRParen->is(tok::identifier) &&
2832+
BeforeRParen->Previous->is(tok::l_paren)) {
28262833
return true;
28272834
}
28282835
}
28292836

2830-
if (!Tok.Next->Next)
2837+
if (!AfterRParen->Next)
28312838
return false;
28322839

28332840
// If the next token after the parenthesis is a unary operator, assume
28342841
// that this is cast, unless there are unexpected tokens inside the
28352842
// parenthesis.
2836-
const bool NextIsAmpOrStar = Tok.Next->isOneOf(tok::amp, tok::star);
2837-
if (!(Tok.Next->isUnaryOperator() || NextIsAmpOrStar) ||
2838-
Tok.Next->is(tok::plus) ||
2839-
!Tok.Next->Next->isOneOf(tok::identifier, tok::numeric_constant)) {
2843+
const bool NextIsAmpOrStar = AfterRParen->isOneOf(tok::amp, tok::star);
2844+
if (!(AfterRParen->isUnaryOperator() || NextIsAmpOrStar) ||
2845+
AfterRParen->is(tok::plus) ||
2846+
!AfterRParen->Next->isOneOf(tok::identifier, tok::numeric_constant)) {
28402847
return false;
28412848
}
2849+
28422850
if (NextIsAmpOrStar &&
2843-
(Tok.Next->Next->is(tok::numeric_constant) || Line.InPPDirective)) {
2851+
(AfterRParen->Next->is(tok::numeric_constant) || Line.InPPDirective)) {
28442852
return false;
28452853
}
2846-
if (Line.InPPDirective && Tok.Next->is(tok::minus))
2854+
2855+
if (Line.InPPDirective && AfterRParen->is(tok::minus))
28472856
return false;
2857+
28482858
// Search for unexpected tokens.
2849-
for (FormatToken *Prev = Tok.Previous; Prev != Tok.MatchingParen;
2850-
Prev = Prev->Previous) {
2859+
for (auto *Prev = BeforeRParen; Prev != LParen; Prev = Prev->Previous)
28512860
if (!Prev->isOneOf(tok::kw_const, tok::identifier, tok::coloncolon))
28522861
return false;
2853-
}
2862+
28542863
return true;
28552864
}
28562865

0 commit comments

Comments
 (0)