Skip to content

Commit ae90f68

Browse files
authored
[clang-format] Disable string breaking in JS for now (#66372)
See the discussion [here](#66168 (comment)). The functionality is not mature enough.
1 parent 0069004 commit ae90f68

File tree

4 files changed

+17
-132
lines changed

4 files changed

+17
-132
lines changed

clang/docs/ClangFormatStyleOptions.rst

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2783,17 +2783,17 @@ the configuration (without a prefix: ``Auto``).
27832783
const char* x =
27842784
"veryVeryVeryVeryVeryVeryVeryVeryVeryVeryVeryVeryLongString";
27852785

2786-
In C#, Java, and JavaScript:
2786+
In C# and Java:
27872787

27882788
.. code-block:: c++
27892789

27902790
true:
2791-
var x = "veryVeryVeryVeryVeryVe" +
2792-
"ryVeryVeryVeryVeryVery" +
2793-
"VeryLongString";
2791+
string x = "veryVeryVeryVeryVeryVe" +
2792+
"ryVeryVeryVeryVeryVery" +
2793+
"VeryLongString";
27942794

27952795
false:
2796-
var x =
2796+
string x =
27972797
"veryVeryVeryVeryVeryVeryVeryVeryVeryVeryVeryVeryLongString";
27982798

27992799
C# and JavaScript interpolated strings are not broken.

clang/include/clang/Format/Format.h

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2062,19 +2062,19 @@ struct FormatStyle {
20622062
/// "veryVeryVeryVeryVeryVeryVeryVeryVeryVeryVeryVeryLongString";
20632063
/// \endcode
20642064
///
2065-
/// In C#, Java, and JavaScript:
2065+
/// In C# and Java:
20662066
/// \code
20672067
/// true:
2068-
/// var x = "veryVeryVeryVeryVeryVe" +
2069-
/// "ryVeryVeryVeryVeryVery" +
2070-
/// "VeryLongString";
2068+
/// string x = "veryVeryVeryVeryVeryVe" +
2069+
/// "ryVeryVeryVeryVeryVery" +
2070+
/// "VeryLongString";
20712071
///
20722072
/// false:
2073-
/// var x =
2073+
/// string x =
20742074
/// "veryVeryVeryVeryVeryVeryVeryVeryVeryVeryVeryVeryLongString";
20752075
/// \endcode
20762076
///
2077-
/// C# and JavaScript interpolated strings are not broken.
2077+
/// C# interpolated strings are not broken.
20782078
///
20792079
/// In Verilog:
20802080
/// \code

clang/lib/Format/ContinuationIndenter.cpp

Lines changed: 4 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -2237,15 +2237,10 @@ ContinuationIndenter::createBreakableToken(const FormatToken &Current,
22372237
LineState &State, bool AllowBreak) {
22382238
unsigned StartColumn = State.Column - Current.ColumnWidth;
22392239
if (Current.isStringLiteral()) {
2240-
// Strings in JSON can not be broken.
2241-
if (Style.isJson() || !Style.BreakStringLiterals || !AllowBreak)
2242-
return nullptr;
2243-
2244-
// Strings in TypeScript types and dictionary keys can not be broken.
2245-
if (Style.isJavaScript() &&
2246-
(Current.is(TT_SelectorName) ||
2247-
State.Line->startsWith(Keywords.kw_type) ||
2248-
State.Line->startsWith(tok::kw_export, Keywords.kw_type))) {
2240+
// Strings in JSON cannot be broken. Breaking strings in JavaScript is
2241+
// disabled for now.
2242+
if (Style.isJson() || Style.isJavaScript() || !Style.BreakStringLiterals ||
2243+
!AllowBreak) {
22492244
return nullptr;
22502245
}
22512246

clang/unittests/Format/FormatTestJS.cpp

Lines changed: 2 additions & 112 deletions
Original file line numberDiff line numberDiff line change
@@ -1506,121 +1506,11 @@ TEST_F(FormatTestJS, StringLiteralConcatenation) {
15061506
verifyFormat("var literal = 'hello ' +\n"
15071507
" 'world';");
15081508

1509-
// Long strings should be broken.
1509+
// String breaking is disabled for now.
15101510
verifyFormat("var literal =\n"
1511-
" 'xxxxxxxx ' +\n"
1512-
" 'xxxxxxxx';",
1511+
" 'xxxxxxxx xxxxxxxx';",
15131512
"var literal = 'xxxxxxxx xxxxxxxx';",
15141513
getGoogleJSStyleWithColumns(17));
1515-
verifyFormat("var literal =\n"
1516-
" 'xxxxxxxx ' +\n"
1517-
" 'xxxxxxxx';",
1518-
"var literal = 'xxxxxxxx xxxxxxxx';",
1519-
getGoogleJSStyleWithColumns(18));
1520-
verifyFormat("var literal =\n"
1521-
" 'xxxxxxxx' +\n"
1522-
" ' xxxxxxxx';",
1523-
"var literal = 'xxxxxxxx xxxxxxxx';",
1524-
getGoogleJSStyleWithColumns(16));
1525-
// The quotes should be correct.
1526-
for (char OriginalQuote : {'\'', '"'}) {
1527-
auto VerifyQuotes = [=](FormatStyle::JavaScriptQuoteStyle StyleQuote,
1528-
char TargetQuote) {
1529-
auto Style = getGoogleJSStyleWithColumns(17);
1530-
Style.JavaScriptQuotes = StyleQuote;
1531-
std::string Target{"var literal =\n"
1532-
" \"xxxxxxxx \" +\n"
1533-
" \"xxxxxxxx\";"};
1534-
std::string Original{"var literal = \"xxxxxxxx xxxxxxxx\";"};
1535-
std::replace(Target.begin(), Target.end(), '"', TargetQuote);
1536-
std::replace(Original.begin(), Original.end(), '"', OriginalQuote);
1537-
verifyFormat(Target, Original, Style);
1538-
};
1539-
VerifyQuotes(FormatStyle::JSQS_Leave, OriginalQuote);
1540-
VerifyQuotes(FormatStyle::JSQS_Single, '\'');
1541-
VerifyQuotes(FormatStyle::JSQS_Double, '"');
1542-
}
1543-
// Parentheses should be added when necessary.
1544-
verifyFormat("var literal =\n"
1545-
" ('xxxxxxxx ' +\n"
1546-
" 'xxxxxx')[0];",
1547-
"var literal = 'xxxxxxxx xxxxxx'[0];",
1548-
getGoogleJSStyleWithColumns(18));
1549-
auto Style = getGoogleJSStyleWithColumns(20);
1550-
Style.SpacesInParens = FormatStyle::SIPO_Custom;
1551-
Style.SpacesInParensOptions.Other = true;
1552-
verifyFormat("var literal =\n"
1553-
" ( 'xxxxxxxx ' +\n"
1554-
" 'xxxxxx' )[0];",
1555-
"var literal = 'xxxxxxxx xxxxxx'[0];", Style);
1556-
// FIXME: When the part before the string literal is shorter than the
1557-
// continuation indentation, and the option AlignAfterOpenBracket is set to
1558-
// AlwaysBreak which is the default for the Google style, the unbroken string
1559-
// does not get to a new line while the broken string does due to the added
1560-
// parentheses. The formatter does not do it in one pass.
1561-
EXPECT_EQ(
1562-
"x = ('xxxxxxxx ' +\n"
1563-
" 'xxxxxx')[0];",
1564-
format("x = 'xxxxxxxx xxxxxx'[0];", getGoogleJSStyleWithColumns(18)));
1565-
verifyFormat("x =\n"
1566-
" ('xxxxxxxx ' +\n"
1567-
" 'xxxxxx')[0];",
1568-
getGoogleJSStyleWithColumns(18));
1569-
// Breaking of template strings and regular expressions is not implemented.
1570-
verifyFormat("var literal =\n"
1571-
" `xxxxxxxx xxxxxxxx`;",
1572-
getGoogleJSStyleWithColumns(18));
1573-
verifyFormat("var literal =\n"
1574-
" /xxxxxxxx xxxxxxxx/;",
1575-
getGoogleJSStyleWithColumns(18));
1576-
// There can be breaks in the code inside a template string.
1577-
verifyFormat("var literal = `xxxxxx ${\n"
1578-
" xxxxxxxxxx} xxxxxx`;",
1579-
"var literal = `xxxxxx ${xxxxxxxxxx} xxxxxx`;",
1580-
getGoogleJSStyleWithColumns(14));
1581-
verifyFormat("var literal = `xxxxxx ${\n"
1582-
" xxxxxxxxxx} xxxxxx`;",
1583-
"var literal = `xxxxxx ${xxxxxxxxxx} xxxxxx`;",
1584-
getGoogleJSStyleWithColumns(15));
1585-
// Identifiers inside the code inside a template string should not be broken
1586-
// even if the column limit is exceeded. This following behavior is not
1587-
// optimal. The part after the closing brace which exceeds the column limit
1588-
// can be put on a new line. Change this test when it is implemented.
1589-
verifyFormat("var literal = `xxxxxx ${\n"
1590-
" xxxxxxxxxxxxxxxxxxxxxx} xxxxxx`;",
1591-
"var literal = `xxxxxx ${xxxxxxxxxxxxxxxxxxxxxx} xxxxxx`;",
1592-
getGoogleJSStyleWithColumns(14));
1593-
verifyFormat("var literal = `xxxxxx ${\n"
1594-
" xxxxxxxxxxxxxxxxxxxxxx +\n"
1595-
" xxxxxxxxxxxxxxxxxxxxxx} xxxxxx`;",
1596-
"var literal = `xxxxxx ${xxxxxxxxxxxxxxxxxxxxxx + "
1597-
"xxxxxxxxxxxxxxxxxxxxxx} xxxxxx`;",
1598-
getGoogleJSStyleWithColumns(14));
1599-
1600-
// Strings in a TypeScript type declaration can't be broken.
1601-
verifyFormat("type x =\n"
1602-
" 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx';",
1603-
getGoogleJSStyleWithColumns(20));
1604-
verifyFormat("/* type */ type x =\n"
1605-
" 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx';",
1606-
getGoogleJSStyleWithColumns(20));
1607-
verifyFormat("export type x =\n"
1608-
" 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx';",
1609-
getGoogleJSStyleWithColumns(20));
1610-
// Dictionary keys can't be broken. Values can be broken.
1611-
verifyFormat("var w = {\n"
1612-
" 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx':\n"
1613-
" 'xxxxxxxxxx' +\n"
1614-
" 'xxxxxxxxxx' +\n"
1615-
" 'xxxxxxxxxx' +\n"
1616-
" 'xxxxxxxxxx' +\n"
1617-
" 'xxx',\n"
1618-
"};",
1619-
"var w = {\n"
1620-
" 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx':\n"
1621-
" 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx',\n"
1622-
"};",
1623-
getGoogleJSStyleWithColumns(20));
16241514
}
16251515

16261516
TEST_F(FormatTestJS, RegexLiteralClassification) {

0 commit comments

Comments
 (0)