[clang] 6c7cf74 - Revert "[clang-format] Treat AttributeMacro more like __attribute__"
Owen Pan via cfe-commits
cfe-commits at lists.llvm.org
Sun Oct 15 15:53:05 PDT 2023
Author: Owen Pan
Date: 2023-10-15T15:52:17-07:00
New Revision: 6c7cf74a75572c3cc5d9979f02b67a7357e9c656
URL: https://github.com/llvm/llvm-project/commit/6c7cf74a75572c3cc5d9979f02b67a7357e9c656
DIFF: https://github.com/llvm/llvm-project/commit/6c7cf74a75572c3cc5d9979f02b67a7357e9c656.diff
LOG: Revert "[clang-format] Treat AttributeMacro more like __attribute__"
This reverts commit 6f46bcc609f14121e6942763ba9871f98541ea0e.
Added:
Modified:
clang/lib/Format/ContinuationIndenter.cpp
clang/lib/Format/TokenAnnotator.cpp
clang/unittests/Format/FormatTestObjC.cpp
clang/unittests/Format/TokenAnnotatorTest.cpp
Removed:
################################################################################
diff --git a/clang/lib/Format/ContinuationIndenter.cpp b/clang/lib/Format/ContinuationIndenter.cpp
index 928c30364bfcf61..91ce825224d7f70 100644
--- a/clang/lib/Format/ContinuationIndenter.cpp
+++ b/clang/lib/Format/ContinuationIndenter.cpp
@@ -1336,9 +1336,8 @@ unsigned ContinuationIndenter::getNewLineColumn(const LineState &State) {
(PreviousNonComment->ClosesTemplateDeclaration ||
PreviousNonComment->ClosesRequiresClause ||
PreviousNonComment->isOneOf(
- TT_AttributeRParen, TT_AttributeMacro, TT_AttributeSquare,
- TT_FunctionAnnotationRParen, TT_JavaAnnotation,
- TT_LeadingJavaAnnotation))) ||
+ TT_AttributeRParen, TT_AttributeSquare, TT_FunctionAnnotationRParen,
+ TT_JavaAnnotation, TT_LeadingJavaAnnotation))) ||
(!Style.IndentWrappedFunctionNames &&
NextNonComment->isOneOf(tok::kw_operator, TT_FunctionDeclarationName))) {
return std::max(CurrentState.LastSpace, CurrentState.Indent);
diff --git a/clang/lib/Format/TokenAnnotator.cpp b/clang/lib/Format/TokenAnnotator.cpp
index 0c642594053fa39..543c119620bf28f 100644
--- a/clang/lib/Format/TokenAnnotator.cpp
+++ b/clang/lib/Format/TokenAnnotator.cpp
@@ -4709,9 +4709,7 @@ bool TokenAnnotator::spaceRequiredBefore(const AnnotatedLine &Line,
if (Line.Type == LT_ObjCMethodDecl) {
if (Left.is(TT_ObjCMethodSpecifier))
return true;
- // Apply this logic for parens that are not function attribute macros.
- if (Left.is(tok::r_paren) && Left.isNot(TT_AttributeRParen) &&
- canBeObjCSelectorComponent(Right)) {
+ if (Left.is(tok::r_paren) && canBeObjCSelectorComponent(Right)) {
// Don't space between ')' and <id> or ')' and 'new'. 'new' is not a
// keyword in Objective-C, and '+ (instancetype)new;' is a standard class
// method declaration.
@@ -5224,10 +5222,8 @@ bool TokenAnnotator::mustBreakBefore(const AnnotatedLine &Line,
}
// Ensure wrapping after __attribute__((XX)) and @interface etc.
- if (Left.isOneOf(TT_AttributeRParen, TT_AttributeMacro) &&
- Right.is(TT_ObjCDecl)) {
+ if (Left.is(TT_AttributeRParen) && Right.is(TT_ObjCDecl))
return true;
- }
if (Left.is(TT_LambdaLBrace)) {
if (IsFunctionArgument(Left) &&
diff --git a/clang/unittests/Format/FormatTestObjC.cpp b/clang/unittests/Format/FormatTestObjC.cpp
index 84a3d240055ff68..a9e5434dfabfbba 100644
--- a/clang/unittests/Format/FormatTestObjC.cpp
+++ b/clang/unittests/Format/FormatTestObjC.cpp
@@ -1527,10 +1527,7 @@ TEST_F(FormatTestObjC, IfNotUnlikely) {
" [obj func:arg2];");
}
-TEST_F(FormatTestObjC, AttributesOnObjCDecl) {
- Style.AttributeMacros.push_back("ATTRIBUTE_MACRO");
-
- // Check '__attribute__' macro directly.
+TEST_F(FormatTestObjC, Attributes) {
verifyFormat("__attribute__((objc_subclassing_restricted))\n"
"@interface Foo\n"
"@end");
@@ -1540,215 +1537,6 @@ TEST_F(FormatTestObjC, AttributesOnObjCDecl) {
verifyFormat("__attribute__((objc_subclassing_restricted))\n"
"@implementation Foo\n"
"@end");
-
- // Check AttributeMacro gets treated the same, with or without parentheses.
- verifyFormat("ATTRIBUTE_MACRO\n"
- "@interface Foo\n"
- "@end");
- verifyFormat("ATTRIBUTE_MACRO(X)\n"
- "@interface Foo\n"
- "@end");
-
- // Indenter also needs to understand multiple attribute macros.
- // Try each of the three kinds paired with each of the other kind.
-
- // Column limit, but no reflow.
- verifyFormat("ATTRIBUTE_MACRO(X) ATTRIBUTE_MACRO\n"
- "@interface Foo\n"
- "@end");
- verifyFormat("ATTRIBUTE_MACRO ATTRIBUTE_MACRO(X)\n"
- "@interface Foo\n"
- "@end");
- verifyFormat("__attribute__((X)) ATTRIBUTE_MACRO\n"
- "@interface Foo\n"
- "@end");
- verifyFormat("ATTRIBUTE_MACRO __attribute__((X))\n"
- "@interface Foo\n"
- "@end");
- verifyFormat("__attribute__((X)) ATTRIBUTE_MACRO(X)\n"
- "@interface Foo\n"
- "@end");
- verifyFormat("ATTRIBUTE_MACRO(X) __attribute__((X))\n"
- "@interface Foo\n"
- "@end");
-
- // Column limit that requires reflow.
- Style.ColumnLimit = 30;
- verifyFormat("ATTRIBUTE_MACRO(X)\n"
- "ATTRIBUTE_MACRO\n"
- "@interface Foo\n"
- "@end");
- verifyFormat("ATTRIBUTE_MACRO\n"
- "ATTRIBUTE_MACRO(X)\n"
- "@interface Foo\n"
- "@end");
- verifyFormat("__attribute__((X))\n"
- "ATTRIBUTE_MACRO\n"
- "@interface Foo\n"
- "@end");
- verifyFormat("ATTRIBUTE_MACRO\n"
- "__attribute__((X))\n"
- "@interface Foo\n"
- "@end");
- verifyFormat("__attribute__((X))\n"
- "ATTRIBUTE_MACRO(X)\n"
- "@interface Foo\n"
- "@end");
- verifyFormat("ATTRIBUTE_MACRO(X)\n"
- "__attribute__((X))\n"
- "@interface Foo\n"
- "@end");
-
- // No column limit
- Style.ColumnLimit = 0;
- verifyFormat("ATTRIBUTE_MACRO(X) ATTRIBUTE_MACRO\n"
- "@interface Foo\n"
- "@end");
- verifyFormat("ATTRIBUTE_MACRO ATTRIBUTE_MACRO(X)\n"
- "@interface Foo\n"
- "@end");
- verifyFormat("__attribute__((X)) ATTRIBUTE_MACRO\n"
- "@interface Foo\n"
- "@end");
- verifyFormat("ATTRIBUTE_MACRO __attribute__((X))\n"
- "@interface Foo\n"
- "@end");
- verifyFormat("__attribute__((X)) ATTRIBUTE_MACRO(X)\n"
- "@interface Foo\n"
- "@end");
- verifyFormat("ATTRIBUTE_MACRO(X) __attribute__((X))\n"
- "@interface Foo\n"
- "@end");
-}
-
-TEST_F(FormatTestObjC, AttributesOnObjCMethodDecl) {
- Style.AttributeMacros.push_back("ATTRIBUTE_MACRO");
-
- // Check '__attribute__' macro directly.
- verifyFormat("- (id)init __attribute__((objc_designated_initializer));");
-
- // Check AttributeMacro gets treated the same, with or without parentheses.
- verifyFormat("- (id)init ATTRIBUTE_MACRO;");
- verifyFormat("- (id)init ATTRIBUTE_MACRO(X);");
-
- // Indenter also needs to understand multiple attribute macros.
-
- // Column limit (default), but no reflow.
- verifyFormat("- (id)init ATTRIBUTE_MACRO(X) ATTRIBUTE_MACRO;");
- verifyFormat("- (id)init ATTRIBUTE_MACRO ATTRIBUTE_MACRO(X);");
- verifyFormat("- (id)init __attribute__((X)) ATTRIBUTE_MACRO;");
- verifyFormat("- (id)init ATTRIBUTE_MACRO __attribute__((X));");
- verifyFormat("- (id)init __attribute__((X)) ATTRIBUTE_MACRO(X);");
- verifyFormat("- (id)init ATTRIBUTE_MACRO(X) __attribute__((X));");
-
- // Column limit that requires reflow.
- Style.ColumnLimit = 30;
-
- // Reflow after method name.
- verifyFormat("- (id)initWithReallyLongName\n"
- " __attribute__((X))\n"
- " ATTRIBUTE_MACRO;");
- verifyFormat("- (id)initWithReallyLongName\n"
- " ATTRIBUTE_MACRO(X)\n"
- " ATTRIBUTE_MACRO;");
- verifyFormat("- (id)initWithReallyLongName\n"
- " ATTRIBUTE_MACRO\n"
- " ATTRIBUTE_MACRO;");
- // Reflow after first macro.
- // FIXME: these should indent but don't.
-#if 0
- verifyFormat("- (id)init ATTRIBUTE_MACRO(X)\n"
- " ATTRIBUTE_MACRO;");
- verifyFormat("- (id)init ATTRIBUTE_MACRO\n"
- " ATTRIBUTE_MACRO(X);");
- verifyFormat("- (id)init __attribute__((X))\n"
- " ATTRIBUTE_MACRO;");
- verifyFormat("- (id)init ATTRIBUTE_MACRO\n"
- " __attribute__((X));");
- verifyFormat("- (id)init __attribute__((X))\n"
- " ATTRIBUTE_MACRO(X);");
- verifyFormat("- (id)init ATTRIBUTE_MACRO(X)\n"
- " __attribute__((X));");
-#endif
-
- // No column limit.
- Style.ColumnLimit = 0;
- verifyFormat("- (id)init ATTRIBUTE_MACRO(X) ATTRIBUTE_MACRO;");
- verifyFormat("- (id)init ATTRIBUTE_MACRO ATTRIBUTE_MACRO(X);");
- verifyFormat("- (id)init __attribute__((X)) ATTRIBUTE_MACRO;");
- verifyFormat("- (id)init ATTRIBUTE_MACRO __attribute__((X));");
- verifyFormat("- (id)init __attribute__((X)) ATTRIBUTE_MACRO(X);");
- verifyFormat("- (id)init ATTRIBUTE_MACRO(X) __attribute__((X));");
-}
-
-TEST_F(FormatTestObjC, AttributesOnObjCProperty) {
- Style.AttributeMacros.push_back("ATTRIBUTE_MACRO");
-
- // Check '__attribute__' macro directly.
- verifyFormat("@property(weak) id delegate "
- "__attribute__((objc_designated_initializer));");
-
- // Check AttributeMacro gets treated the same, with or without parentheses.
- verifyFormat("@property(weak) id delegate ATTRIBUTE_MACRO;");
- verifyFormat("@property(weak) id delegate ATTRIBUTE_MACRO(X);");
-
- // Indenter also needs to understand multiple attribute macros.
-
- // Column limit (default), but no reflow.
- verifyFormat(
- "@property(weak) id delegate ATTRIBUTE_MACRO(X) ATTRIBUTE_MACRO;");
- verifyFormat(
- "@property(weak) id delegate ATTRIBUTE_MACRO ATTRIBUTE_MACRO(X);");
- verifyFormat(
- "@property(weak) id delegate __attribute__((X)) ATTRIBUTE_MACRO;");
- verifyFormat(
- "@property(weak) id delegate ATTRIBUTE_MACRO __attribute__((X));");
- verifyFormat(
- "@property(weak) id delegate __attribute__((X)) ATTRIBUTE_MACRO(X);");
- verifyFormat(
- "@property(weak) id delegate ATTRIBUTE_MACRO(X) __attribute__((X));");
-
- // Column limit that requires reflow.
- Style.ColumnLimit = 50;
-
- // Reflow after method name.
- verifyFormat("@property(weak) id delegateWithLongName\n"
- " __attribute__((X)) ATTRIBUTE_MACRO;");
- verifyFormat("@property(weak) id delegateWithLongName\n"
- " ATTRIBUTE_MACRO(X) ATTRIBUTE_MACRO;");
- verifyFormat("@property(weak) id delegateWithLongName\n"
- " ATTRIBUTE_MACRO ATTRIBUTE_MACRO;");
- // Reflow after first macro.
- // FIXME: these should indent but don't.
-#if 0
- verifyFormat("@property(weak) id delegate ATTRIBUTE_MACRO(X)\n"
- " ATTRIBUTE_MACRO;");
- verifyFormat("@property(weak) id delegate ATTRIBUTE_MACRO\n"
- " ATTRIBUTE_MACRO(X);");
- verifyFormat("@property(weak) id delegate __attribute__((X))\n"
- " ATTRIBUTE_MACRO;");
- verifyFormat("@property(weak) id delegate ATTRIBUTE_MACRO\n"
- " __attribute__((X));");
- verifyFormat("@property(weak) id delegate __attribute__((X))\n"
- " ATTRIBUTE_MACRO(X);");
- verifyFormat("@property(weak) id delegate ATTRIBUTE_MACRO(X)\n"
- " __attribute__((X));");
-#endif
-
- // No column limit.
- Style.ColumnLimit = 0;
- verifyFormat(
- "@property(weak) id delegate ATTRIBUTE_MACRO(X) ATTRIBUTE_MACRO;");
- verifyFormat(
- "@property(weak) id delegate ATTRIBUTE_MACRO ATTRIBUTE_MACRO(X);");
- verifyFormat(
- "@property(weak) id delegate __attribute__((X)) ATTRIBUTE_MACRO;");
- verifyFormat(
- "@property(weak) id delegate ATTRIBUTE_MACRO __attribute__((X));");
- verifyFormat(
- "@property(weak) id delegate __attribute__((X)) ATTRIBUTE_MACRO(X);");
- verifyFormat(
- "@property(weak) id delegate ATTRIBUTE_MACRO(X) __attribute__((X));");
}
} // end namespace
diff --git a/clang/unittests/Format/TokenAnnotatorTest.cpp b/clang/unittests/Format/TokenAnnotatorTest.cpp
index e5cc3ed3686b3d3..b6d4cf166de0281 100644
--- a/clang/unittests/Format/TokenAnnotatorTest.cpp
+++ b/clang/unittests/Format/TokenAnnotatorTest.cpp
@@ -1795,116 +1795,6 @@ TEST_F(TokenAnnotatorTest, UnderstandsTrailingReturnArrow) {
EXPECT_TOKEN(Tokens[13], tok::arrow, TT_Unknown);
}
-TEST_F(TokenAnnotatorTest, UnderstandsAttributeMacros) {
- // '__attribute__' has special handling.
- auto Tokens = annotate("__attribute__(X) void Foo(void);");
- ASSERT_EQ(Tokens.size(), 11u) << Tokens;
- EXPECT_TOKEN(Tokens[0], tok::kw___attribute, TT_Unknown);
- EXPECT_TOKEN(Tokens[1], tok::l_paren, TT_AttributeLParen);
- EXPECT_TOKEN(Tokens[3], tok::r_paren, TT_AttributeRParen);
-
- // Generic macro has no special handling in this location.
- Tokens = annotate("A(X) void Foo(void);");
- ASSERT_EQ(Tokens.size(), 11u) << Tokens;
- EXPECT_TOKEN(Tokens[0], tok::identifier, TT_Unknown);
- EXPECT_TOKEN(Tokens[1], tok::l_paren, TT_Unknown);
-
- // Add a custom AttributeMacro. Test that it has the same behavior.
- FormatStyle Style = getLLVMStyle();
- Style.AttributeMacros.push_back("A");
-
- // An "AttributeMacro" gets annotated like '__attribute__'.
- Tokens = annotate("A(X) void Foo(void);", Style);
- ASSERT_EQ(Tokens.size(), 11u) << Tokens;
- EXPECT_TOKEN(Tokens[0], tok::identifier, TT_AttributeMacro);
- EXPECT_TOKEN(Tokens[1], tok::l_paren, TT_AttributeLParen);
- EXPECT_TOKEN(Tokens[3], tok::r_paren, TT_AttributeRParen);
-}
-
-TEST_F(TokenAnnotatorTest, UnderstandsAttributeMacrosOnObjCDecl) {
- // '__attribute__' has special handling.
- auto Tokens = annotate("__attribute__(X) @interface Foo");
- ASSERT_EQ(Tokens.size(), 8u) << Tokens;
- EXPECT_TOKEN(Tokens[0], tok::kw___attribute, TT_Unknown);
- EXPECT_TOKEN(Tokens[1], tok::l_paren, TT_AttributeLParen);
- EXPECT_TOKEN(Tokens[3], tok::r_paren, TT_AttributeRParen);
-
- // Generic macro has no special handling in this location.
- Tokens = annotate("A(X) @interface Foo");
- ASSERT_EQ(Tokens.size(), 8u) << Tokens;
- // Note: Don't check token-type as a random token in this position is hard to
- // reason about.
- EXPECT_TOKEN_KIND(Tokens[0], tok::identifier);
- EXPECT_TOKEN_KIND(Tokens[1], tok::l_paren);
-
- // Add a custom AttributeMacro. Test that it has the same behavior.
- FormatStyle Style = getLLVMStyle();
- Style.AttributeMacros.push_back("A");
-
- // An "AttributeMacro" gets annotated like '__attribute__'.
- Tokens = annotate("A(X) @interface Foo", Style);
- ASSERT_EQ(Tokens.size(), 8u) << Tokens;
- EXPECT_TOKEN(Tokens[0], tok::identifier, TT_AttributeMacro);
- EXPECT_TOKEN(Tokens[1], tok::l_paren, TT_AttributeLParen);
- EXPECT_TOKEN(Tokens[3], tok::r_paren, TT_AttributeRParen);
-}
-
-TEST_F(TokenAnnotatorTest, UnderstandsAttributeMacrosOnObjCMethodDecl) {
- // '__attribute__' has special handling.
- auto Tokens = annotate("- (id)init __attribute__(X);");
- ASSERT_EQ(Tokens.size(), 11u) << Tokens;
- EXPECT_TOKEN(Tokens[5], tok::kw___attribute, TT_Unknown);
- EXPECT_TOKEN(Tokens[6], tok::l_paren, TT_AttributeLParen);
- EXPECT_TOKEN(Tokens[8], tok::r_paren, TT_AttributeRParen);
-
- // Generic macro has no special handling in this location.
- Tokens = annotate("- (id)init A(X);");
- ASSERT_EQ(Tokens.size(), 11u) << Tokens;
- // Note: Don't check token-type as a random token in this position is hard to
- // reason about.
- EXPECT_TOKEN_KIND(Tokens[5], tok::identifier);
- EXPECT_TOKEN_KIND(Tokens[6], tok::l_paren);
-
- // Add a custom AttributeMacro. Test that it has the same behavior.
- FormatStyle Style = getLLVMStyle();
- Style.AttributeMacros.push_back("A");
-
- // An "AttributeMacro" gets annotated like '__attribute__'.
- Tokens = annotate("- (id)init A(X);", Style);
- ASSERT_EQ(Tokens.size(), 11u) << Tokens;
- EXPECT_TOKEN(Tokens[5], tok::identifier, TT_AttributeMacro);
- EXPECT_TOKEN(Tokens[6], tok::l_paren, TT_AttributeLParen);
- EXPECT_TOKEN(Tokens[8], tok::r_paren, TT_AttributeRParen);
-}
-
-TEST_F(TokenAnnotatorTest, UnderstandsAttributeMacrosOnObjCProperty) {
- // '__attribute__' has special handling.
- auto Tokens = annotate("@property(weak) id delegate __attribute__(X);");
- ASSERT_EQ(Tokens.size(), 13u) << Tokens;
- EXPECT_TOKEN(Tokens[7], tok::kw___attribute, TT_Unknown);
- EXPECT_TOKEN(Tokens[8], tok::l_paren, TT_AttributeLParen);
- EXPECT_TOKEN(Tokens[10], tok::r_paren, TT_AttributeRParen);
-
- // Generic macro has no special handling in this location.
- Tokens = annotate("@property(weak) id delegate A(X);");
- ASSERT_EQ(Tokens.size(), 13u) << Tokens;
- // Note: Don't check token-type as a random token in this position is hard to
- // reason about.
- EXPECT_TOKEN_KIND(Tokens[7], tok::identifier);
- EXPECT_TOKEN_KIND(Tokens[8], tok::l_paren);
-
- // Add a custom AttributeMacro. Test that it has the same behavior.
- FormatStyle Style = getLLVMStyle();
- Style.AttributeMacros.push_back("A");
-
- // An "AttributeMacro" gets annotated like '__attribute__'.
- Tokens = annotate("@property(weak) id delegate A(X);", Style);
- ASSERT_EQ(Tokens.size(), 13u) << Tokens;
- EXPECT_TOKEN(Tokens[7], tok::identifier, TT_AttributeMacro);
- EXPECT_TOKEN(Tokens[8], tok::l_paren, TT_AttributeLParen);
- EXPECT_TOKEN(Tokens[10], tok::r_paren, TT_AttributeRParen);
-}
-
TEST_F(TokenAnnotatorTest, UnderstandsVerilogOperators) {
auto Annotate = [this](llvm::StringRef Code) {
return annotate(Code, getLLVMStyle(FormatStyle::LK_Verilog));
More information about the cfe-commits
mailing list