forked from OSchip/llvm-project
[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:
parent
9531146899
commit
b9f6e09b85
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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();
|
||||
|
|
Loading…
Reference in New Issue