[clang-format] Add 'friend' to QualifierOrder
authorMicah Weston <micahsweston@gmail.com>
Thu, 22 Dec 2022 09:54:04 +0000 (01:54 -0800)
committerOwen Pan <owenpiano@gmail.com>
Thu, 22 Dec 2022 10:02:09 +0000 (02:02 -0800)
For cases of defining friend functions, qualifier ordering can
allow multiple positions for the 'friend' token.

Closes #59450.

Differential Revision: https://reviews.llvm.org/D139801

clang/docs/ClangFormatStyleOptions.rst
clang/include/clang/Format/Format.h
clang/lib/Format/QualifierAlignmentFixer.cpp
clang/unittests/Format/QualifierFixerTest.cpp

index 969fce8..27e93ff 100644 (file)
@@ -3712,6 +3712,7 @@ the configuration (without a prefix: ``Auto``).
     * const
     * inline
     * static
+    * friend
     * constexpr
     * volatile
     * restrict
index b7fbe4b..8b11ae6 100644 (file)
@@ -2970,6 +2970,7 @@ struct FormatStyle {
   ///   * const
   ///   * inline
   ///   * static
+  ///   * friend
   ///   * constexpr
   ///   * volatile
   ///   * restrict
index 6ee0d6d..cef8b36 100644 (file)
@@ -414,6 +414,7 @@ tok::TokenKind LeftRightQualifierAlignmentFixer::getTokenFromQualifier(
       .Case("inline", tok::kw_inline)
       .Case("constexpr", tok::kw_constexpr)
       .Case("restrict", tok::kw_restrict)
+      .Case("friend", tok::kw_friend)
       .Default(tok::identifier);
 }
 
index b01aff5..875ad83 100755 (executable)
@@ -133,6 +133,8 @@ TEST_F(QualifierFixerTest, RotateTokens) {
             tok::kw_static);
   EXPECT_EQ(LeftRightQualifierAlignmentFixer::getTokenFromQualifier("restrict"),
             tok::kw_restrict);
+  EXPECT_EQ(LeftRightQualifierAlignmentFixer::getTokenFromQualifier("friend"),
+            tok::kw_friend);
 }
 
 TEST_F(QualifierFixerTest, FailQualifierInvalidConfiguration) {
@@ -196,8 +198,8 @@ TEST_F(QualifierFixerTest, QualifierRight) {
 TEST_F(QualifierFixerTest, QualifiersCustomOrder) {
   FormatStyle Style = getLLVMStyle();
   Style.QualifierAlignment = FormatStyle::QAS_Left;
-  Style.QualifierOrder = {"inline", "constexpr", "static",
-                          "const",  "volatile",  "type"};
+  Style.QualifierOrder = {"friend", "inline",   "constexpr", "static",
+                          "const",  "volatile", "type"};
 
   verifyFormat("const volatile int a;", "const volatile int a;", Style);
   verifyFormat("const volatile int a;", "volatile const int a;", Style);
@@ -216,6 +218,15 @@ TEST_F(QualifierFixerTest, QualifiersCustomOrder) {
   verifyFormat("constexpr static LPINT Bar;", "static constexpr LPINT Bar;",
                Style);
   verifyFormat("const const int a;", "const int const a;", Style);
+
+  verifyFormat(
+      "friend constexpr auto operator<=>(const foo &, const foo &) = default;",
+      "constexpr friend auto operator<=>(const foo &, const foo &) = default;",
+      Style);
+  verifyFormat(
+      "friend constexpr bool operator==(const foo &, const foo &) = default;",
+      "constexpr bool friend operator==(const foo &, const foo &) = default;",
+      Style);
 }
 
 TEST_F(QualifierFixerTest, LeftRightQualifier) {
@@ -723,9 +734,10 @@ TEST_F(QualifierFixerTest, IsQualifierType) {
   ConfiguredTokens.push_back(tok::kw_inline);
   ConfiguredTokens.push_back(tok::kw_restrict);
   ConfiguredTokens.push_back(tok::kw_constexpr);
+  ConfiguredTokens.push_back(tok::kw_friend);
 
-  auto Tokens =
-      annotate("const static inline auto restrict int double long constexpr");
+  auto Tokens = annotate(
+      "const static inline auto restrict int double long constexpr friend");
 
   EXPECT_TRUE(LeftRightQualifierAlignmentFixer::isQualifierOrType(
       Tokens[0], ConfiguredTokens));
@@ -745,6 +757,8 @@ TEST_F(QualifierFixerTest, IsQualifierType) {
       Tokens[7], ConfiguredTokens));
   EXPECT_TRUE(LeftRightQualifierAlignmentFixer::isQualifierOrType(
       Tokens[8], ConfiguredTokens));
+  EXPECT_TRUE(LeftRightQualifierAlignmentFixer::isQualifierOrType(
+      Tokens[9], ConfiguredTokens));
 
   auto NotTokens = annotate("for while do Foo Bar ");