Skip to content

Commit bac3db3

Browse files
owencatru
authored andcommitted
[clang-format] Revert "[clang-format][NFC] Delete TT_LambdaArrow (#70… (#105923)
…519)" This reverts commit e00d32a and adds a test for lambda arrow SplitPenalty. Fixes #105480.
1 parent 4913755 commit bac3db3

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
@@ -842,10 +842,8 @@ void ContinuationIndenter::addTokenOnCurrentLine(LineState &State, bool DryRun,
842842
CurrentState.ContainsUnwrappedBuilder = true;
843843
}
844844

845-
if (Current.is(TT_TrailingReturnArrow) &&
846-
Style.Language == FormatStyle::LK_Java) {
845+
if (Current.is(TT_LambdaArrow) && Style.Language == FormatStyle::LK_Java)
847846
CurrentState.NoLineBreak = true;
848-
}
849847
if (Current.isMemberAccess() && Previous.is(tok::r_paren) &&
850848
(Previous.MatchingParen &&
851849
(Previous.TotalLength - Previous.MatchingParen->TotalLength > 10))) {
@@ -1000,7 +998,7 @@ unsigned ContinuationIndenter::addTokenOnNewLine(LineState &State,
1000998
//
1001999
// is common and should be formatted like a free-standing function. The same
10021000
// goes for wrapping before the lambda return type arrow.
1003-
if (Current.isNot(TT_TrailingReturnArrow) &&
1001+
if (Current.isNot(TT_LambdaArrow) &&
10041002
(!Style.isJavaScript() || Current.NestingLevel != 0 ||
10051003
!PreviousNonComment || PreviousNonComment->isNot(tok::equal) ||
10061004
!Current.isOneOf(Keywords.kw_async, Keywords.kw_function))) {
@@ -1257,7 +1255,7 @@ unsigned ContinuationIndenter::getNewLineColumn(const LineState &State) {
12571255
}
12581256
return CurrentState.Indent;
12591257
}
1260-
if (Current.is(TT_TrailingReturnArrow) &&
1258+
if (Current.is(TT_LambdaArrow) &&
12611259
Previous.isOneOf(tok::kw_noexcept, tok::kw_mutable, tok::kw_constexpr,
12621260
tok::kw_consteval, tok::kw_static, TT_AttributeSquare)) {
12631261
return ContinuationIndent;
@@ -1590,7 +1588,7 @@ unsigned ContinuationIndenter::moveStateToNextToken(LineState &State,
15901588
}
15911589
if (Current.isOneOf(TT_BinaryOperator, TT_ConditionalExpr) && Newline)
15921590
CurrentState.NestedBlockIndent = State.Column + Current.ColumnWidth + 1;
1593-
if (Current.isOneOf(TT_LambdaLSquare, TT_TrailingReturnArrow))
1591+
if (Current.isOneOf(TT_LambdaLSquare, TT_LambdaArrow))
15941592
CurrentState.LastSpace = State.Column;
15951593
if (Current.is(TT_RequiresExpression) &&
15961594
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(LambdaLBrace) \
106107
TYPE(LambdaLSquare) \
107108
TYPE(LeadingJavaAnnotation) \
@@ -725,7 +726,7 @@ struct FormatToken {
725726
bool isMemberAccess() const {
726727
return isOneOf(tok::arrow, tok::period, tok::arrowstar) &&
727728
!isOneOf(TT_DesignatedInitializerPeriod, TT_TrailingReturnArrow,
728-
TT_LeadingJavaAnnotation);
729+
TT_LambdaArrow, TT_LeadingJavaAnnotation);
729730
}
730731

731732
bool isPointerOrReference() const {

clang/lib/Format/TokenAnnotator.cpp

Lines changed: 18 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -831,7 +831,7 @@ class AnnotatingParser {
831831
}
832832
// An arrow after an ObjC method expression is not a lambda arrow.
833833
if (CurrentToken->is(TT_ObjCMethodExpr) && CurrentToken->Next &&
834-
CurrentToken->Next->is(TT_TrailingReturnArrow)) {
834+
CurrentToken->Next->is(TT_LambdaArrow)) {
835835
CurrentToken->Next->overwriteFixedType(TT_Unknown);
836836
}
837837
Left->MatchingParen = CurrentToken;
@@ -1769,8 +1769,10 @@ class AnnotatingParser {
17691769
}
17701770
break;
17711771
case tok::arrow:
1772-
if (Tok->Previous && Tok->Previous->is(tok::kw_noexcept))
1772+
if (Tok->isNot(TT_LambdaArrow) && Tok->Previous &&
1773+
Tok->Previous->is(tok::kw_noexcept)) {
17731774
Tok->setType(TT_TrailingReturnArrow);
1775+
}
17741776
break;
17751777
case tok::equal:
17761778
// In TableGen, there must be a value after "=";
@@ -2056,11 +2058,11 @@ class AnnotatingParser {
20562058
TT_LambdaLSquare, TT_LambdaLBrace, TT_AttributeMacro, TT_IfMacro,
20572059
TT_ForEachMacro, TT_TypenameMacro, TT_FunctionLBrace,
20582060
TT_ImplicitStringLiteral, TT_InlineASMBrace, TT_FatArrow,
2059-
TT_NamespaceMacro, TT_OverloadedOperator, TT_RegexLiteral,
2060-
TT_TemplateString, TT_ObjCStringLiteral, TT_UntouchableMacroFunc,
2061-
TT_StatementAttributeLikeMacro, TT_FunctionLikeOrFreestandingMacro,
2062-
TT_ClassLBrace, TT_EnumLBrace, TT_RecordLBrace, TT_StructLBrace,
2063-
TT_UnionLBrace, TT_RequiresClause,
2061+
TT_LambdaArrow, TT_NamespaceMacro, TT_OverloadedOperator,
2062+
TT_RegexLiteral, TT_TemplateString, TT_ObjCStringLiteral,
2063+
TT_UntouchableMacroFunc, TT_StatementAttributeLikeMacro,
2064+
TT_FunctionLikeOrFreestandingMacro, TT_ClassLBrace, TT_EnumLBrace,
2065+
TT_RecordLBrace, TT_StructLBrace, TT_UnionLBrace, TT_RequiresClause,
20642066
TT_RequiresClauseInARequiresExpression, TT_RequiresExpression,
20652067
TT_RequiresExpressionLParen, TT_RequiresExpressionLBrace,
20662068
TT_BracedListLBrace)) {
@@ -2246,7 +2248,7 @@ class AnnotatingParser {
22462248
Contexts.back().IsExpression = true;
22472249
} else if (Current.is(TT_TrailingReturnArrow)) {
22482250
Contexts.back().IsExpression = false;
2249-
} else if (Current.is(Keywords.kw_assert)) {
2251+
} else if (Current.isOneOf(TT_LambdaArrow, Keywords.kw_assert)) {
22502252
Contexts.back().IsExpression = Style.Language == FormatStyle::LK_Java;
22512253
} else if (Current.Previous &&
22522254
Current.Previous->is(TT_CtorInitializerColon)) {
@@ -2381,7 +2383,7 @@ class AnnotatingParser {
23812383
AutoFound = true;
23822384
} else if (Current.is(tok::arrow) &&
23832385
Style.Language == FormatStyle::LK_Java) {
2384-
Current.setType(TT_TrailingReturnArrow);
2386+
Current.setType(TT_LambdaArrow);
23852387
} else if (Current.is(tok::arrow) && Style.isVerilog()) {
23862388
// The implication operator.
23872389
Current.setType(TT_BinaryOperator);
@@ -3278,7 +3280,7 @@ class ExpressionParser {
32783280
}
32793281
if (Current->is(TT_JsComputedPropertyName))
32803282
return prec::Assignment;
3281-
if (Current->is(TT_TrailingReturnArrow))
3283+
if (Current->is(TT_LambdaArrow))
32823284
return prec::Comma;
32833285
if (Current->is(TT_FatArrow))
32843286
return prec::Assignment;
@@ -4202,7 +4204,7 @@ unsigned TokenAnnotator::splitPenalty(const AnnotatedLine &Line,
42024204
}
42034205
if (Right.is(TT_PointerOrReference))
42044206
return 190;
4205-
if (Right.is(TT_TrailingReturnArrow))
4207+
if (Right.is(TT_LambdaArrow))
42064208
return 110;
42074209
if (Left.is(tok::equal) && Right.is(tok::l_brace))
42084210
return 160;
@@ -5280,9 +5282,10 @@ bool TokenAnnotator::spaceRequiredBefore(const AnnotatedLine &Line,
52805282
return false;
52815283
}
52825284

5283-
if (Right.is(TT_TrailingReturnArrow) || Left.is(TT_TrailingReturnArrow))
5285+
if (Right.isOneOf(TT_TrailingReturnArrow, TT_LambdaArrow) ||
5286+
Left.isOneOf(TT_TrailingReturnArrow, TT_LambdaArrow)) {
52845287
return true;
5285-
5288+
}
52865289
if (Left.is(tok::comma) && Right.isNot(TT_OverloadedOperatorLParen) &&
52875290
// In an unexpanded macro call we only find the parentheses and commas
52885291
// in a line; the commas and closing parenthesis do not require a space.
@@ -6300,8 +6303,8 @@ bool TokenAnnotator::canBreakBefore(const AnnotatedLine &Line,
63006303
return Left.isOneOf(tok::comma, tok::coloncolon, tok::semi, tok::l_brace,
63016304
tok::kw_class, tok::kw_struct, tok::comment) ||
63026305
Right.isMemberAccess() ||
6303-
Right.isOneOf(TT_TrailingReturnArrow, tok::lessless, tok::colon,
6304-
tok::l_square, tok::at) ||
6306+
Right.isOneOf(TT_TrailingReturnArrow, TT_LambdaArrow, tok::lessless,
6307+
tok::colon, tok::l_square, tok::at) ||
63056308
(Left.is(tok::r_paren) &&
63066309
Right.isOneOf(tok::identifier, tok::kw_const)) ||
63076310
(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
@@ -2322,7 +2322,7 @@ bool UnwrappedLineParser::tryToParseLambda() {
23222322
// This might or might not actually be a lambda arrow (this could be an
23232323
// ObjC method invocation followed by a dereferencing arrow). We might
23242324
// reset this back to TT_Unknown in TokenAnnotator.
2325-
FormatTok->setFinalizedType(TT_TrailingReturnArrow);
2325+
FormatTok->setFinalizedType(TT_LambdaArrow);
23262326
SeenArrow = true;
23272327
nextToken();
23282328
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,19 +1708,19 @@ TEST_F(TokenAnnotatorTest, UnderstandsLambdas) {
17061708
Tokens = annotate("[]() -> auto {}");
17071709
ASSERT_EQ(Tokens.size(), 9u) << Tokens;
17081710
EXPECT_TOKEN(Tokens[0], tok::l_square, TT_LambdaLSquare);
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);
1715-
EXPECT_TOKEN(Tokens[4], tok::arrow, TT_TrailingReturnArrow);
1717+
EXPECT_TOKEN(Tokens[4], tok::arrow, TT_LambdaArrow);
17161718
EXPECT_TOKEN(Tokens[7], tok::l_brace, TT_LambdaLBrace);
17171719

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

17241726
Tokens = annotate("[] {}");
@@ -1734,19 +1736,19 @@ TEST_F(TokenAnnotatorTest, UnderstandsLambdas) {
17341736
Tokens = annotate("[] -> auto {}");
17351737
ASSERT_EQ(Tokens.size(), 7u) << Tokens;
17361738
EXPECT_TOKEN(Tokens[0], tok::l_square, TT_LambdaLSquare);
1737-
EXPECT_TOKEN(Tokens[2], tok::arrow, TT_TrailingReturnArrow);
1739+
EXPECT_TOKEN(Tokens[2], tok::arrow, TT_LambdaArrow);
17381740
EXPECT_TOKEN(Tokens[4], tok::l_brace, TT_LambdaLBrace);
17391741

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

17461748
Tokens = annotate("foo([&](u32 bar) __attribute__((attr)) -> void {});");
17471749
ASSERT_EQ(Tokens.size(), 22u) << Tokens;
17481750
EXPECT_TOKEN(Tokens[2], tok::l_square, TT_LambdaLSquare);
1749-
EXPECT_TOKEN(Tokens[15], tok::arrow, TT_TrailingReturnArrow);
1751+
EXPECT_TOKEN(Tokens[15], tok::arrow, TT_LambdaArrow);
17501752
EXPECT_TOKEN(Tokens[17], tok::l_brace, TT_LambdaLBrace);
17511753

17521754
Tokens = annotate("[] <typename T> () {}");
@@ -1827,7 +1829,7 @@ TEST_F(TokenAnnotatorTest, UnderstandsLambdas) {
18271829
ASSERT_EQ(Tokens.size(), 20u) << Tokens;
18281830
EXPECT_TOKEN(Tokens[0], tok::l_square, TT_LambdaLSquare);
18291831
EXPECT_TOKEN(Tokens[2], tok::less, TT_TemplateOpener);
1830-
EXPECT_TOKEN(Tokens[10], tok::arrow, TT_TrailingReturnArrow);
1832+
EXPECT_TOKEN(Tokens[10], tok::arrow, TT_LambdaArrow);
18311833
EXPECT_TOKEN(Tokens[12], tok::kw_requires, TT_RequiresClause);
18321834
EXPECT_TRUE(Tokens[16]->ClosesRequiresClause);
18331835
EXPECT_TOKEN(Tokens[17], tok::l_brace, TT_LambdaLBrace);
@@ -1888,7 +1890,7 @@ TEST_F(TokenAnnotatorTest, UnderstandsLambdas) {
18881890
EXPECT_TOKEN(Tokens[2], tok::less, TT_TemplateOpener);
18891891
EXPECT_TOKEN(Tokens[6], tok::kw_requires, TT_RequiresClause);
18901892
EXPECT_TRUE(Tokens[10]->ClosesRequiresClause);
1891-
EXPECT_TOKEN(Tokens[11], tok::arrow, TT_TrailingReturnArrow);
1893+
EXPECT_TOKEN(Tokens[11], tok::arrow, TT_LambdaArrow);
18921894
EXPECT_TOKEN(Tokens[13], tok::l_brace, TT_LambdaLBrace);
18931895

18941896
Tokens = annotate("[] <typename T> requires Foo<T> (T t) requires Bar<T> {}");
@@ -3321,7 +3323,7 @@ TEST_F(TokenAnnotatorTest, FunctionTryBlock) {
33213323
EXPECT_TOKEN(Tokens[3], tok::l_paren, TT_FunctionDeclarationLParen);
33223324
EXPECT_TOKEN(Tokens[11], tok::colon, TT_CtorInitializerColon);
33233325
EXPECT_TOKEN(Tokens[14], tok::l_square, TT_LambdaLSquare);
3324-
EXPECT_TOKEN(Tokens[16], tok::arrow, TT_TrailingReturnArrow);
3326+
EXPECT_TOKEN(Tokens[16], tok::arrow, TT_LambdaArrow);
33253327
EXPECT_TOKEN(Tokens[20], tok::l_brace, TT_LambdaLBrace);
33263328
EXPECT_TOKEN(Tokens[31], tok::comma, TT_CtorInitializerComma);
33273329
EXPECT_TOKEN(Tokens[36], tok::l_brace, TT_FunctionLBrace);
@@ -3339,6 +3341,20 @@ TEST_F(TokenAnnotatorTest, TypenameMacro) {
33393341
EXPECT_TOKEN(Tokens[6], tok::l_brace, TT_Unknown);
33403342
}
33413343

3344+
TEST_F(TokenAnnotatorTest, SplitPenalty) {
3345+
auto Style = getLLVMStyle();
3346+
Style.ColumnLimit = 20;
3347+
3348+
auto Tokens = annotate("class foo {\n"
3349+
" auto bar()\n"
3350+
" -> bool;\n"
3351+
"};",
3352+
Style);
3353+
ASSERT_EQ(Tokens.size(), 13u) << Tokens;
3354+
EXPECT_TOKEN(Tokens[7], tok::arrow, TT_TrailingReturnArrow);
3355+
EXPECT_SPLIT_PENALTY(Tokens[7], 23u);
3356+
}
3357+
33423358
} // namespace
33433359
} // namespace format
33443360
} // namespace clang

0 commit comments

Comments
 (0)