[clang] 7d2fdd3 - [clang-format] parse C# object initialisers
Jonathan Coe via cfe-commits
cfe-commits at lists.llvm.org
Wed Mar 4 04:17:02 PST 2020
Author: Jonathan Coe
Date: 2020-03-04T12:14:00Z
New Revision: 7d2fdd3f6639731284dd8b6b274f01f04fd19215
URL: https://github.com/llvm/llvm-project/commit/7d2fdd3f6639731284dd8b6b274f01f04fd19215
DIFF: https://github.com/llvm/llvm-project/commit/7d2fdd3f6639731284dd8b6b274f01f04fd19215.diff
LOG: [clang-format] parse C# object initialisers
Summary:
Treat C# object initializers as braced lists.
Allow lambdas inside C# braced lists.
Reviewers: krasimir
Reviewed By: krasimir
Subscribers: cfe-commits, MyDeveloperDay
Tags: #clang-format, #clang
Differential Revision: https://reviews.llvm.org/D75473
Added:
Modified:
clang/lib/Format/UnwrappedLineParser.cpp
clang/unittests/Format/FormatTestCSharp.cpp
Removed:
################################################################################
diff --git a/clang/lib/Format/UnwrappedLineParser.cpp b/clang/lib/Format/UnwrappedLineParser.cpp
index 06c740048176..58cc679af9e1 100644
--- a/clang/lib/Format/UnwrappedLineParser.cpp
+++ b/clang/lib/Format/UnwrappedLineParser.cpp
@@ -1632,6 +1632,17 @@ bool UnwrappedLineParser::parseBracedList(bool ContinueOnSemicolons,
// FIXME: Once we have an expression parser in the UnwrappedLineParser,
// replace this by using parseAssigmentExpression() inside.
do {
+ if (Style.isCSharp()) {
+ if (FormatTok->is(TT_JsFatArrow)) {
+ nextToken();
+ // Fat arrows can be followed by simple expressions or by child blocks
+ // in curly braces.
+ if (FormatTok->is(tok::l_brace)) {
+ parseChildBlock();
+ continue;
+ }
+ }
+ }
if (Style.Language == FormatStyle::LK_JavaScript) {
if (FormatTok->is(Keywords.kw_function) ||
FormatTok->startsSequence(Keywords.kw_async, Keywords.kw_function)) {
@@ -1955,7 +1966,7 @@ void UnwrappedLineParser::parseNamespace() {
DeclarationScopeStack.size() > 1);
parseBlock(/*MustBeDeclaration=*/true, AddLevel);
// Munch the semicolon after a namespace. This is more common than one would
- // think. Puttin the semicolon into its own line is very ugly.
+ // think. Putting the semicolon into its own line is very ugly.
if (FormatTok->Tok.is(tok::semi))
nextToken();
addUnwrappedLine();
@@ -1966,6 +1977,19 @@ void UnwrappedLineParser::parseNamespace() {
void UnwrappedLineParser::parseNew() {
assert(FormatTok->is(tok::kw_new) && "'new' expected");
nextToken();
+
+ if (Style.isCSharp()) {
+ do {
+ if (FormatTok->is(tok::l_brace))
+ parseBracedList();
+
+ if (FormatTok->isOneOf(tok::semi, tok::comma))
+ return;
+
+ nextToken();
+ } while (!eof());
+ }
+
if (Style.Language != FormatStyle::LK_Java)
return;
diff --git a/clang/unittests/Format/FormatTestCSharp.cpp b/clang/unittests/Format/FormatTestCSharp.cpp
index ad849f2dbdf7..3f14de9b75da 100644
--- a/clang/unittests/Format/FormatTestCSharp.cpp
+++ b/clang/unittests/Format/FormatTestCSharp.cpp
@@ -546,6 +546,14 @@ Shape[] shapes = new[] { new Circle { Radius = 2.7281, Colour = Colours.Red },
Colour = Colours.Yellow,
} };)",
Style);
+
+ // Lambdas can be supplied as initialiser arguments.
+ verifyFormat(R"(//
+private Transformer _transformer = new X.Y {
+ Filler = (Shape shape) => { return new Transform.Fill(shape, RED); },
+ Scaler = (Shape shape) => { return new Transform.Resize(shape, 0.1); },
+};)",
+ Style);
}
TEST_F(FormatTestCSharp, CSharpNamedArguments) {
More information about the cfe-commits
mailing list