[clang] [clang-format] Split TT_AttributeParen (PR #67396)
Owen Pan via cfe-commits
cfe-commits at lists.llvm.org
Mon Sep 25 23:36:16 PDT 2023
https://github.com/owenca updated https://github.com/llvm/llvm-project/pull/67396
>From 3ae647542b80edb47bb2e47e87118be6a1bdbdec Mon Sep 17 00:00:00 2001
From: Owen Pan <owenpiano at gmail.com>
Date: Mon, 25 Sep 2023 23:21:38 -0700
Subject: [PATCH] [clang-format] Split TT_AttributeParen
Replaced TT_AttributeParen with TT_AttributeLParen and TT_AttributeRParen.
---
clang/lib/Format/ContinuationIndenter.cpp | 2 +-
clang/lib/Format/FormatToken.h | 3 +-
clang/lib/Format/TokenAnnotator.cpp | 30 +++++++++++--------
clang/unittests/Format/TokenAnnotatorTest.cpp | 9 ++++++
4 files changed, 29 insertions(+), 15 deletions(-)
diff --git a/clang/lib/Format/ContinuationIndenter.cpp b/clang/lib/Format/ContinuationIndenter.cpp
index 68103c45b0b9463..bd7a2020589b88f 100644
--- a/clang/lib/Format/ContinuationIndenter.cpp
+++ b/clang/lib/Format/ContinuationIndenter.cpp
@@ -1336,7 +1336,7 @@ unsigned ContinuationIndenter::getNewLineColumn(const LineState &State) {
(PreviousNonComment->ClosesTemplateDeclaration ||
PreviousNonComment->ClosesRequiresClause ||
PreviousNonComment->isOneOf(
- TT_AttributeParen, TT_AttributeSquare, TT_FunctionAnnotationRParen,
+ TT_AttributeRParen, TT_AttributeSquare, TT_FunctionAnnotationRParen,
TT_JavaAnnotation, TT_LeadingJavaAnnotation))) ||
(!Style.IndentWrappedFunctionNames &&
NextNonComment->isOneOf(tok::kw_operator, TT_FunctionDeclarationName))) {
diff --git a/clang/lib/Format/FormatToken.h b/clang/lib/Format/FormatToken.h
index 0605ac9da7219f2..986849abd8f9206 100644
--- a/clang/lib/Format/FormatToken.h
+++ b/clang/lib/Format/FormatToken.h
@@ -30,8 +30,9 @@ namespace format {
TYPE(ArrayInitializerLSquare) \
TYPE(ArraySubscriptLSquare) \
TYPE(AttributeColon) \
+ TYPE(AttributeLParen) \
TYPE(AttributeMacro) \
- TYPE(AttributeParen) \
+ TYPE(AttributeRParen) \
TYPE(AttributeSquare) \
TYPE(BinaryOperator) \
TYPE(BitFieldColon) \
diff --git a/clang/lib/Format/TokenAnnotator.cpp b/clang/lib/Format/TokenAnnotator.cpp
index 5becb86c0f37081..6f9332b47f2c3d0 100644
--- a/clang/lib/Format/TokenAnnotator.cpp
+++ b/clang/lib/Format/TokenAnnotator.cpp
@@ -377,7 +377,7 @@ class AnnotatingParser {
// detected one yet.
if (PrevNonComment && OpeningParen.is(TT_Unknown)) {
if (PrevNonComment->is(tok::kw___attribute)) {
- OpeningParen.setType(TT_AttributeParen);
+ OpeningParen.setType(TT_AttributeLParen);
} else if (PrevNonComment->isOneOf(TT_TypenameMacro, tok::kw_decltype,
tok::kw_typeof,
#define TRANSFORM_TYPE_TRAIT_DEF(_, Trait) tok::kw___##Trait,
@@ -475,8 +475,8 @@ class AnnotatingParser {
}
}
- if (OpeningParen.is(TT_AttributeParen))
- CurrentToken->setType(TT_AttributeParen);
+ if (OpeningParen.is(TT_AttributeLParen))
+ CurrentToken->setType(TT_AttributeRParen);
if (OpeningParen.is(TT_TypeDeclarationParen))
CurrentToken->setType(TT_TypeDeclarationParen);
if (OpeningParen.Previous &&
@@ -2382,11 +2382,15 @@ class AnnotatingParser {
// Strip trailing qualifiers such as const or volatile when checking
// whether the parens could be a cast to a pointer/reference type.
while (T) {
- if (T->is(TT_AttributeParen)) {
+ if (T->is(TT_AttributeRParen)) {
// Handle `x = (foo *__attribute__((foo)))&v;`:
- if (T->MatchingParen && T->MatchingParen->Previous &&
- T->MatchingParen->Previous->is(tok::kw___attribute)) {
- T = T->MatchingParen->Previous->Previous;
+ assert(T->is(tok::r_paren));
+ assert(T->MatchingParen);
+ assert(T->MatchingParen->is(tok::l_paren));
+ assert(T->MatchingParen->is(TT_AttributeLParen));
+ if (const auto *Tok = T->MatchingParen->Previous;
+ Tok && Tok->is(tok::kw___attribute)) {
+ T = Tok->Previous;
continue;
}
} else if (T->is(TT_AttributeSquare)) {
@@ -3989,7 +3993,7 @@ bool TokenAnnotator::spaceRequiredBetween(const AnnotatedLine &Line,
// after pointer qualifiers.
if ((Style.SpaceAroundPointerQualifiers == FormatStyle::SAPQ_After ||
Style.SpaceAroundPointerQualifiers == FormatStyle::SAPQ_Both) &&
- (Left.is(TT_AttributeParen) ||
+ (Left.is(TT_AttributeRParen) ||
Left.canBePointerOrReferenceQualifier())) {
return true;
}
@@ -4182,7 +4186,7 @@ bool TokenAnnotator::spaceRequiredBetween(const AnnotatedLine &Line,
return Style.SpaceBeforeParensOptions.AfterRequiresInExpression ||
spaceRequiredBeforeParens(Right);
}
- if ((Left.is(tok::r_paren) && Left.is(TT_AttributeParen)) ||
+ if (Left.is(TT_AttributeRParen) ||
(Left.is(tok::r_square) && Left.is(TT_AttributeSquare))) {
return true;
}
@@ -4361,7 +4365,7 @@ bool TokenAnnotator::spaceRequiredBefore(const AnnotatedLine &Line,
return false;
}
// Space in __attribute__((attr)) ::type.
- if (Left.is(TT_AttributeParen) && Right.is(tok::coloncolon))
+ if (Left.is(TT_AttributeRParen) && Right.is(tok::coloncolon))
return true;
if (Left.is(tok::kw_operator))
@@ -5190,7 +5194,7 @@ bool TokenAnnotator::mustBreakBefore(const AnnotatedLine &Line,
}
// Ensure wrapping after __attribute__((XX)) and @interface etc.
- if (Left.is(TT_AttributeParen) && Right.is(TT_ObjCDecl))
+ if (Left.is(TT_AttributeRParen) && Right.is(TT_ObjCDecl))
return true;
if (Left.is(TT_LambdaLBrace)) {
@@ -5552,8 +5556,8 @@ bool TokenAnnotator::canBreakBefore(const AnnotatedLine &Line,
!Style.Cpp11BracedListStyle) {
return false;
}
- if (Left.is(tok::l_paren) &&
- Left.isOneOf(TT_AttributeParen, TT_TypeDeclarationParen)) {
+ if (Left.is(TT_AttributeLParen) ||
+ (Left.is(tok::l_paren) && Left.is(TT_TypeDeclarationParen))) {
return false;
}
if (Left.is(tok::l_paren) && Left.Previous &&
diff --git a/clang/unittests/Format/TokenAnnotatorTest.cpp b/clang/unittests/Format/TokenAnnotatorTest.cpp
index 22698f6faf3cb1e..ab53d2691aa9516 100644
--- a/clang/unittests/Format/TokenAnnotatorTest.cpp
+++ b/clang/unittests/Format/TokenAnnotatorTest.cpp
@@ -2065,6 +2065,15 @@ TEST_F(TokenAnnotatorTest, UnderstandsJavaScript) {
EXPECT_TOKEN(Tokens[11], tok::r_brace, TT_Unknown);
}
+TEST_F(TokenAnnotatorTest, UnderstandsAttributes) {
+ auto Tokens = annotate("bool foo __attribute__((unused));");
+ ASSERT_EQ(Tokens.size(), 10u) << Tokens;
+ EXPECT_TOKEN(Tokens[3], tok::l_paren, TT_AttributeLParen);
+ EXPECT_TOKEN(Tokens[4], tok::l_paren, TT_Unknown);
+ EXPECT_TOKEN(Tokens[6], tok::r_paren, TT_Unknown);
+ EXPECT_TOKEN(Tokens[7], tok::r_paren, TT_AttributeRParen);
+}
+
} // namespace
} // namespace format
} // namespace clang
More information about the cfe-commits
mailing list