forked from OSchip/llvm-project
[clang-format] Support repeated field lists in protos
Summary: This patch adds support for list initialization of proto repeated fields: ``` keys: [1, 2, 3] ``` Reviewers: djasper Reviewed By: djasper Subscribers: klimek, cfe-commits Differential Revision: https://reviews.llvm.org/D43298 llvm-svn: 325252
This commit is contained in:
parent
1e002a2b1b
commit
b79987a95b
|
@ -383,11 +383,18 @@ private:
|
||||||
// }
|
// }
|
||||||
// }
|
// }
|
||||||
//
|
//
|
||||||
// In the first case we want to spread the contents inside the square
|
// or repeated fields (in options):
|
||||||
// braces; in the second we want to keep them inline.
|
//
|
||||||
|
// option (Aaa.options) = {
|
||||||
|
// keys: [ 1, 2, 3 ]
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
// In the first and the third case we want to spread the contents inside
|
||||||
|
// the square braces; in the second we want to keep them inline.
|
||||||
Left->Type = TT_ArrayInitializerLSquare;
|
Left->Type = TT_ArrayInitializerLSquare;
|
||||||
if (!Left->endsSequence(tok::l_square, tok::numeric_constant,
|
if (!Left->endsSequence(tok::l_square, tok::numeric_constant,
|
||||||
tok::equal)) {
|
tok::equal) &&
|
||||||
|
!Left->endsSequence(tok::l_square, tok::colon, TT_SelectorName)) {
|
||||||
Left->Type = TT_ProtoExtensionLSquare;
|
Left->Type = TT_ProtoExtensionLSquare;
|
||||||
BindingIncrease = 10;
|
BindingIncrease = 10;
|
||||||
}
|
}
|
||||||
|
@ -2331,16 +2338,26 @@ bool TokenAnnotator::spaceRequiredBetween(const AnnotatedLine &Line,
|
||||||
!Left.Previous->isOneOf(tok::l_paren, tok::coloncolon));
|
!Left.Previous->isOneOf(tok::l_paren, tok::coloncolon));
|
||||||
if (Right.is(tok::star) && Left.is(tok::l_paren))
|
if (Right.is(tok::star) && Left.is(tok::l_paren))
|
||||||
return false;
|
return false;
|
||||||
|
const auto SpaceRequiredForArrayInitializerLSquare =
|
||||||
|
[](const FormatToken &LSquareTok, const FormatStyle &Style) {
|
||||||
|
return Style.SpacesInContainerLiterals ||
|
||||||
|
((Style.Language == FormatStyle::LK_Proto ||
|
||||||
|
Style.Language == FormatStyle::LK_TextProto) &&
|
||||||
|
!Style.Cpp11BracedListStyle &&
|
||||||
|
LSquareTok.endsSequence(tok::l_square, tok::colon,
|
||||||
|
TT_SelectorName));
|
||||||
|
};
|
||||||
if (Left.is(tok::l_square))
|
if (Left.is(tok::l_square))
|
||||||
return (Left.is(TT_ArrayInitializerLSquare) &&
|
return (Left.is(TT_ArrayInitializerLSquare) && Right.isNot(tok::r_square) &&
|
||||||
Style.SpacesInContainerLiterals && Right.isNot(tok::r_square)) ||
|
SpaceRequiredForArrayInitializerLSquare(Left, Style)) ||
|
||||||
(Left.isOneOf(TT_ArraySubscriptLSquare,
|
(Left.isOneOf(TT_ArraySubscriptLSquare,
|
||||||
TT_StructuredBindingLSquare) &&
|
TT_StructuredBindingLSquare) &&
|
||||||
Style.SpacesInSquareBrackets && Right.isNot(tok::r_square));
|
Style.SpacesInSquareBrackets && Right.isNot(tok::r_square));
|
||||||
if (Right.is(tok::r_square))
|
if (Right.is(tok::r_square))
|
||||||
return Right.MatchingParen &&
|
return Right.MatchingParen &&
|
||||||
((Style.SpacesInContainerLiterals &&
|
((Right.MatchingParen->is(TT_ArrayInitializerLSquare) &&
|
||||||
Right.MatchingParen->is(TT_ArrayInitializerLSquare)) ||
|
SpaceRequiredForArrayInitializerLSquare(*Right.MatchingParen,
|
||||||
|
Style)) ||
|
||||||
(Style.SpacesInSquareBrackets &&
|
(Style.SpacesInSquareBrackets &&
|
||||||
Right.MatchingParen->isOneOf(TT_ArraySubscriptLSquare,
|
Right.MatchingParen->isOneOf(TT_ArraySubscriptLSquare,
|
||||||
TT_StructuredBindingLSquare)));
|
TT_StructuredBindingLSquare)));
|
||||||
|
|
|
@ -438,5 +438,35 @@ TEST_F(FormatTestProto, NoSpaceAfterPercent) {
|
||||||
"};");
|
"};");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
TEST_F(FormatTestProto, FormatsRepeatedListInitializersInOptions) {
|
||||||
|
verifyFormat("option (MyProto.options) = {\n"
|
||||||
|
" key: item\n"
|
||||||
|
" keys: [\n"
|
||||||
|
" 'ala',\n"
|
||||||
|
" 'bala',\n"
|
||||||
|
" 'porto',\n"
|
||||||
|
" 'kala',\n"
|
||||||
|
" 'too',\n"
|
||||||
|
" 'long',\n"
|
||||||
|
" 'long',\n"
|
||||||
|
" 'long'\n"
|
||||||
|
" ]\n"
|
||||||
|
" key: [ item ]\n"
|
||||||
|
" msg {\n"
|
||||||
|
" key: item\n"
|
||||||
|
" keys: [\n"
|
||||||
|
" 'ala',\n"
|
||||||
|
" 'bala',\n"
|
||||||
|
" 'porto',\n"
|
||||||
|
" 'kala',\n"
|
||||||
|
" 'too',\n"
|
||||||
|
" 'long',\n"
|
||||||
|
" 'long'\n"
|
||||||
|
" ]\n"
|
||||||
|
" }\n"
|
||||||
|
" key: value\n"
|
||||||
|
"};");
|
||||||
|
}
|
||||||
|
|
||||||
} // end namespace tooling
|
} // end namespace tooling
|
||||||
} // end namespace clang
|
} // end namespace clang
|
||||||
|
|
|
@ -31,14 +31,18 @@ protected:
|
||||||
return *Result;
|
return *Result;
|
||||||
}
|
}
|
||||||
|
|
||||||
static std::string format(llvm::StringRef Code) {
|
static std::string format(llvm::StringRef Code, const FormatStyle &Style) {
|
||||||
FormatStyle Style = getGoogleStyle(FormatStyle::LK_TextProto);
|
|
||||||
Style.ColumnLimit = 60; // To make writing tests easier.
|
|
||||||
return format(Code, 0, Code.size(), Style);
|
return format(Code, 0, Code.size(), Style);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void verifyFormat(llvm::StringRef Code, const FormatStyle &Style) {
|
||||||
|
EXPECT_EQ(Code.str(), format(test::messUp(Code), Style));
|
||||||
|
}
|
||||||
|
|
||||||
static void verifyFormat(llvm::StringRef Code) {
|
static void verifyFormat(llvm::StringRef Code) {
|
||||||
EXPECT_EQ(Code.str(), format(test::messUp(Code)));
|
FormatStyle Style = getGoogleStyle(FormatStyle::LK_TextProto);
|
||||||
|
Style.ColumnLimit = 60; // To make writing tests easier.
|
||||||
|
verifyFormat(Code, Style);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -390,5 +394,43 @@ TEST_F(FormatTestTextProto, FormatsExtensions) {
|
||||||
TEST_F(FormatTestTextProto, NoSpaceAfterPercent) {
|
TEST_F(FormatTestTextProto, NoSpaceAfterPercent) {
|
||||||
verifyFormat("key: %d");
|
verifyFormat("key: %d");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
TEST_F(FormatTestTextProto, FormatsRepeatedListInitializers) {
|
||||||
|
verifyFormat("keys: []");
|
||||||
|
verifyFormat("keys: [ 1 ]");
|
||||||
|
verifyFormat("keys: [ 'ala', 'bala' ]");
|
||||||
|
verifyFormat("keys:\n"
|
||||||
|
" [ 'ala', 'bala', 'porto', 'kala', 'too', 'long', 'ng' ]");
|
||||||
|
verifyFormat("key: item\n"
|
||||||
|
"keys: [\n"
|
||||||
|
" 'ala',\n"
|
||||||
|
" 'bala',\n"
|
||||||
|
" 'porto',\n"
|
||||||
|
" 'kala',\n"
|
||||||
|
" 'too',\n"
|
||||||
|
" 'long',\n"
|
||||||
|
" 'long',\n"
|
||||||
|
" 'long'\n"
|
||||||
|
"]\n"
|
||||||
|
"key: item\n"
|
||||||
|
"msg {\n"
|
||||||
|
" key: item\n"
|
||||||
|
" keys: [\n"
|
||||||
|
" 'ala',\n"
|
||||||
|
" 'bala',\n"
|
||||||
|
" 'porto',\n"
|
||||||
|
" 'kala',\n"
|
||||||
|
" 'too',\n"
|
||||||
|
" 'long',\n"
|
||||||
|
" 'long'\n"
|
||||||
|
" ]\n"
|
||||||
|
"}\n"
|
||||||
|
"key: value"
|
||||||
|
);
|
||||||
|
FormatStyle Style = getGoogleStyle(FormatStyle::LK_TextProto);
|
||||||
|
Style.ColumnLimit = 60; // To make writing tests easier.
|
||||||
|
Style.Cpp11BracedListStyle = true;
|
||||||
|
verifyFormat("keys: [1]", Style);
|
||||||
|
}
|
||||||
} // end namespace tooling
|
} // end namespace tooling
|
||||||
} // end namespace clang
|
} // end namespace clang
|
||||||
|
|
Loading…
Reference in New Issue