llvmbot wrote:
<!--LLVM PR SUMMARY COMMENT--> @llvm/pr-subscribers-clang-format <details> <summary>Changes</summary> See the discussion [here](https://github.com/llvm/llvm-project/pull/66168#issuecomment-1719038797). The functionality is not mature enough. -- Full diff: https://github.com/llvm/llvm-project/pull/66372.diff 4 Files Affected: - (modified) clang/docs/ClangFormatStyleOptions.rst (+5-5) - (modified) clang/include/clang/Format/Format.h (+5-5) - (modified) clang/lib/Format/ContinuationIndenter.cpp (+4-9) - (modified) clang/unittests/Format/FormatTestJS.cpp (+2-112) <pre> diff --git a/clang/docs/ClangFormatStyleOptions.rst b/clang/docs/ClangFormatStyleOptions.rst index d5d9faa5c78cffb..4ab0b3a207270dc 100644 --- a/clang/docs/ClangFormatStyleOptions.rst +++ b/clang/docs/ClangFormatStyleOptions.rst @@ -2783,17 +2783,17 @@ the configuration (without a prefix: ``Auto``). const char* x = &quot;veryVeryVeryVeryVeryVeryVeryVeryVeryVeryVeryVeryLongString&quot;; - In C#, Java, and JavaScript: + In C# and Java: .. code-block:: c++ true: - var x = &quot;veryVeryVeryVeryVeryVe&quot; + - &quot;ryVeryVeryVeryVeryVery&quot; + - &quot;VeryLongString&quot;; + string x = &quot;veryVeryVeryVeryVeryVe&quot; + + &quot;ryVeryVeryVeryVeryVery&quot; + + &quot;VeryLongString&quot;; false: - var x = + string x = &quot;veryVeryVeryVeryVeryVeryVeryVeryVeryVeryVeryVeryLongString&quot;; C# and JavaScript interpolated strings are not broken. diff --git a/clang/include/clang/Format/Format.h b/clang/include/clang/Format/Format.h index c7bd356b7faeded..3bf70838d059086 100644 --- a/clang/include/clang/Format/Format.h +++ b/clang/include/clang/Format/Format.h @@ -2062,15 +2062,15 @@ struct FormatStyle { /// &quot;veryVeryVeryVeryVeryVeryVeryVeryVeryVeryVeryVeryLongString&quot;; /// \endcode /// - /// In C#, Java, and JavaScript: + /// In C# and Java: /// \code /// true: - /// var x = &quot;veryVeryVeryVeryVeryVe&quot; + - /// &quot;ryVeryVeryVeryVeryVery&quot; + - /// &quot;VeryLongString&quot;; + /// string x = &quot;veryVeryVeryVeryVeryVe&quot; + + /// &quot;ryVeryVeryVeryVeryVery&quot; + + /// &quot;VeryLongString&quot;; /// /// false: - /// var x = + /// string x = /// &quot;veryVeryVeryVeryVeryVeryVeryVeryVeryVeryVeryVeryLongString&quot;; /// \endcode /// diff --git a/clang/lib/Format/ContinuationIndenter.cpp b/clang/lib/Format/ContinuationIndenter.cpp index 6673b5c703b835f..15b9ad41a37af59 100644 --- a/clang/lib/Format/ContinuationIndenter.cpp +++ b/clang/lib/Format/ContinuationIndenter.cpp @@ -2237,15 +2237,10 @@ ContinuationIndenter::createBreakableToken(const FormatToken &amp;Current, LineState &amp;State, bool AllowBreak) { unsigned StartColumn = State.Column - Current.ColumnWidth; if (Current.isStringLiteral()) { - // Strings in JSON can not be broken. - if (Style.isJson() || !Style.BreakStringLiterals || !AllowBreak) - return nullptr; - - // Strings in TypeScript types and dictionary keys can not be broken. - if (Style.isJavaScript() &amp;&amp; - (Current.is(TT_SelectorName) || - State.Line-&gt;startsWith(Keywords.kw_type) || - State.Line-&gt;startsWith(tok::kw_export, Keywords.kw_type))) { + // Strings in JSON can not be broken. Breaking strings in JavaScript is + // disabled for now. + if (Style.isJson() || Style.isJavaScript() || !Style.BreakStringLiterals || + !AllowBreak) { return nullptr; } diff --git a/clang/unittests/Format/FormatTestJS.cpp b/clang/unittests/Format/FormatTestJS.cpp index 51543d0a54d8561..23b010dbc982684 100644 --- a/clang/unittests/Format/FormatTestJS.cpp +++ b/clang/unittests/Format/FormatTestJS.cpp @@ -1506,121 +1506,11 @@ TEST_F(FormatTestJS, StringLiteralConcatenation) { verifyFormat(&quot;var literal = &#x27;hello &#x27; +\n&quot; &quot; &#x27;world&#x27;;&quot;); - // Long strings should be broken. + // String breaking is disabled for now. verifyFormat(&quot;var literal =\n&quot; - &quot; &#x27;xxxxxxxx &#x27; +\n&quot; - &quot; &#x27;xxxxxxxx&#x27;;&quot;, + &quot; &#x27;xxxxxxxx xxxxxxxx&#x27;;&quot;, &quot;var literal = &#x27;xxxxxxxx xxxxxxxx&#x27;;&quot;, getGoogleJSStyleWithColumns(17)); - verifyFormat(&quot;var literal =\n&quot; - &quot; &#x27;xxxxxxxx &#x27; +\n&quot; - &quot; &#x27;xxxxxxxx&#x27;;&quot;, - &quot;var literal = &#x27;xxxxxxxx xxxxxxxx&#x27;;&quot;, - getGoogleJSStyleWithColumns(18)); - verifyFormat(&quot;var literal =\n&quot; - &quot; &#x27;xxxxxxxx&#x27; +\n&quot; - &quot; &#x27; xxxxxxxx&#x27;;&quot;, - &quot;var literal = &#x27;xxxxxxxx xxxxxxxx&#x27;;&quot;, - getGoogleJSStyleWithColumns(16)); - // The quotes should be correct. - for (char OriginalQuote : {&#x27;\&#x27;&#x27;, &#x27;&quot;&#x27;}) { - auto VerifyQuotes = [=](FormatStyle::JavaScriptQuoteStyle StyleQuote, - char TargetQuote) { - auto Style = getGoogleJSStyleWithColumns(17); - Style.JavaScriptQuotes = StyleQuote; - std::string Target{&quot;var literal =\n&quot; - &quot; \&quot;xxxxxxxx \&quot; +\n&quot; - &quot; \&quot;xxxxxxxx\&quot;;&quot;}; - std::string Original{&quot;var literal = \&quot;xxxxxxxx xxxxxxxx\&quot;;&quot;}; - std::replace(Target.begin(), Target.end(), &#x27;&quot;&#x27;, TargetQuote); - std::replace(Original.begin(), Original.end(), &#x27;&quot;&#x27;, OriginalQuote); - verifyFormat(Target, Original, Style); - }; - VerifyQuotes(FormatStyle::JSQS_Leave, OriginalQuote); - VerifyQuotes(FormatStyle::JSQS_Single, &#x27;\&#x27;&#x27;); - VerifyQuotes(FormatStyle::JSQS_Double, &#x27;&quot;&#x27;); - } - // Parentheses should be added when necessary. - verifyFormat(&quot;var literal =\n&quot; - &quot; (&#x27;xxxxxxxx &#x27; +\n&quot; - &quot; &#x27;xxxxxx&#x27;)[0];&quot;, - &quot;var literal = &#x27;xxxxxxxx xxxxxx&#x27;[0];&quot;, - getGoogleJSStyleWithColumns(18)); - auto Style = getGoogleJSStyleWithColumns(20); - Style.SpacesInParens = FormatStyle::SIPO_Custom; - Style.SpacesInParensOptions.Other = true; - verifyFormat(&quot;var literal =\n&quot; - &quot; ( &#x27;xxxxxxxx &#x27; +\n&quot; - &quot; &#x27;xxxxxx&#x27; )[0];&quot;, - &quot;var literal = &#x27;xxxxxxxx xxxxxx&#x27;[0];&quot;, Style); - // FIXME: When the part before the string literal is shorter than the - // continuation indentation, and the option AlignAfterOpenBracket is set to - // AlwaysBreak which is the default for the Google style, the unbroken string - // does not get to a new line while the broken string does due to the added - // parentheses. The formatter does not do it in one pass. - EXPECT_EQ( - &quot;x = (&#x27;xxxxxxxx &#x27; +\n&quot; - &quot; &#x27;xxxxxx&#x27;)[0];&quot;, - format(&quot;x = &#x27;xxxxxxxx xxxxxx&#x27;[0];&quot;, getGoogleJSStyleWithColumns(18))); - verifyFormat(&quot;x =\n&quot; - &quot; (&#x27;xxxxxxxx &#x27; +\n&quot; - &quot; &#x27;xxxxxx&#x27;)[0];&quot;, - getGoogleJSStyleWithColumns(18)); - // Breaking of template strings and regular expressions is not implemented. - verifyFormat(&quot;var literal =\n&quot; - &quot; `xxxxxxxx xxxxxxxx`;&quot;, - getGoogleJSStyleWithColumns(18)); - verifyFormat(&quot;var literal =\n&quot; - &quot; /xxxxxxxx xxxxxxxx/;&quot;, - getGoogleJSStyleWithColumns(18)); - // There can be breaks in the code inside a template string. - verifyFormat(&quot;var literal = `xxxxxx ${\n&quot; - &quot; xxxxxxxxxx} xxxxxx`;&quot;, - &quot;var literal = `xxxxxx ${xxxxxxxxxx} xxxxxx`;&quot;, - getGoogleJSStyleWithColumns(14)); - verifyFormat(&quot;var literal = `xxxxxx ${\n&quot; - &quot; xxxxxxxxxx} xxxxxx`;&quot;, - &quot;var literal = `xxxxxx ${xxxxxxxxxx} xxxxxx`;&quot;, - getGoogleJSStyleWithColumns(15)); - // Identifiers inside the code inside a template string should not be broken - // even if the column limit is exceeded. This following behavior is not - // optimal. The part after the closing brace which exceeds the column limit - // can be put on a new line. Change this test when it is implemented. - verifyFormat(&quot;var literal = `xxxxxx ${\n&quot; - &quot; xxxxxxxxxxxxxxxxxxxxxx} xxxxxx`;&quot;, - &quot;var literal = `xxxxxx ${xxxxxxxxxxxxxxxxxxxxxx} xxxxxx`;&quot;, - getGoogleJSStyleWithColumns(14)); - verifyFormat(&quot;var literal = `xxxxxx ${\n&quot; - &quot; xxxxxxxxxxxxxxxxxxxxxx +\n&quot; - &quot; xxxxxxxxxxxxxxxxxxxxxx} xxxxxx`;&quot;, - &quot;var literal = `xxxxxx ${xxxxxxxxxxxxxxxxxxxxxx + &quot; - &quot;xxxxxxxxxxxxxxxxxxxxxx} xxxxxx`;&quot;, - getGoogleJSStyleWithColumns(14)); - - // Strings in a TypeScript type declaration can&#x27;t be broken. - verifyFormat(&quot;type x =\n&quot; - &quot; &#x27;xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx&#x27;;&quot;, - getGoogleJSStyleWithColumns(20)); - verifyFormat(&quot;/* type */ type x =\n&quot; - &quot; &#x27;xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx&#x27;;&quot;, - getGoogleJSStyleWithColumns(20)); - verifyFormat(&quot;export type x =\n&quot; - &quot; &#x27;xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx&#x27;;&quot;, - getGoogleJSStyleWithColumns(20)); - // Dictionary keys can&#x27;t be broken. Values can be broken. - verifyFormat(&quot;var w = {\n&quot; - &quot; &#x27;xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx&#x27;:\n&quot; - &quot; &#x27;xxxxxxxxxx&#x27; +\n&quot; - &quot; &#x27;xxxxxxxxxx&#x27; +\n&quot; - &quot; &#x27;xxxxxxxxxx&#x27; +\n&quot; - &quot; &#x27;xxxxxxxxxx&#x27; +\n&quot; - &quot; &#x27;xxx&#x27;,\n&quot; - &quot;};&quot;, - &quot;var w = {\n&quot; - &quot; &#x27;xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx&#x27;:\n&quot; - &quot; &#x27;xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx&#x27;,\n&quot; - &quot;};&quot;, - getGoogleJSStyleWithColumns(20)); } TEST_F(FormatTestJS, RegexLiteralClassification) { </pre> </details> https://github.com/llvm/llvm-project/pull/66372 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits