[clang] [clang-format] Stop breaking unbreakable strings in JS (PR #66168)
via cfe-commits
cfe-commits at lists.llvm.org
Tue Sep 12 20:43:46 PDT 2023
https://github.com/sstwcw created https://github.com/llvm/llvm-project/pull/66168:
Dictionary literal keys and strings in TypeScript type declarations can not be broken.
The problem was pointed out by @alexfh and @e-kud here:
https://reviews.llvm.org/D154093#4644512
>From 201f6b1b34a3b4317ebbe370c23280c8246867c6 Mon Sep 17 00:00:00 2001
From: sstwcw <su3e8a96kzlver at posteo.net>
Date: Wed, 13 Sep 2023 03:39:30 +0000
Subject: [PATCH] [clang-format] Stop breaking unbreakable strings in JS
Dictionary literal keys and strings in TypeScript type declarations can
not be broken.
The problem was pointed out by @alexfh and @e-kud here:
https://reviews.llvm.org/D154093#4644512
---
clang/lib/Format/ContinuationIndenter.cpp | 6 +++++
clang/unittests/Format/FormatTestJS.cpp | 22 +++++++++++++++++++
clang/unittests/Format/TokenAnnotatorTest.cpp | 19 ++++++++++++++++
3 files changed, 47 insertions(+)
diff --git a/clang/lib/Format/ContinuationIndenter.cpp b/clang/lib/Format/ContinuationIndenter.cpp
index ac62dab1b07cdca..75ab08de42ea0e8 100644
--- a/clang/lib/Format/ContinuationIndenter.cpp
+++ b/clang/lib/Format/ContinuationIndenter.cpp
@@ -2241,6 +2241,12 @@ ContinuationIndenter::createBreakableToken(const FormatToken &Current,
if (Style.isJson() || !Style.BreakStringLiterals || !AllowBreak)
return nullptr;
+ // Strings in TypeScript types and dictionary keys can not be broken.
+ if (Style.isJavaScript() && (Current.is(TT_SelectorName) ||
+ State.Line->startsWith(Keywords.kw_type))) {
+ return nullptr;
+ }
+
// Don't break string literals inside preprocessor directives (except for
// #define directives, as their contents are stored in separate lines and
// are not affected by this check).
diff --git a/clang/unittests/Format/FormatTestJS.cpp b/clang/unittests/Format/FormatTestJS.cpp
index bc4c7ff7ba6b30f..309326569143df6 100644
--- a/clang/unittests/Format/FormatTestJS.cpp
+++ b/clang/unittests/Format/FormatTestJS.cpp
@@ -1596,6 +1596,28 @@ TEST_F(FormatTestJS, StringLiteralConcatenation) {
"var literal = `xxxxxx ${xxxxxxxxxxxxxxxxxxxxxx + "
"xxxxxxxxxxxxxxxxxxxxxx} xxxxxx`;",
getGoogleJSStyleWithColumns(14));
+
+ // Strings in a TypeScript type declaration can't be broken.
+ verifyFormat("type x =\n"
+ " 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx';",
+ getGoogleJSStyleWithColumns(20));
+ verifyFormat("/* type */ type x =\n"
+ " 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx';",
+ getGoogleJSStyleWithColumns(20));
+ // Dictionary keys can't be broken. Values can be broken.
+ verifyFormat("var w = {\n"
+ " 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx':\n"
+ " 'xxxxxxxxxx' +\n"
+ " 'xxxxxxxxxx' +\n"
+ " 'xxxxxxxxxx' +\n"
+ " 'xxxxxxxxxx' +\n"
+ " 'xxx',\n"
+ "};",
+ "var w = {\n"
+ " 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx':\n"
+ " 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx',\n"
+ "};",
+ getGoogleJSStyleWithColumns(20));
}
TEST_F(FormatTestJS, RegexLiteralClassification) {
diff --git a/clang/unittests/Format/TokenAnnotatorTest.cpp b/clang/unittests/Format/TokenAnnotatorTest.cpp
index 434852983712940..9ab1eae85f29c4d 100644
--- a/clang/unittests/Format/TokenAnnotatorTest.cpp
+++ b/clang/unittests/Format/TokenAnnotatorTest.cpp
@@ -2040,6 +2040,25 @@ TEST_F(TokenAnnotatorTest, UnderstandDesignatedInitializers) {
EXPECT_TOKEN(Tokens[13], tok::period, TT_DesignatedInitializerPeriod);
}
+TEST_F(TokenAnnotatorTest, UnderstandsJavaScript) {
+ auto Annotate = [this](llvm::StringRef Code) {
+ return annotate(Code, getLLVMStyle(FormatStyle::LK_JavaScript));
+ };
+
+ // Dictionary.
+ auto Tokens = Annotate("var x = {'x' : 1, 'y' : 2};");
+ ASSERT_EQ(Tokens.size(), 14u) << Tokens;
+ EXPECT_TOKEN(Tokens[3], tok::l_brace, TT_DictLiteral);
+ EXPECT_TOKEN(Tokens[4], tok::string_literal, TT_SelectorName);
+ EXPECT_TOKEN(Tokens[5], tok::colon, TT_DictLiteral);
+ EXPECT_TOKEN(Tokens[8], tok::string_literal, TT_SelectorName);
+ EXPECT_TOKEN(Tokens[9], tok::colon, TT_DictLiteral);
+ // Change when we need to annotate these.
+ EXPECT_BRACE_KIND(Tokens[3], BK_Unknown);
+ EXPECT_BRACE_KIND(Tokens[11], BK_Unknown);
+ EXPECT_TOKEN(Tokens[11], tok::r_brace, TT_Unknown);
+}
+
} // namespace
} // namespace format
} // namespace clang
More information about the cfe-commits
mailing list