Skip to content

Commit dbf35d6

Browse files
committed
[clang-format] Revert "[clang-format][NFC] Delete TT_LambdaArrow (llvm#70519)"
This reverts commit e00d32a and adds a test for lambda arrow SplitPenalty. Fixes llvm#105480.
1 parent 714033a commit dbf35d6

File tree

5 files changed

+50
-32
lines changed

5 files changed

+50
-32
lines changed

clang/lib/Format/ContinuationIndenter.cpp

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -903,10 +903,8 @@ void ContinuationIndenter::addTokenOnCurrentLine(LineState &State, bool DryRun,
903903
CurrentState.ContainsUnwrappedBuilder = true;
904904
}
905905

906-
if (Current.is(TT_TrailingReturnArrow) &&
907-
Style.Language == FormatStyle::LK_Java) {
906+
if (Current.is(TT_LambdaArrow) && Style.Language == FormatStyle::LK_Java)
908907
CurrentState.NoLineBreak = true;
909-
}
910908
if (Current.isMemberAccess() && Previous.is(tok::r_paren) &&
911909
(Previous.MatchingParen &&
912910
(Previous.TotalLength - Previous.MatchingParen->TotalLength > 10))) {
@@ -1061,7 +1059,7 @@ unsigned ContinuationIndenter::addTokenOnNewLine(LineState &State,
10611059
//
10621060
// is common and should be formatted like a free-standing function. The same
10631061
// goes for wrapping before the lambda return type arrow.
1064-
if (Current.isNot(TT_TrailingReturnArrow) &&
1062+
if (Current.isNot(TT_LambdaArrow) &&
10651063
(!Style.isJavaScript() || Current.NestingLevel != 0 ||
10661064
!PreviousNonComment || PreviousNonComment->isNot(tok::equal) ||
10671065
!Current.isOneOf(Keywords.kw_async, Keywords.kw_function))) {
@@ -1321,7 +1319,7 @@ unsigned ContinuationIndenter::getNewLineColumn(const LineState &State) {
13211319
}
13221320
return CurrentState.Indent;
13231321
}
1324-
if (Current.is(TT_TrailingReturnArrow) &&
1322+
if (Current.is(TT_LambdaArrow) &&
13251323
Previous.isOneOf(tok::kw_noexcept, tok::kw_mutable, tok::kw_constexpr,
13261324
tok::kw_consteval, tok::kw_static, TT_AttributeSquare)) {
13271325
return ContinuationIndent;
@@ -1655,7 +1653,7 @@ unsigned ContinuationIndenter::moveStateToNextToken(LineState &State,
16551653
}
16561654
if (Current.isOneOf(TT_BinaryOperator, TT_ConditionalExpr) && Newline)
16571655
CurrentState.NestedBlockIndent = State.Column + Current.ColumnWidth + 1;
1658-
if (Current.isOneOf(TT_LambdaLSquare, TT_TrailingReturnArrow))
1656+
if (Current.isOneOf(TT_LambdaLSquare, TT_LambdaArrow))
16591657
CurrentState.LastSpace = State.Column;
16601658
if (Current.is(TT_RequiresExpression) &&
16611659
Style.RequiresExpressionIndentation == FormatStyle::REI_Keyword) {

clang/lib/Format/FormatToken.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -102,6 +102,7 @@ namespace format {
102102
TYPE(JsTypeColon) \
103103
TYPE(JsTypeOperator) \
104104
TYPE(JsTypeOptionalQuestion) \
105+
TYPE(LambdaArrow) \
105106
TYPE(LambdaDefinitionLParen) \
106107
TYPE(LambdaLBrace) \
107108
TYPE(LambdaLSquare) \
@@ -726,7 +727,7 @@ struct FormatToken {
726727
bool isMemberAccess() const {
727728
return isOneOf(tok::arrow, tok::period, tok::arrowstar) &&
728729
!isOneOf(TT_DesignatedInitializerPeriod, TT_TrailingReturnArrow,
729-
TT_LeadingJavaAnnotation);
730+
TT_LambdaArrow, TT_LeadingJavaAnnotation);
730731
}
731732

732733
bool isPointerOrReference() const {

clang/lib/Format/TokenAnnotator.cpp

Lines changed: 18 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -833,7 +833,7 @@ class AnnotatingParser {
833833
}
834834
// An arrow after an ObjC method expression is not a lambda arrow.
835835
if (CurrentToken->is(TT_ObjCMethodExpr) && CurrentToken->Next &&
836-
CurrentToken->Next->is(TT_TrailingReturnArrow)) {
836+
CurrentToken->Next->is(TT_LambdaArrow)) {
837837
CurrentToken->Next->overwriteFixedType(TT_Unknown);
838838
}
839839
Left->MatchingParen = CurrentToken;
@@ -1770,8 +1770,10 @@ class AnnotatingParser {
17701770
}
17711771
break;
17721772
case tok::arrow:
1773-
if (Tok->Previous && Tok->Previous->is(tok::kw_noexcept))
1773+
if (Tok->isNot(TT_LambdaArrow) && Tok->Previous &&
1774+
Tok->Previous->is(tok::kw_noexcept)) {
17741775
Tok->setType(TT_TrailingReturnArrow);
1776+
}
17751777
break;
17761778
case tok::equal:
17771779
// In TableGen, there must be a value after "=";
@@ -2057,11 +2059,11 @@ class AnnotatingParser {
20572059
TT_LambdaLSquare, TT_LambdaLBrace, TT_AttributeMacro, TT_IfMacro,
20582060
TT_ForEachMacro, TT_TypenameMacro, TT_FunctionLBrace,
20592061
TT_ImplicitStringLiteral, TT_InlineASMBrace, TT_FatArrow,
2060-
TT_NamespaceMacro, TT_OverloadedOperator, TT_RegexLiteral,
2061-
TT_TemplateString, TT_ObjCStringLiteral, TT_UntouchableMacroFunc,
2062-
TT_StatementAttributeLikeMacro, TT_FunctionLikeOrFreestandingMacro,
2063-
TT_ClassLBrace, TT_EnumLBrace, TT_RecordLBrace, TT_StructLBrace,
2064-
TT_UnionLBrace, TT_RequiresClause,
2062+
TT_LambdaArrow, TT_NamespaceMacro, TT_OverloadedOperator,
2063+
TT_RegexLiteral, TT_TemplateString, TT_ObjCStringLiteral,
2064+
TT_UntouchableMacroFunc, TT_StatementAttributeLikeMacro,
2065+
TT_FunctionLikeOrFreestandingMacro, TT_ClassLBrace, TT_EnumLBrace,
2066+
TT_RecordLBrace, TT_StructLBrace, TT_UnionLBrace, TT_RequiresClause,
20652067
TT_RequiresClauseInARequiresExpression, TT_RequiresExpression,
20662068
TT_RequiresExpressionLParen, TT_RequiresExpressionLBrace,
20672069
TT_BracedListLBrace)) {
@@ -2247,7 +2249,7 @@ class AnnotatingParser {
22472249
Contexts.back().IsExpression = true;
22482250
} else if (Current.is(TT_TrailingReturnArrow)) {
22492251
Contexts.back().IsExpression = false;
2250-
} else if (Current.is(Keywords.kw_assert)) {
2252+
} else if (Current.isOneOf(TT_LambdaArrow, Keywords.kw_assert)) {
22512253
Contexts.back().IsExpression = Style.Language == FormatStyle::LK_Java;
22522254
} else if (Current.Previous &&
22532255
Current.Previous->is(TT_CtorInitializerColon)) {
@@ -2382,7 +2384,7 @@ class AnnotatingParser {
23822384
AutoFound = true;
23832385
} else if (Current.is(tok::arrow) &&
23842386
Style.Language == FormatStyle::LK_Java) {
2385-
Current.setType(TT_TrailingReturnArrow);
2387+
Current.setType(TT_LambdaArrow);
23862388
} else if (Current.is(tok::arrow) && Style.isVerilog()) {
23872389
// The implication operator.
23882390
Current.setType(TT_BinaryOperator);
@@ -3286,7 +3288,7 @@ class ExpressionParser {
32863288
}
32873289
if (Current->is(TT_JsComputedPropertyName))
32883290
return prec::Assignment;
3289-
if (Current->is(TT_TrailingReturnArrow))
3291+
if (Current->is(TT_LambdaArrow))
32903292
return prec::Comma;
32913293
if (Current->is(TT_FatArrow))
32923294
return prec::Assignment;
@@ -4211,7 +4213,7 @@ unsigned TokenAnnotator::splitPenalty(const AnnotatedLine &Line,
42114213
}
42124214
if (Right.is(TT_PointerOrReference))
42134215
return 190;
4214-
if (Right.is(TT_TrailingReturnArrow))
4216+
if (Right.is(TT_LambdaArrow))
42154217
return 110;
42164218
if (Left.is(tok::equal) && Right.is(tok::l_brace))
42174219
return 160;
@@ -5289,9 +5291,10 @@ bool TokenAnnotator::spaceRequiredBefore(const AnnotatedLine &Line,
52895291
return false;
52905292
}
52915293

5292-
if (Right.is(TT_TrailingReturnArrow) || Left.is(TT_TrailingReturnArrow))
5294+
if (Right.isOneOf(TT_TrailingReturnArrow, TT_LambdaArrow) ||
5295+
Left.isOneOf(TT_TrailingReturnArrow, TT_LambdaArrow)) {
52935296
return true;
5294-
5297+
}
52955298
if (Left.is(tok::comma) && Right.isNot(TT_OverloadedOperatorLParen) &&
52965299
// In an unexpanded macro call we only find the parentheses and commas
52975300
// in a line; the commas and closing parenthesis do not require a space.
@@ -6318,8 +6321,8 @@ bool TokenAnnotator::canBreakBefore(const AnnotatedLine &Line,
63186321
return Left.isOneOf(tok::comma, tok::coloncolon, tok::semi, tok::l_brace,
63196322
tok::kw_class, tok::kw_struct, tok::comment) ||
63206323
Right.isMemberAccess() ||
6321-
Right.isOneOf(TT_TrailingReturnArrow, tok::lessless, tok::colon,
6322-
tok::l_square, tok::at) ||
6324+
Right.isOneOf(TT_TrailingReturnArrow, TT_LambdaArrow, tok::lessless,
6325+
tok::colon, tok::l_square, tok::at) ||
63236326
(Left.is(tok::r_paren) &&
63246327
Right.isOneOf(tok::identifier, tok::kw_const)) ||
63256328
(Left.is(tok::l_paren) && Right.isNot(tok::r_paren)) ||

clang/lib/Format/UnwrappedLineParser.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2326,7 +2326,7 @@ bool UnwrappedLineParser::tryToParseLambda() {
23262326
// This might or might not actually be a lambda arrow (this could be an
23272327
// ObjC method invocation followed by a dereferencing arrow). We might
23282328
// reset this back to TT_Unknown in TokenAnnotator.
2329-
FormatTok->setFinalizedType(TT_TrailingReturnArrow);
2329+
FormatTok->setFinalizedType(TT_LambdaArrow);
23302330
SeenArrow = true;
23312331
nextToken();
23322332
break;

clang/unittests/Format/TokenAnnotatorTest.cpp

Lines changed: 25 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,8 @@ class TokenAnnotatorTest : public testing::Test {
4242
EXPECT_EQ((FormatTok)->getPrecedence(), Prec) << *(FormatTok)
4343
#define EXPECT_BRACE_KIND(FormatTok, Kind) \
4444
EXPECT_EQ(FormatTok->getBlockKind(), Kind) << *(FormatTok)
45+
#define EXPECT_SPLIT_PENALTY(FormatTok, Penalty) \
46+
EXPECT_EQ(FormatTok->SplitPenalty, Penalty) << *(FormatTok)
4547
#define EXPECT_TOKEN(FormatTok, Kind, Type) \
4648
do { \
4749
EXPECT_TOKEN_KIND(FormatTok, Kind); \
@@ -1706,21 +1708,21 @@ TEST_F(TokenAnnotatorTest, UnderstandsLambdas) {
17061708
ASSERT_EQ(Tokens.size(), 9u) << Tokens;
17071709
EXPECT_TOKEN(Tokens[0], tok::l_square, TT_LambdaLSquare);
17081710
EXPECT_TOKEN(Tokens[2], tok::l_paren, TT_LambdaDefinitionLParen);
1709-
EXPECT_TOKEN(Tokens[4], tok::arrow, TT_TrailingReturnArrow);
1711+
EXPECT_TOKEN(Tokens[4], tok::arrow, TT_LambdaArrow);
17101712
EXPECT_TOKEN(Tokens[6], tok::l_brace, TT_LambdaLBrace);
17111713

17121714
Tokens = annotate("[]() -> auto & {}");
17131715
ASSERT_EQ(Tokens.size(), 10u) << Tokens;
17141716
EXPECT_TOKEN(Tokens[0], tok::l_square, TT_LambdaLSquare);
17151717
EXPECT_TOKEN(Tokens[2], tok::l_paren, TT_LambdaDefinitionLParen);
1716-
EXPECT_TOKEN(Tokens[4], tok::arrow, TT_TrailingReturnArrow);
1718+
EXPECT_TOKEN(Tokens[4], tok::arrow, TT_LambdaArrow);
17171719
EXPECT_TOKEN(Tokens[7], tok::l_brace, TT_LambdaLBrace);
17181720

17191721
Tokens = annotate("[]() -> auto * {}");
17201722
ASSERT_EQ(Tokens.size(), 10u) << Tokens;
17211723
EXPECT_TOKEN(Tokens[0], tok::l_square, TT_LambdaLSquare);
17221724
EXPECT_TOKEN(Tokens[2], tok::l_paren, TT_LambdaDefinitionLParen);
1723-
EXPECT_TOKEN(Tokens[4], tok::arrow, TT_TrailingReturnArrow);
1725+
EXPECT_TOKEN(Tokens[4], tok::arrow, TT_LambdaArrow);
17241726
EXPECT_TOKEN(Tokens[7], tok::l_brace, TT_LambdaLBrace);
17251727

17261728
Tokens = annotate("[] {}");
@@ -1736,20 +1738,20 @@ TEST_F(TokenAnnotatorTest, UnderstandsLambdas) {
17361738
Tokens = annotate("[] -> auto {}");
17371739
ASSERT_EQ(Tokens.size(), 7u) << Tokens;
17381740
EXPECT_TOKEN(Tokens[0], tok::l_square, TT_LambdaLSquare);
1739-
EXPECT_TOKEN(Tokens[2], tok::arrow, TT_TrailingReturnArrow);
1741+
EXPECT_TOKEN(Tokens[2], tok::arrow, TT_LambdaArrow);
17401742
EXPECT_TOKEN(Tokens[4], tok::l_brace, TT_LambdaLBrace);
17411743

17421744
Tokens = annotate("[] -> struct S { return {}; }");
17431745
ASSERT_EQ(Tokens.size(), 12u) << Tokens;
17441746
EXPECT_TOKEN(Tokens[0], tok::l_square, TT_LambdaLSquare);
1745-
EXPECT_TOKEN(Tokens[2], tok::arrow, TT_TrailingReturnArrow);
1747+
EXPECT_TOKEN(Tokens[2], tok::arrow, TT_LambdaArrow);
17461748
EXPECT_TOKEN(Tokens[5], tok::l_brace, TT_LambdaLBrace);
17471749

17481750
Tokens = annotate("foo([&](u32 bar) __attribute__((attr)) -> void {});");
17491751
ASSERT_EQ(Tokens.size(), 22u) << Tokens;
17501752
EXPECT_TOKEN(Tokens[2], tok::l_square, TT_LambdaLSquare);
17511753
EXPECT_TOKEN(Tokens[5], tok::l_paren, TT_LambdaDefinitionLParen);
1752-
EXPECT_TOKEN(Tokens[15], tok::arrow, TT_TrailingReturnArrow);
1754+
EXPECT_TOKEN(Tokens[15], tok::arrow, TT_LambdaArrow);
17531755
EXPECT_TOKEN(Tokens[17], tok::l_brace, TT_LambdaLBrace);
17541756

17551757
Tokens = annotate("[] <typename T> () {}");
@@ -1838,7 +1840,7 @@ TEST_F(TokenAnnotatorTest, UnderstandsLambdas) {
18381840
EXPECT_TOKEN(Tokens[0], tok::l_square, TT_LambdaLSquare);
18391841
EXPECT_TOKEN(Tokens[2], tok::less, TT_TemplateOpener);
18401842
EXPECT_TOKEN(Tokens[6], tok::l_paren, TT_LambdaDefinitionLParen);
1841-
EXPECT_TOKEN(Tokens[10], tok::arrow, TT_TrailingReturnArrow);
1843+
EXPECT_TOKEN(Tokens[10], tok::arrow, TT_LambdaArrow);
18421844
EXPECT_TOKEN(Tokens[12], tok::kw_requires, TT_RequiresClause);
18431845
EXPECT_TRUE(Tokens[16]->ClosesRequiresClause);
18441846
EXPECT_TOKEN(Tokens[17], tok::l_brace, TT_LambdaLBrace);
@@ -1907,7 +1909,7 @@ TEST_F(TokenAnnotatorTest, UnderstandsLambdas) {
19071909
EXPECT_TOKEN(Tokens[2], tok::less, TT_TemplateOpener);
19081910
EXPECT_TOKEN(Tokens[6], tok::kw_requires, TT_RequiresClause);
19091911
EXPECT_TRUE(Tokens[10]->ClosesRequiresClause);
1910-
EXPECT_TOKEN(Tokens[11], tok::arrow, TT_TrailingReturnArrow);
1912+
EXPECT_TOKEN(Tokens[11], tok::arrow, TT_LambdaArrow);
19111913
EXPECT_TOKEN(Tokens[13], tok::l_brace, TT_LambdaLBrace);
19121914

19131915
Tokens = annotate("[] <typename T> requires Foo<T> (T t) requires Bar<T> {}");
@@ -3342,7 +3344,7 @@ TEST_F(TokenAnnotatorTest, FunctionTryBlock) {
33423344
EXPECT_TOKEN(Tokens[3], tok::l_paren, TT_FunctionDeclarationLParen);
33433345
EXPECT_TOKEN(Tokens[11], tok::colon, TT_CtorInitializerColon);
33443346
EXPECT_TOKEN(Tokens[14], tok::l_square, TT_LambdaLSquare);
3345-
EXPECT_TOKEN(Tokens[16], tok::arrow, TT_TrailingReturnArrow);
3347+
EXPECT_TOKEN(Tokens[16], tok::arrow, TT_LambdaArrow);
33463348
EXPECT_TOKEN(Tokens[20], tok::l_brace, TT_LambdaLBrace);
33473349
EXPECT_TOKEN(Tokens[31], tok::comma, TT_CtorInitializerComma);
33483350
EXPECT_TOKEN(Tokens[36], tok::l_brace, TT_FunctionLBrace);
@@ -3369,6 +3371,20 @@ TEST_F(TokenAnnotatorTest, GNULanguageStandard) {
33693371
EXPECT_TOKEN(Tokens[2], tok::spaceship, TT_BinaryOperator);
33703372
}
33713373

3374+
TEST_F(TokenAnnotatorTest, SplitPenalty) {
3375+
auto Style = getLLVMStyle();
3376+
Style.ColumnLimit = 20;
3377+
3378+
auto Tokens = annotate("class foo {\n"
3379+
" auto bar()\n"
3380+
" -> bool;\n"
3381+
"};",
3382+
Style);
3383+
ASSERT_EQ(Tokens.size(), 13u);
3384+
EXPECT_TOKEN(Tokens[7], tok::arrow, TT_TrailingReturnArrow);
3385+
EXPECT_SPLIT_PENALTY(Tokens[7], 23u);
3386+
}
3387+
33723388
} // namespace
33733389
} // namespace format
33743390
} // namespace clang

0 commit comments

Comments
 (0)