[clang] [clang-format] Fix a regression on BAS_AlwaysBreak (PR #107506)
Owen Pan via cfe-commits
cfe-commits at lists.llvm.org
Sun Sep 8 00:55:41 PDT 2024
https://github.com/owenca updated https://github.com/llvm/llvm-project/pull/107506
>From bd7da6ec9afabd829010db4c33d088590ab68b5a Mon Sep 17 00:00:00 2001
From: Owen Pan <owenpiano at gmail.com>
Date: Thu, 5 Sep 2024 19:44:46 -0700
Subject: [PATCH 1/3] [clang-format] Fix a regression on BAS_AlwaysBreak
Fixes #107401.
---
clang/lib/Format/ContinuationIndenter.cpp | 2 +-
clang/unittests/Format/FormatTestJS.cpp | 8 ++++++++
2 files changed, 9 insertions(+), 1 deletion(-)
diff --git a/clang/lib/Format/ContinuationIndenter.cpp b/clang/lib/Format/ContinuationIndenter.cpp
index 5843571718b3a2..f65c1640a8765a 100644
--- a/clang/lib/Format/ContinuationIndenter.cpp
+++ b/clang/lib/Format/ContinuationIndenter.cpp
@@ -861,7 +861,7 @@ void ContinuationIndenter::addTokenOnCurrentLine(LineState &State, bool DryRun,
// or
// caaaaaaaaaaaaaaaaaaaaal(
// new SomethingElseeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee());
- !IsSimpleFunction(Current)) {
+ Current.isNot(tok::comment) && !IsSimpleFunction(Current)) {
CurrentState.NoLineBreak = true;
}
diff --git a/clang/unittests/Format/FormatTestJS.cpp b/clang/unittests/Format/FormatTestJS.cpp
index 4b29ba720f6823..a0b663170c7b33 100644
--- a/clang/unittests/Format/FormatTestJS.cpp
+++ b/clang/unittests/Format/FormatTestJS.cpp
@@ -2850,5 +2850,13 @@ TEST_F(FormatTestJS, DontBreakFieldsAsGoToLabels) {
"};");
}
+TEST_F(FormatTestJS, BreakAfterOpenBracket) {
+ auto Style = getGoogleStyle(FormatStyle::LK_JavaScript);
+ EXPECT_EQ(Style.AlignAfterOpenBracket, FormatStyle::BAS_AlwaysBreak);
+ verifyFormat("ctrl.onCopy(/** @type {!WizEvent}*/ (\n"
+ " {event, targetElement: {el: () => selectedElement}}));",
+ Style);
+}
+
} // namespace format
} // end namespace clang
>From 920e26dcd9c5d7f78a4f8b572451ecae73dd9201 Mon Sep 17 00:00:00 2001
From: Owen Pan <owenpiano at gmail.com>
Date: Sat, 7 Sep 2024 16:40:04 -0700
Subject: [PATCH 2/3] Rename `InSimpleFunction` to `StartsSimpleOneArgList` and
skip to the next token if the argument is a comment.
---
clang/lib/Format/ContinuationIndenter.cpp | 9 ++++++---
1 file changed, 6 insertions(+), 3 deletions(-)
diff --git a/clang/lib/Format/ContinuationIndenter.cpp b/clang/lib/Format/ContinuationIndenter.cpp
index f65c1640a8765a..58e6b78ce578e4 100644
--- a/clang/lib/Format/ContinuationIndenter.cpp
+++ b/clang/lib/Format/ContinuationIndenter.cpp
@@ -815,7 +815,7 @@ void ContinuationIndenter::addTokenOnCurrentLine(LineState &State, bool DryRun,
return Tok.is(tok::l_paren) && Tok.ParameterCount > 0 && Tok.Previous &&
Tok.Previous->is(tok::identifier);
};
- const auto IsInTemplateString = [this](const FormatToken &Tok) {
+ auto IsInTemplateString = [this](const FormatToken &Tok) {
if (!Style.isJavaScript())
return false;
for (const auto *Prev = &Tok; Prev; Prev = Prev->Previous) {
@@ -827,7 +827,10 @@ void ContinuationIndenter::addTokenOnCurrentLine(LineState &State, bool DryRun,
return false;
};
// Identifies simple (no expression) one-argument function calls.
- const auto IsSimpleFunction = [&](const FormatToken &Tok) {
+ auto StartsSimpleOneArgList = [&](const FormatToken &TokAfterLParen) {
+ assert(TokAfterLParen.isNot(tok::comment) || TokAfterLParen.Next);
+ const auto &Tok =
+ TokAfterLParen.is(tok::comment) ? *TokAfterLParen.Next : TokAfterLParen;
if (!Tok.FakeLParens.empty() && Tok.FakeLParens.back() > prec::Unknown)
return false;
// Nested calls that involve `new` expressions also look like simple
@@ -861,7 +864,7 @@ void ContinuationIndenter::addTokenOnCurrentLine(LineState &State, bool DryRun,
// or
// caaaaaaaaaaaaaaaaaaaaal(
// new SomethingElseeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee());
- Current.isNot(tok::comment) && !IsSimpleFunction(Current)) {
+ !StartsSimpleOneArgList(Current)) {
CurrentState.NoLineBreak = true;
}
>From 4ff558c57fbd931cc65053c81def60501d3fe4af Mon Sep 17 00:00:00 2001
From: Owen Pan <owenpiano at gmail.com>
Date: Sun, 8 Sep 2024 00:54:41 -0700
Subject: [PATCH 3/3] Also fix #107574.
---
clang/lib/Format/ContinuationIndenter.cpp | 5 +++++
clang/unittests/Format/FormatTestJS.cpp | 9 +++++++++
2 files changed, 14 insertions(+)
diff --git a/clang/lib/Format/ContinuationIndenter.cpp b/clang/lib/Format/ContinuationIndenter.cpp
index 58e6b78ce578e4..f29f8796ea9290 100644
--- a/clang/lib/Format/ContinuationIndenter.cpp
+++ b/clang/lib/Format/ContinuationIndenter.cpp
@@ -839,6 +839,11 @@ void ContinuationIndenter::addTokenOnCurrentLine(LineState &State, bool DryRun,
// - foo(::new Bar())
if (Tok.is(tok::kw_new) || Tok.startsSequence(tok::coloncolon, tok::kw_new))
return true;
+ if (Tok.is(TT_UnaryOperator) ||
+ (Style.isJavaScript() &&
+ Tok.isOneOf(tok::ellipsis, Keywords.kw_await))) {
+ return true;
+ }
const auto *Previous = Tok.Previous;
if (!Previous || (!Previous->isOneOf(TT_FunctionDeclarationLParen,
TT_LambdaDefinitionLParen) &&
diff --git a/clang/unittests/Format/FormatTestJS.cpp b/clang/unittests/Format/FormatTestJS.cpp
index a0b663170c7b33..c25228a69a748f 100644
--- a/clang/unittests/Format/FormatTestJS.cpp
+++ b/clang/unittests/Format/FormatTestJS.cpp
@@ -2856,6 +2856,15 @@ TEST_F(FormatTestJS, BreakAfterOpenBracket) {
verifyFormat("ctrl.onCopy(/** @type {!WizEvent}*/ (\n"
" {event, targetElement: {el: () => selectedElement}}));",
Style);
+ verifyFormat("failedUserIds.push(...subscriptioxxxxxxxxxxxxnSubset.map(\n"
+ " subscxxxxxxxxxxxxription => subscription.getUserId()));",
+ Style);
+ verifyFormat("failedUserIds.push(!subscriptioxxxxxxxxxxxxnSubset.map(\n"
+ " subscxxxxxxxxxxxxription => subscription.getUserId()));",
+ Style);
+ verifyFormat("failedUserIds.push(await subscriptioxxxxxxxxxxxxnSubset.map(\n"
+ " subscxxxxxxxxxxxxription => subscription.getUserId()));",
+ Style);
}
} // namespace format
More information about the cfe-commits
mailing list