Skip to content

Commit

Permalink
[clang-format] Remove spurious JSON binding when DisableFormat = true
Browse files Browse the repository at this point in the history
Relevant issue: #52705

When the `DisableFormat` option of `clang-format` is set to `true` and a JSON file is formatted, the ephemeral variable binding that is added to the top-level object is not removed from the formatted file.  For example, this JSON:
```
{
  "key": "value"
}
```
Is reformatted to:
```
x = {
  "key": "value"
}
```
Which is not valid JSON syntax.  This fix avoids the addition of this binding when `DisableFormat` is set to `true`, ensuring that it cannot be left behind when formatting is disabled.

Reviewed By: MyDeveloperDay, HazardyKnusperkeks

Differential Revision: https://reviews.llvm.org/D115769

Fixes #52705
  • Loading branch information
Andrew-William-Smith authored and mydeveloperday committed Dec 15, 2021
1 parent a94aab1 commit 63a5657
Show file tree
Hide file tree
Showing 2 changed files with 27 additions and 3 deletions.
2 changes: 1 addition & 1 deletion clang/tools/clang-format/ClangFormat.cpp
Expand Up @@ -460,7 +460,7 @@ static bool format(StringRef FileName) {

// To format JSON insert a variable to trick the code into thinking its
// JavaScript.
if (FormatStyle->isJson()) {
if (FormatStyle->isJson() && !FormatStyle->DisableFormat) {
auto Err = Replaces.add(tooling::Replacement(
tooling::Replacement(AssumedFileName, 0, 0, "x = ")));
if (Err) {
Expand Down
28 changes: 26 additions & 2 deletions clang/unittests/Format/FormatTestJson.cpp
Expand Up @@ -27,7 +27,7 @@ class FormatTestJson : public ::testing::Test {

// Mock up what ClangFormat.cpp will do for JSON by adding a variable
// to trick JSON into being JavaScript
if (Style.isJson()) {
if (Style.isJson() && !Style.DisableFormat) {
auto Err = Replaces.add(
tooling::Replacement(tooling::Replacement("", 0, 0, "x = ")));
if (Err) {
Expand Down Expand Up @@ -60,10 +60,15 @@ class FormatTestJson : public ::testing::Test {
return Style;
}

static void verifyFormatStable(llvm::StringRef Code,
const FormatStyle &Style) {
EXPECT_EQ(Code.str(), format(Code, Style)) << "Expected code is not stable";
}

static void
verifyFormat(llvm::StringRef Code,
const FormatStyle &Style = getLLVMStyle(FormatStyle::LK_Json)) {
EXPECT_EQ(Code.str(), format(Code, Style)) << "Expected code is not stable";
verifyFormatStable(Code, Style);
EXPECT_EQ(Code.str(), format(test::messUp(Code), Style));
}
};
Expand Down Expand Up @@ -193,5 +198,24 @@ TEST_F(FormatTestJson, JsonNoStringSplit) {
Style);
}

TEST_F(FormatTestJson, DisableJsonFormat) {
FormatStyle Style = getLLVMStyle(FormatStyle::LK_Json);
verifyFormatStable("{}", Style);
verifyFormatStable("{\n"
" \"name\": 1\n"
"}",
Style);

// Since we have to disable formatting to run this test, we shall refrain from
// calling test::messUp lest we change the unformatted code and cannot format
// it back to how it started.
Style.DisableFormat = true;
verifyFormatStable("{}", Style);
verifyFormatStable("{\n"
" \"name\": 1\n"
"}",
Style);
}

} // namespace format
} // end namespace clang

0 comments on commit 63a5657

Please sign in to comment.