forked from OSchip/llvm-project
clang-format: introduce InlineOnly short function style
Summary: This is the same as Inline, except it does not imply all empty functions are merged: with this style, empty functions are merged only if they also match the 'inline' criteria (i.e. defined in a class). This is helpful to avoid inlining functions in implementations files. Reviewers: djasper, krasimir Reviewed By: djasper Subscribers: klimek, rengolin, cfe-commits Differential Revision: https://reviews.llvm.org/D34399 llvm-svn: 305912
This commit is contained in:
parent
d283dd4e06
commit
d3f0e3dee0
|
@ -184,9 +184,23 @@ struct FormatStyle {
|
|||
enum ShortFunctionStyle {
|
||||
/// \brief Never merge functions into a single line.
|
||||
SFS_None,
|
||||
/// \brief Only merge functions defined inside a class. Same as "inline",
|
||||
/// except it does not implies "empty": i.e. top level empty functions
|
||||
/// are not merged either.
|
||||
/// \code
|
||||
/// class Foo {
|
||||
/// void f() { foo(); }
|
||||
/// };
|
||||
/// void f() {
|
||||
/// foo();
|
||||
/// }
|
||||
/// void f() {
|
||||
/// }
|
||||
/// \endcode
|
||||
SFS_InlineOnly,
|
||||
/// \brief Only merge empty functions.
|
||||
/// \code
|
||||
/// void f() { bar(); }
|
||||
/// void f() {}
|
||||
/// void f2() {
|
||||
/// bar2();
|
||||
/// }
|
||||
|
@ -197,6 +211,10 @@ struct FormatStyle {
|
|||
/// class Foo {
|
||||
/// void f() { foo(); }
|
||||
/// };
|
||||
/// void f() {
|
||||
/// foo();
|
||||
/// }
|
||||
/// void f() {}
|
||||
/// \endcode
|
||||
SFS_Inline,
|
||||
/// \brief Merge all functions fitting on a single line.
|
||||
|
|
|
@ -97,6 +97,7 @@ template <> struct ScalarEnumerationTraits<FormatStyle::ShortFunctionStyle> {
|
|||
IO.enumCase(Value, "All", FormatStyle::SFS_All);
|
||||
IO.enumCase(Value, "true", FormatStyle::SFS_All);
|
||||
IO.enumCase(Value, "Inline", FormatStyle::SFS_Inline);
|
||||
IO.enumCase(Value, "InlineOnly", FormatStyle::SFS_InlineOnly);
|
||||
IO.enumCase(Value, "Empty", FormatStyle::SFS_Empty);
|
||||
}
|
||||
};
|
||||
|
|
|
@ -2480,8 +2480,8 @@ bool TokenAnnotator::mustBreakBefore(const AnnotatedLine &Line,
|
|||
return Style.AllowShortFunctionsOnASingleLine == FormatStyle::SFS_None ||
|
||||
Style.AllowShortFunctionsOnASingleLine == FormatStyle::SFS_Empty ||
|
||||
(Left.NestingLevel == 0 && Line.Level == 0 &&
|
||||
Style.AllowShortFunctionsOnASingleLine ==
|
||||
FormatStyle::SFS_Inline);
|
||||
Style.AllowShortFunctionsOnASingleLine &
|
||||
FormatStyle::SFS_InlineOnly);
|
||||
} else if (Style.Language == FormatStyle::LK_Java) {
|
||||
if (Right.is(tok::plus) && Left.is(tok::string_literal) && Right.Next &&
|
||||
Right.Next->is(tok::string_literal))
|
||||
|
|
|
@ -226,7 +226,7 @@ private:
|
|||
Style.AllowShortFunctionsOnASingleLine == FormatStyle::SFS_All ||
|
||||
(Style.AllowShortFunctionsOnASingleLine >= FormatStyle::SFS_Empty &&
|
||||
I[1]->First->is(tok::r_brace)) ||
|
||||
(Style.AllowShortFunctionsOnASingleLine == FormatStyle::SFS_Inline &&
|
||||
(Style.AllowShortFunctionsOnASingleLine & FormatStyle::SFS_InlineOnly &&
|
||||
TheLine->Level != 0);
|
||||
|
||||
if (Style.CompactNamespaces) {
|
||||
|
|
|
@ -6509,6 +6509,52 @@ TEST_F(FormatTest, PullInlineFunctionDefinitionsIntoSingleLine) {
|
|||
MergeInlineOnly);
|
||||
}
|
||||
|
||||
TEST_F(FormatTest, PullInlineOnlyFunctionDefinitionsIntoSingleLine) {
|
||||
FormatStyle MergeInlineOnly = getLLVMStyle();
|
||||
MergeInlineOnly.AllowShortFunctionsOnASingleLine =
|
||||
FormatStyle::SFS_InlineOnly;
|
||||
verifyFormat("class C {\n"
|
||||
" int f() { return 42; }\n"
|
||||
"};",
|
||||
MergeInlineOnly);
|
||||
verifyFormat("int f() {\n"
|
||||
" return 42;\n"
|
||||
"}",
|
||||
MergeInlineOnly);
|
||||
|
||||
// SFS_InlineOnly does not imply SFS_Empty
|
||||
verifyFormat("class C {\n"
|
||||
" int f() {}\n"
|
||||
"};",
|
||||
MergeInlineOnly);
|
||||
verifyFormat("int f() {\n"
|
||||
"}",
|
||||
MergeInlineOnly);
|
||||
|
||||
// Also verify behavior when BraceWrapping.AfterFunction = true
|
||||
MergeInlineOnly.BreakBeforeBraces = FormatStyle::BS_Custom;
|
||||
MergeInlineOnly.BraceWrapping.AfterFunction = true;
|
||||
verifyFormat("class C {\n"
|
||||
" int f() { return 42; }\n"
|
||||
"};",
|
||||
MergeInlineOnly);
|
||||
verifyFormat("int f()\n"
|
||||
"{\n"
|
||||
" return 42;\n"
|
||||
"}",
|
||||
MergeInlineOnly);
|
||||
|
||||
// SFS_InlineOnly does not imply SFS_Empty
|
||||
verifyFormat("int f()\n"
|
||||
"{\n"
|
||||
"}",
|
||||
MergeInlineOnly);
|
||||
verifyFormat("class C {\n"
|
||||
" int f() {}\n"
|
||||
"};",
|
||||
MergeInlineOnly);
|
||||
}
|
||||
|
||||
TEST_F(FormatTest, SplitEmptyFunctionBody) {
|
||||
FormatStyle Style = getLLVMStyle();
|
||||
Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_None;
|
||||
|
|
Loading…
Reference in New Issue