[clang] [clang-format] Disable string breaking in JS for now (PR #66372)

via cfe-commits cfe-commits at lists.llvm.org
Thu Sep 14 06:18:01 PDT 2023


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


More information about the cfe-commits mailing list