[clang-format][NFC] Handle wrapping after => in mustBreakBefore()

Move the handling of brace wrapping after => from unwrapped line
parser to token annotator and clean up the parser.

Differential Revision: https://reviews.llvm.org/D115967
This commit is contained in:
Owen Pan 2021-12-17 12:00:48 -08:00
parent 9531146899
commit b9f6e09b85
3 changed files with 18 additions and 43 deletions

View File

@ -3725,6 +3725,9 @@ bool TokenAnnotator::mustBreakBefore(const AnnotatedLine &Line,
return true;
if (Style.isCSharp()) {
if (Left.is(TT_FatArrow) && Right.is(tok::l_brace) &&
Style.BraceWrapping.AfterFunction)
return true;
if (Right.is(TT_CSharpNamedArgumentColon) ||
Left.is(TT_CSharpNamedArgumentColon))
return false;

View File

@ -1637,19 +1637,9 @@ void UnwrappedLineParser::parseStructuralElement(bool IsTopLevel) {
break;
}
case tok::equal:
// 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)) {
nextToken();
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();
}
if ((Style.isJavaScript() || Style.isCSharp()) &&
FormatTok->is(TT_FatArrow)) {
tryToParseChildBlock();
break;
}
@ -1725,7 +1715,7 @@ bool UnwrappedLineParser::tryToParsePropertyAccessor() {
// Try to parse the property accessor:
// https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/classes-and-structs/properties
Tokens->setPosition(StoredPosition);
if (!IsTrivialPropertyAccessor && Style.BraceWrapping.AfterFunction == true)
if (!IsTrivialPropertyAccessor && Style.BraceWrapping.AfterFunction)
addUnwrappedLine();
nextToken();
do {
@ -1940,18 +1930,15 @@ bool UnwrappedLineParser::tryToParseBracedList() {
return true;
}
bool UnwrappedLineParser::tryToParseCSharpLambda() {
// 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.
bool UnwrappedLineParser::tryToParseChildBlock() {
assert(Style.isJavaScript() || Style.isCSharp());
assert(FormatTok->is(TT_FatArrow));
// 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.
nextToken();
if (FormatTok->isNot(tok::l_brace))
return false;
// C# may break after => if the next character is a newline.
if (Style.BraceWrapping.AfterFunction) {
// calling `addUnwrappedLine()` here causes odd parsing errors.
FormatTok->MustBreakBefore = true;
}
parseChildBlock();
return true;
}
@ -1964,24 +1951,15 @@ bool UnwrappedLineParser::parseBracedList(bool ContinueOnSemicolons,
// FIXME: Once we have an expression parser in the UnwrappedLineParser,
// replace this by using parseAssignmentExpression() inside.
do {
if (Style.isCSharp() && FormatTok->is(TT_FatArrow))
if (tryToParseCSharpLambda())
continue;
if (Style.isCSharp() && FormatTok->is(TT_FatArrow) &&
tryToParseChildBlock())
continue;
if (Style.isJavaScript()) {
if (FormatTok->is(Keywords.kw_function) ||
FormatTok->startsSequence(Keywords.kw_async, Keywords.kw_function)) {
tryToParseJSFunction();
continue;
}
if (FormatTok->is(TT_FatArrow)) {
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 (FormatTok->is(tok::l_brace)) {
// Could be a method inside of a braced list `{a() { return 1; }}`.
if (tryToParseBracedList())
@ -1996,12 +1974,6 @@ bool UnwrappedLineParser::parseBracedList(bool ContinueOnSemicolons,
return !HasError;
}
switch (FormatTok->Tok.getKind()) {
case tok::caret:
nextToken();
if (FormatTok->is(tok::l_brace)) {
parseChildBlock();
}
break;
case tok::l_square:
if (Style.isCSharp())
parseSquare();
@ -2093,7 +2065,7 @@ void UnwrappedLineParser::parseParens() {
break;
case tok::equal:
if (Style.isCSharp() && FormatTok->is(TT_FatArrow))
tryToParseCSharpLambda();
tryToParseChildBlock();
else
nextToken();
break;

View File

@ -138,7 +138,7 @@ private:
// https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/keywords/where-generic-type-constraint
void parseCSharpGenericTypeConstraint();
bool tryToParseLambda();
bool tryToParseCSharpLambda();
bool tryToParseChildBlock();
bool tryToParseLambdaIntroducer();
bool tryToParsePropertyAccessor();
void tryToParseJSFunction();