diff --git a/include/clang/Tooling/ReplacementsYaml.h b/include/clang/Tooling/ReplacementsYaml.h index 83e35d62325..2e3e401652e 100644 --- a/include/clang/Tooling/ReplacementsYaml.h +++ b/include/clang/Tooling/ReplacementsYaml.h @@ -35,7 +35,13 @@ template <> struct MappingTraits { NormalizedReplacement(const IO &, const clang::tooling::Replacement &R) : FilePath(R.getFilePath()), Offset(R.getOffset()), - Length(R.getLength()), ReplacementText(R.getReplacementText()) {} + Length(R.getLength()), ReplacementText(R.getReplacementText()) { + size_t lineBreakPos = ReplacementText.find('\n'); + while (lineBreakPos != std::string::npos) { + ReplacementText.replace(lineBreakPos, 1, "\n\n"); + lineBreakPos = ReplacementText.find('\n', lineBreakPos + 2); + } + } clang::tooling::Replacement denormalize(const IO &) { return clang::tooling::Replacement(FilePath, Offset, Length, diff --git a/unittests/Tooling/DiagnosticsYamlTest.cpp b/unittests/Tooling/DiagnosticsYamlTest.cpp index aaba2589111..334c3173222 100644 --- a/unittests/Tooling/DiagnosticsYamlTest.cpp +++ b/unittests/Tooling/DiagnosticsYamlTest.cpp @@ -42,34 +42,34 @@ static Diagnostic makeDiagnostic(StringRef DiagnosticName, static const char *YAMLContent = "---\n" "MainSourceFile: 'path/to/source.cpp'\n" - "Diagnostics: \n" + "Diagnostics:\n" " - DiagnosticName: 'diagnostic#1\'\n" - " DiagnosticMessage: \n" + " DiagnosticMessage:\n" " Message: 'message #1'\n" " FilePath: 'path/to/source.cpp'\n" " FileOffset: 55\n" - " Replacements: \n" + " Replacements:\n" " - FilePath: 'path/to/source.cpp'\n" " Offset: 100\n" " Length: 12\n" " ReplacementText: 'replacement #1'\n" " - DiagnosticName: 'diagnostic#2'\n" - " DiagnosticMessage: \n" + " DiagnosticMessage:\n" " Message: 'message #2'\n" " FilePath: 'path/to/header.h'\n" " FileOffset: 60\n" - " Replacements: \n" + " Replacements:\n" " - FilePath: 'path/to/header.h'\n" " Offset: 62\n" " Length: 2\n" " ReplacementText: 'replacement #2'\n" " - DiagnosticName: 'diagnostic#3'\n" - " DiagnosticMessage: \n" + " DiagnosticMessage:\n" " Message: 'message #3'\n" " FilePath: 'path/to/source2.cpp'\n" " FileOffset: 72\n" " Replacements: []\n" - " Notes: \n" + " Notes:\n" " - Message: Note1\n" " FilePath: 'path/to/note1.cpp'\n" " FileOffset: 88\n" diff --git a/unittests/Tooling/RefactoringActionRulesTest.cpp b/unittests/Tooling/RefactoringActionRulesTest.cpp index 7daef33337b..b471cf207cf 100644 --- a/unittests/Tooling/RefactoringActionRulesTest.cpp +++ b/unittests/Tooling/RefactoringActionRulesTest.cpp @@ -118,7 +118,7 @@ TEST_F(RefactoringActionRulesTest, MyFirstRefactoringRule) { "Error: ''\n" "InsertedHeaders: []\n" "RemovedHeaders: []\n" - "Replacements: \n" // Extra whitespace here! + "Replacements:\n" " - FilePath: input.cpp\n" " Offset: 30\n" " Length: 1\n" diff --git a/unittests/Tooling/RefactoringTest.cpp b/unittests/Tooling/RefactoringTest.cpp index 2b1ac52419f..f5926eaf1a8 100644 --- a/unittests/Tooling/RefactoringTest.cpp +++ b/unittests/Tooling/RefactoringTest.cpp @@ -1172,11 +1172,11 @@ TEST_F(AtomicChangeTest, AtomicChangeToYAML) { "Key: 'input.cpp:20'\n" "FilePath: input.cpp\n" "Error: ''\n" - "InsertedHeaders: \n" // Extra whitespace here! + "InsertedHeaders:\n" " - a.h\n" - "RemovedHeaders: \n" // Extra whitespace here! + "RemovedHeaders:\n" " - b.h\n" - "Replacements: \n" // Extra whitespace here! + "Replacements:\n" " - FilePath: input.cpp\n" " Offset: 20\n" " Length: 0\n" @@ -1194,11 +1194,11 @@ TEST_F(AtomicChangeTest, YAMLToAtomicChange) { "Key: 'input.cpp:20'\n" "FilePath: input.cpp\n" "Error: 'ok'\n" - "InsertedHeaders: \n" // Extra whitespace here! + "InsertedHeaders:\n" " - a.h\n" - "RemovedHeaders: \n" // Extra whitespace here! + "RemovedHeaders:\n" " - b.h\n" - "Replacements: \n" // Extra whitespace here! + "Replacements:\n" " - FilePath: input.cpp\n" " Offset: 20\n" " Length: 0\n" diff --git a/unittests/Tooling/ReplacementsYamlTest.cpp b/unittests/Tooling/ReplacementsYamlTest.cpp index ab9f6c9b5d3..c8fe9c4db41 100644 --- a/unittests/Tooling/ReplacementsYamlTest.cpp +++ b/unittests/Tooling/ReplacementsYamlTest.cpp @@ -33,7 +33,7 @@ TEST(ReplacementsYamlTest, serializesReplacements) { // NOTE: If this test starts to fail for no obvious reason, check whitespace. ASSERT_STREQ("---\n" "MainSourceFile: '/path/to/source.cpp'\n" - "Replacements: \n" // Extra whitespace here! + "Replacements:\n" " - FilePath: '/path/to/file1.h'\n" " Offset: 232\n" " Length: 56\n" @@ -46,6 +46,30 @@ TEST(ReplacementsYamlTest, serializesReplacements) { YamlContentStream.str().c_str()); } +TEST(ReplacementsYamlTest, serializesNewLines) { + TranslationUnitReplacements Doc; + + Doc.MainSourceFile = "/path/to/source.cpp"; + Doc.Replacements.emplace_back("/path/to/file1.h", 0, 0, "#include \n"); + + std::string YamlContent; + llvm::raw_string_ostream YamlContentStream(YamlContent); + + yaml::Output YAML(YamlContentStream); + YAML << Doc; + + // NOTE: If this test starts to fail for no obvious reason, check whitespace. + ASSERT_STREQ("---\n" + "MainSourceFile: '/path/to/source.cpp'\n" + "Replacements:\n" + " - FilePath: '/path/to/file1.h'\n" + " Offset: 0\n" + " Length: 0\n" + " ReplacementText: '#include \n\n'\n" + "...\n", + YamlContentStream.str().c_str()); +} + TEST(ReplacementsYamlTest, deserializesReplacements) { std::string YamlContent = "---\n" "MainSourceFile: /path/to/source.cpp\n"