Index: docs/ClangFormatStyleOptions.rst =================================================================== --- docs/ClangFormatStyleOptions.rst +++ docs/ClangFormatStyleOptions.rst @@ -269,6 +269,10 @@ Always break constructor initializers before commas and align the commas with the colon. +**BreakSingleLineRawStrings** (``bool``) + Allow breaking single-line raw string literals. Multi-line string + literals are always left alone. + **ColumnLimit** (``unsigned``) The column limit. Index: include/clang/Format/Format.h =================================================================== --- include/clang/Format/Format.h +++ include/clang/Format/Format.h @@ -278,6 +278,10 @@ /// \brief If \c true, always break before multiline string literals. bool AlwaysBreakBeforeMultilineStrings; + /// \brief Allow breaking single-line raw string literals. Multi-line string + /// literals are always left alone. + bool BreakSingleLineRawStrings; + /// \brief Different ways to use tab in formatting. enum UseTabStyle { /// Never use tab. @@ -428,6 +432,7 @@ R.AlwaysBreakTemplateDeclarations && AlwaysBreakBeforeMultilineStrings == R.AlwaysBreakBeforeMultilineStrings && + BreakSingleLineRawStrings == R.BreakSingleLineRawStrings && BinPackParameters == R.BinPackParameters && BinPackArguments == R.BinPackArguments && BreakBeforeBinaryOperators == R.BreakBeforeBinaryOperators && Index: lib/Format/ContinuationIndenter.cpp =================================================================== --- lib/Format/ContinuationIndenter.cpp +++ lib/Format/ContinuationIndenter.cpp @@ -1016,7 +1016,8 @@ Text.startswith(Prefix = "u8\"") || Text.startswith(Prefix = "L\""))) || (Text.startswith(Prefix = "_T(\"") && Text.endswith(Postfix = "\")")) || - getRawStringLiteralPrefixPostfix(Text, Prefix, Postfix)) { + (Style.BreakSingleLineRawStrings && + getRawStringLiteralPrefixPostfix(Text, Prefix, Postfix))) { Token.reset(new BreakableStringLiteral( Current, State.Line->Level, StartColumn, Prefix, Postfix, State.Line->InPPDirective, Encoding, Style)); Index: lib/Format/Format.cpp =================================================================== --- lib/Format/Format.cpp +++ lib/Format/Format.cpp @@ -200,6 +200,8 @@ Style.BreakBeforeTernaryOperators); IO.mapOptional("BreakConstructorInitializersBeforeComma", Style.BreakConstructorInitializersBeforeComma); + IO.mapOptional("BreakSingleLineRawStrings", + Style.BreakSingleLineRawStrings); IO.mapOptional("BinPackParameters", Style.BinPackParameters); IO.mapOptional("BinPackArguments", Style.BinPackArguments); IO.mapOptional("ColumnLimit", Style.ColumnLimit); @@ -346,6 +348,7 @@ LLVMStyle.BreakBeforeTernaryOperators = true; LLVMStyle.BreakBeforeBraces = FormatStyle::BS_Attach; LLVMStyle.BreakConstructorInitializersBeforeComma = false; + LLVMStyle.BreakSingleLineRawStrings = false; LLVMStyle.ColumnLimit = 80; LLVMStyle.CommentPragmas = "^ IWYU pragma:"; LLVMStyle.ConstructorInitializerAllOnOneLineOrOnePerLine = false; Index: unittests/Format/FormatTest.cpp =================================================================== --- unittests/Format/FormatTest.cpp +++ unittests/Format/FormatTest.cpp @@ -7387,21 +7387,40 @@ } TEST_F(FormatTest, BreaksRawStringLiterals) { + FormatStyle Style = getGoogleStyleWithColumns(15); + Style.BreakSingleLineRawStrings = true; EXPECT_EQ("R\"x(raw )x\"\n" "R\"x(literal)x\";", - format("R\"x(raw literal)x\";", getGoogleStyleWithColumns(15))); + format("R\"x(raw literal)x\";", Style)); + + Style.ColumnLimit = 16; EXPECT_EQ("uR\"x(raw )x\"\n" "uR\"x(literal)x\";", - format("uR\"x(raw literal)x\";", getGoogleStyleWithColumns(16))); - EXPECT_EQ("u8R\"x(raw )x\"\n" - "u8R\"x(literal)x\";", - format("u8R\"x(raw literal)x\";", getGoogleStyleWithColumns(17))); + format("uR\"x(raw literal)x\";", Style)); EXPECT_EQ("LR\"x(raw )x\"\n" "LR\"x(literal)x\";", - format("LR\"x(raw literal)x\";", getGoogleStyleWithColumns(16))); + format("LR\"x(raw literal)x\";", Style)); EXPECT_EQ("UR\"x(raw )x\"\n" "UR\"x(literal)x\";", - format("UR\"x(raw literal)x\";", getGoogleStyleWithColumns(16))); + format("UR\"x(raw literal)x\";", Style)); + + Style.ColumnLimit = 17; + EXPECT_EQ("u8R\"x(raw )x\"\n" + "u8R\"x(literal)x\";", + format("u8R\"x(raw literal)x\";", Style)); + + Style.BreakSingleLineRawStrings = false; + Style.ColumnLimit = 15; + EXPECT_EQ("R\"x(raw literal)x\";", format("R\"x(raw literal)x\";", Style)); + + Style.ColumnLimit = 16; + EXPECT_EQ("uR\"x(raw literal)x\";", format("uR\"x(raw literal)x\";", Style)); + EXPECT_EQ("LR\"x(raw literal)x\";", format("LR\"x(raw literal)x\";", Style)); + EXPECT_EQ("UR\"x(raw literal)x\";", format("UR\"x(raw literal)x\";", Style)); + + Style.ColumnLimit = 17; + EXPECT_EQ("u8R\"x(raw literal)x\";", + format("u8R\"x(raw literal)x\";", Style)); } TEST_F(FormatTest, BreaksStringLiteralsWithin_TMacro) { @@ -7592,9 +7611,11 @@ format("\"test\\000000000001\"", getLLVMStyleWithColumns(10))); // FIXME: We probably don't need to care about escape sequences in raw // literals. + FormatStyle Style = getGoogleStyleWithColumns(7); + Style.BreakSingleLineRawStrings = true; EXPECT_EQ("R\"(\\x)\"\n" "R\"(\\x00)\"\n", - format("R\"(\\x\\x00)\"\n", getGoogleStyleWithColumns(7))); + format("R\"(\\x\\x00)\"\n", Style)); } TEST_F(FormatTest, DoNotCreateUnreasonableUnwrappedLines) {