This revision was landed with ongoing or failed builds.
This revision was automatically updated to reflect the committed changes.
Closed by commit rGb786a4aefeda: [clang-format] Extend SpaceBeforeParens for
requires (authored by HazardyKnusperkeks).
Changed prior to commit:
https://reviews.llvm.org/D113369?vs=406450&id=409013#toc
Repository:
rG LLVM Github Monorepo
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D113369/new/
https://reviews.llvm.org/D113369
Files:
clang/docs/ClangFormatStyleOptions.rst
clang/include/clang/Format/Format.h
clang/lib/Format/Format.cpp
clang/lib/Format/TokenAnnotator.cpp
clang/unittests/Format/FormatTest.cpp
Index: clang/unittests/Format/FormatTest.cpp
===================================================================
--- clang/unittests/Format/FormatTest.cpp
+++ clang/unittests/Format/FormatTest.cpp
@@ -15012,6 +15012,84 @@
verifyFormat("X A::operator++();", SpaceAfterOverloadedOperator);
verifyFormat("some_object.operator++();", SpaceAfterOverloadedOperator);
verifyFormat("auto func() -> int;", SpaceAfterOverloadedOperator);
+
+ auto SpaceAfterRequires = getLLVMStyle();
+ SpaceAfterRequires.SpaceBeforeParens = FormatStyle::SBPO_Custom;
+ EXPECT_FALSE(
+ SpaceAfterRequires.SpaceBeforeParensOptions.AfterRequiresInClause);
+ EXPECT_FALSE(
+ SpaceAfterRequires.SpaceBeforeParensOptions.AfterRequiresInExpression);
+ verifyFormat("void f(auto x)\n"
+ " requires requires(int i) { x + i; }\n"
+ "{}",
+ SpaceAfterRequires);
+ verifyFormat("void f(auto x)\n"
+ " requires(requires(int i) { x + i; })\n"
+ "{}",
+ SpaceAfterRequires);
+ verifyFormat("if (requires(int i) { x + i; })\n"
+ " return;",
+ SpaceAfterRequires);
+ verifyFormat("bool b = requires(int i) { x + i; };", SpaceAfterRequires);
+ verifyFormat("template <typename T>\n"
+ " requires(Foo<T>)\n"
+ "class Bar;",
+ SpaceAfterRequires);
+
+ SpaceAfterRequires.SpaceBeforeParensOptions.AfterRequiresInClause = true;
+ verifyFormat("void f(auto x)\n"
+ " requires requires(int i) { x + i; }\n"
+ "{}",
+ SpaceAfterRequires);
+ verifyFormat("void f(auto x)\n"
+ " requires (requires(int i) { x + i; })\n"
+ "{}",
+ SpaceAfterRequires);
+ verifyFormat("if (requires(int i) { x + i; })\n"
+ " return;",
+ SpaceAfterRequires);
+ verifyFormat("bool b = requires(int i) { x + i; };", SpaceAfterRequires);
+ verifyFormat("template <typename T>\n"
+ " requires (Foo<T>)\n"
+ "class Bar;",
+ SpaceAfterRequires);
+
+ SpaceAfterRequires.SpaceBeforeParensOptions.AfterRequiresInClause = false;
+ SpaceAfterRequires.SpaceBeforeParensOptions.AfterRequiresInExpression = true;
+ verifyFormat("void f(auto x)\n"
+ " requires requires (int i) { x + i; }\n"
+ "{}",
+ SpaceAfterRequires);
+ verifyFormat("void f(auto x)\n"
+ " requires(requires (int i) { x + i; })\n"
+ "{}",
+ SpaceAfterRequires);
+ verifyFormat("if (requires (int i) { x + i; })\n"
+ " return;",
+ SpaceAfterRequires);
+ verifyFormat("bool b = requires (int i) { x + i; };", SpaceAfterRequires);
+ verifyFormat("template <typename T>\n"
+ " requires(Foo<T>)\n"
+ "class Bar;",
+ SpaceAfterRequires);
+
+ SpaceAfterRequires.SpaceBeforeParensOptions.AfterRequiresInClause = true;
+ verifyFormat("void f(auto x)\n"
+ " requires requires (int i) { x + i; }\n"
+ "{}",
+ SpaceAfterRequires);
+ verifyFormat("void f(auto x)\n"
+ " requires (requires (int i) { x + i; })\n"
+ "{}",
+ SpaceAfterRequires);
+ verifyFormat("if (requires (int i) { x + i; })\n"
+ " return;",
+ SpaceAfterRequires);
+ verifyFormat("bool b = requires (int i) { x + i; };", SpaceAfterRequires);
+ verifyFormat("template <typename T>\n"
+ " requires (Foo<T>)\n"
+ "class Bar;",
+ SpaceAfterRequires);
}
TEST_F(FormatTest, SpaceAfterLogicalNot) {
Index: clang/lib/Format/TokenAnnotator.cpp
===================================================================
--- clang/lib/Format/TokenAnnotator.cpp
+++ clang/lib/Format/TokenAnnotator.cpp
@@ -3247,8 +3247,12 @@
if (Right.is(tok::l_paren)) {
if (Left.is(TT_TemplateCloser) && Right.isNot(TT_FunctionTypeLParen))
return spaceRequiredBeforeParens(Right);
- if (Left.is(tok::kw_requires))
- return spaceRequiredBeforeParens(Right);
+ if (Left.isOneOf(TT_RequiresClause, TT_RequiresClauseInARequiresExpression))
+ return Style.SpaceBeforeParensOptions.AfterRequiresInClause ||
+ spaceRequiredBeforeParens(Right);
+ if (Left.is(TT_RequiresExpression))
+ return Style.SpaceBeforeParensOptions.AfterRequiresInExpression ||
+ spaceRequiredBeforeParens(Right);
if ((Left.is(tok::r_paren) && Left.is(TT_AttributeParen)) ||
(Left.is(tok::r_square) && Left.is(TT_AttributeSquare)))
return true;
Index: clang/lib/Format/Format.cpp
===================================================================
--- clang/lib/Format/Format.cpp
+++ clang/lib/Format/Format.cpp
@@ -898,6 +898,9 @@
Spacing.AfterFunctionDeclarationName);
IO.mapOptional("AfterIfMacros", Spacing.AfterIfMacros);
IO.mapOptional("AfterOverloadedOperator", Spacing.AfterOverloadedOperator);
+ IO.mapOptional("AfterRequiresInClause", Spacing.AfterRequiresInClause);
+ IO.mapOptional("AfterRequiresInExpression",
+ Spacing.AfterRequiresInExpression);
IO.mapOptional("BeforeNonEmptyParentheses",
Spacing.BeforeNonEmptyParentheses);
}
@@ -1259,6 +1262,7 @@
LLVMStyle.SpaceBeforeCtorInitializerColon = true;
LLVMStyle.SpaceBeforeInheritanceColon = true;
LLVMStyle.SpaceBeforeParens = FormatStyle::SBPO_ControlStatements;
+ LLVMStyle.SpaceBeforeParensOptions = {};
LLVMStyle.SpaceBeforeParensOptions.AfterControlStatements = true;
LLVMStyle.SpaceBeforeParensOptions.AfterForeachMacros = true;
LLVMStyle.SpaceBeforeParensOptions.AfterIfMacros = true;
Index: clang/include/clang/Format/Format.h
===================================================================
--- clang/include/clang/Format/Format.h
+++ clang/include/clang/Format/Format.h
@@ -3594,6 +3594,25 @@
/// object.operator++ (10); object.operator++(10);
/// \endcode
bool AfterOverloadedOperator;
+ /// If ``true``, put space between requires keyword in a requires clause and
+ /// opening parentheses, if there is one.
+ /// \code
+ /// true: false:
+ /// template<typename T> vs. template<typename T>
+ /// requires (A<T> && B<T>) requires(A<T> && B<T>)
+ /// ... ...
+ /// \endcode
+ bool AfterRequiresInClause;
+ /// If ``true``, put space between requires keyword in a requires expression
+ /// and opening parentheses.
+ /// \code
+ /// true: false:
+ /// template<typename T> vs. template<typename T>
+ /// concept C = requires (T t) { concept C = requires(T t) {
+ /// ... ...
+ /// } }
+ /// \endcode
+ bool AfterRequiresInExpression;
/// If ``true``, put a space before opening parentheses only if the
/// parentheses are not empty.
/// \code
@@ -3607,7 +3626,8 @@
: AfterControlStatements(false), AfterForeachMacros(false),
AfterFunctionDeclarationName(false),
AfterFunctionDefinitionName(false), AfterIfMacros(false),
- AfterOverloadedOperator(false), BeforeNonEmptyParentheses(false) {}
+ AfterOverloadedOperator(false), AfterRequiresInClause(false),
+ AfterRequiresInExpression(false), BeforeNonEmptyParentheses(false) {}
bool operator==(const SpaceBeforeParensCustom &Other) const {
return AfterControlStatements == Other.AfterControlStatements &&
@@ -3617,6 +3637,8 @@
AfterFunctionDefinitionName == Other.AfterFunctionDefinitionName &&
AfterIfMacros == Other.AfterIfMacros &&
AfterOverloadedOperator == Other.AfterOverloadedOperator &&
+ AfterRequiresInClause == Other.AfterRequiresInClause &&
+ AfterRequiresInExpression == Other.AfterRequiresInExpression &&
BeforeNonEmptyParentheses == Other.BeforeNonEmptyParentheses;
}
};
Index: clang/docs/ClangFormatStyleOptions.rst
===================================================================
--- clang/docs/ClangFormatStyleOptions.rst
+++ clang/docs/ClangFormatStyleOptions.rst
@@ -4004,6 +4004,27 @@
void operator++ (int a); vs. void operator++(int a);
object.operator++ (10); object.operator++(10);
+ * ``bool AfterRequiresInClause`` If ``true``, put space between requires keyword in a requires clause and
+ opening parentheses, if there is one.
+
+ .. code-block:: c++
+
+ true: false:
+ template<typename T> vs. template<typename T>
+ requires (A<T> && B<T>) requires(A<T> && B<T>)
+ ... ...
+
+ * ``bool AfterRequiresInExpression`` If ``true``, put space between requires keyword in a requires expression
+ and opening parentheses.
+
+ .. code-block:: c++
+
+ true: false:
+ template<typename T> vs. template<typename T>
+ concept C = requires (T t) { concept C = requires(T t) {
+ ... ...
+ } }
+
* ``bool BeforeNonEmptyParentheses`` If ``true``, put a space before opening parentheses only if the
parentheses are not empty.
_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits