[clang-format] Break after string literals with trailing line breaks (#76795)

This restores a subset of functionality that was forego in
d68826dfbd.

Streaming multiple string literals is rare enough in practice, hence
that change makes sense in general. But it seems people were
incidentally relying on this for having line breaks after string
literals that ended with `\n`.

This patch tries to restore that behavior to prevent regressions in the
upcoming LLVM release, until we can implement some configuration based
approach as proposed in https://github.com/llvm/llvm-project/pull/69859.
This commit is contained in:
kadir çetinkaya
2024-01-08 11:11:02 +01:00
committed by GitHub
parent 0ba868db70
commit 27f547968c
3 changed files with 19 additions and 0 deletions

View File

@@ -5151,6 +5151,14 @@ bool TokenAnnotator::mustBreakBefore(const AnnotatedLine &Line,
return true;
if (Left.IsUnterminatedLiteral)
return true;
// FIXME: Breaking after newlines seems useful in general. Turn this into an
// option and recognize more cases like endl etc, and break independent of
// what comes after operator lessless.
if (Right.is(tok::lessless) && Right.Next &&
Right.Next->is(tok::string_literal) && Left.is(tok::string_literal) &&
Left.TokenText.ends_with("\\n\"")) {
return true;
}
if (Right.is(TT_RequiresClause)) {
switch (Style.RequiresClausePosition) {
case FormatStyle::RCPS_OwnLine:

View File

@@ -26708,6 +26708,8 @@ TEST_F(FormatTest, PPBranchesInBracedInit) {
TEST_F(FormatTest, StreamOutputOperator) {
verifyFormat("std::cout << \"foo\" << \"bar\" << baz;");
verifyFormat("std::cout << \"foo\\n\"\n"
" << \"bar\";");
}
TEST_F(FormatTest, BreakAdjacentStringLiterals) {

View File

@@ -2499,6 +2499,15 @@ TEST_F(TokenAnnotatorTest, BraceKind) {
EXPECT_BRACE_KIND(Tokens[6], BK_Block);
}
TEST_F(TokenAnnotatorTest, StreamOperator) {
auto Tokens = annotate("\"foo\\n\" << aux << \"foo\\n\" << \"foo\";");
ASSERT_EQ(Tokens.size(), 9u) << Tokens;
EXPECT_FALSE(Tokens[1]->MustBreakBefore);
EXPECT_FALSE(Tokens[3]->MustBreakBefore);
// Only break between string literals if the former ends with \n.
EXPECT_TRUE(Tokens[5]->MustBreakBefore);
}
} // namespace
} // namespace format
} // namespace clang