forked from OSchip/llvm-project
[clang-format] PR50727 C# Invoke Lamda Expression indentation incorrect
https://bugs.llvm.org/show_bug.cgi?id=50727 When processing C# Lambda expression in the indentation can goes a little wrong, resulting the the closing } being at the wrong indentation level and meaning the remaining part of the file is incorrectly indented. This can be a fairly common pattern for when C# wants to peform a UI action from a thread, and it wants to invoke that action on the main thread Reviewed By: exv, jbcoe Differential Revision: https://reviews.llvm.org/D104388
This commit is contained in:
parent
c32186038d
commit
f9937106b7
|
@ -1482,8 +1482,8 @@ void UnwrappedLineParser::parseStructuralElement() {
|
||||||
}
|
}
|
||||||
case tok::equal:
|
case tok::equal:
|
||||||
// Fat arrows (=>) have tok::TokenKind tok::equal but TokenType
|
// Fat arrows (=>) have tok::TokenKind tok::equal but TokenType
|
||||||
// TT_FatArrow. The always start an expression or a child block if
|
// TT_FatArrow. They always start an expression or a child block if
|
||||||
// followed by a curly.
|
// followed by a curly brace.
|
||||||
if (FormatTok->is(TT_FatArrow)) {
|
if (FormatTok->is(TT_FatArrow)) {
|
||||||
nextToken();
|
nextToken();
|
||||||
if (FormatTok->is(tok::l_brace)) {
|
if (FormatTok->is(tok::l_brace)) {
|
||||||
|
@ -1790,14 +1790,20 @@ bool UnwrappedLineParser::parseBracedList(bool ContinueOnSemicolons,
|
||||||
bool HasError = false;
|
bool HasError = false;
|
||||||
|
|
||||||
// FIXME: Once we have an expression parser in the UnwrappedLineParser,
|
// FIXME: Once we have an expression parser in the UnwrappedLineParser,
|
||||||
// replace this by using parseAssigmentExpression() inside.
|
// replace this by using parseAssignmentExpression() inside.
|
||||||
do {
|
do {
|
||||||
if (Style.isCSharp()) {
|
if (Style.isCSharp()) {
|
||||||
|
// Fat arrows (=>) have tok::TokenKind tok::equal but TokenType
|
||||||
|
// TT_FatArrow. They always start an expression or a child block if
|
||||||
|
// followed by a curly brace.
|
||||||
if (FormatTok->is(TT_FatArrow)) {
|
if (FormatTok->is(TT_FatArrow)) {
|
||||||
nextToken();
|
nextToken();
|
||||||
// Fat arrows can be followed by simple expressions or by child blocks
|
|
||||||
// in curly braces.
|
|
||||||
if (FormatTok->is(tok::l_brace)) {
|
if (FormatTok->is(tok::l_brace)) {
|
||||||
|
// C# may break after => if the next character is a newline.
|
||||||
|
if (Style.isCSharp() && Style.BraceWrapping.AfterFunction == true) {
|
||||||
|
// calling `addUnwrappedLine()` here causes odd parsing errors.
|
||||||
|
FormatTok->MustBreakBefore = true;
|
||||||
|
}
|
||||||
parseChildBlock();
|
parseChildBlock();
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
@ -1927,6 +1933,12 @@ void UnwrappedLineParser::parseParens() {
|
||||||
parseBracedList();
|
parseBracedList();
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
case tok::equal:
|
||||||
|
if (Style.isCSharp() && FormatTok->is(TT_FatArrow))
|
||||||
|
parseStructuralElement();
|
||||||
|
else
|
||||||
|
nextToken();
|
||||||
|
break;
|
||||||
case tok::kw_class:
|
case tok::kw_class:
|
||||||
if (Style.Language == FormatStyle::LK_JavaScript)
|
if (Style.Language == FormatStyle::LK_JavaScript)
|
||||||
parseRecord(/*ParseAsExpr=*/true);
|
parseRecord(/*ParseAsExpr=*/true);
|
||||||
|
|
|
@ -640,6 +640,122 @@ class MyClass
|
||||||
};
|
};
|
||||||
})",
|
})",
|
||||||
MicrosoftStyle);
|
MicrosoftStyle);
|
||||||
|
|
||||||
|
verifyFormat("void bar()\n"
|
||||||
|
"{\n"
|
||||||
|
" Function(Val, (Action)(() =>\n"
|
||||||
|
" {\n"
|
||||||
|
" lock (mylock)\n"
|
||||||
|
" {\n"
|
||||||
|
" if (true)\n"
|
||||||
|
" {\n"
|
||||||
|
" A.Remove(item);\n"
|
||||||
|
" }\n"
|
||||||
|
" }\n"
|
||||||
|
" }));\n"
|
||||||
|
"}",
|
||||||
|
MicrosoftStyle);
|
||||||
|
|
||||||
|
verifyFormat("void baz()\n"
|
||||||
|
"{\n"
|
||||||
|
" Function(Val, (Action)(() =>\n"
|
||||||
|
" {\n"
|
||||||
|
" using (var a = new Lock())\n"
|
||||||
|
" {\n"
|
||||||
|
" if (true)\n"
|
||||||
|
" {\n"
|
||||||
|
" A.Remove(item);\n"
|
||||||
|
" }\n"
|
||||||
|
" }\n"
|
||||||
|
" }));\n"
|
||||||
|
"}",
|
||||||
|
MicrosoftStyle);
|
||||||
|
|
||||||
|
verifyFormat("void baz()\n"
|
||||||
|
"{\n"
|
||||||
|
" Function(Val, (Action)(() =>\n"
|
||||||
|
" {\n"
|
||||||
|
" if (true)\n"
|
||||||
|
" {\n"
|
||||||
|
" A.Remove(item);\n"
|
||||||
|
" }\n"
|
||||||
|
" }));\n"
|
||||||
|
"}",
|
||||||
|
MicrosoftStyle);
|
||||||
|
|
||||||
|
verifyFormat("void baz()\n"
|
||||||
|
"{\n"
|
||||||
|
" Function(Val, (Action)(() =>\n"
|
||||||
|
" {\n"
|
||||||
|
" do\n"
|
||||||
|
" {\n"
|
||||||
|
" A.Remove(item);\n"
|
||||||
|
" } while (true)\n"
|
||||||
|
" }));\n"
|
||||||
|
"}",
|
||||||
|
MicrosoftStyle);
|
||||||
|
|
||||||
|
verifyFormat("void baz()\n"
|
||||||
|
"{\n"
|
||||||
|
" Function(Val, (Action)(() =>\n"
|
||||||
|
" { A.Remove(item); }));\n"
|
||||||
|
"}",
|
||||||
|
MicrosoftStyle);
|
||||||
|
|
||||||
|
verifyFormat("void bar()\n"
|
||||||
|
"{\n"
|
||||||
|
" Function(Val, (() =>\n"
|
||||||
|
" {\n"
|
||||||
|
" lock (mylock)\n"
|
||||||
|
" {\n"
|
||||||
|
" if (true)\n"
|
||||||
|
" {\n"
|
||||||
|
" A.Remove(item);\n"
|
||||||
|
" }\n"
|
||||||
|
" }\n"
|
||||||
|
" }));\n"
|
||||||
|
"}",
|
||||||
|
MicrosoftStyle);
|
||||||
|
verifyFormat("void bar()\n"
|
||||||
|
"{\n"
|
||||||
|
" Function((() =>\n"
|
||||||
|
" {\n"
|
||||||
|
" lock (mylock)\n"
|
||||||
|
" {\n"
|
||||||
|
" if (true)\n"
|
||||||
|
" {\n"
|
||||||
|
" A.Remove(item);\n"
|
||||||
|
" }\n"
|
||||||
|
" }\n"
|
||||||
|
" }));\n"
|
||||||
|
"}",
|
||||||
|
MicrosoftStyle);
|
||||||
|
|
||||||
|
MicrosoftStyle.IndentWidth = 2;
|
||||||
|
verifyFormat("void bar()\n"
|
||||||
|
"{\n"
|
||||||
|
" Function((() =>\n"
|
||||||
|
" {\n"
|
||||||
|
" lock (mylock)\n"
|
||||||
|
" {\n"
|
||||||
|
" if (true)\n"
|
||||||
|
" {\n"
|
||||||
|
" A.Remove(item);\n"
|
||||||
|
" }\n"
|
||||||
|
" }\n"
|
||||||
|
" }));\n"
|
||||||
|
"}",
|
||||||
|
MicrosoftStyle);
|
||||||
|
verifyFormat("void bar() {\n"
|
||||||
|
" Function((() => {\n"
|
||||||
|
" lock (mylock) {\n"
|
||||||
|
" if (true) {\n"
|
||||||
|
" A.Remove(item);\n"
|
||||||
|
" }\n"
|
||||||
|
" }\n"
|
||||||
|
" }));\n"
|
||||||
|
"}",
|
||||||
|
GoogleStyle);
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_F(FormatTestCSharp, CSharpObjectInitializers) {
|
TEST_F(FormatTestCSharp, CSharpObjectInitializers) {
|
||||||
|
|
Loading…
Reference in New Issue