Skip to content

Commit

Permalink
[clang-format] append newline after code when inserting new headers a…
Browse files Browse the repository at this point in the history
…t the end of the code which does not end with newline.

Summary:
append newline after code when inserting new headers at the end of the
code which does not end with newline.

Reviewers: djasper

Subscribers: cfe-commits, klimek

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

llvm-svn: 283330
  • Loading branch information
Eric Liu committed Oct 5, 2016
1 parent c26c03d commit 11a4237
Show file tree
Hide file tree
Showing 2 changed files with 20 additions and 3 deletions.
9 changes: 9 additions & 0 deletions clang/lib/Format/Format.cpp
Expand Up @@ -1662,6 +1662,7 @@ fixCppIncludeInsertions(StringRef Code, const tooling::Replacements &Replaces,
if (CategoryEndOffsets.find(*I) == CategoryEndOffsets.end())
CategoryEndOffsets[*I] = CategoryEndOffsets[*std::prev(I)];

bool NeedNewLineAtEnd = !Code.empty() && Code.back() != '\n';
for (const auto &R : HeaderInsertions) {
auto IncludeDirective = R.getReplacementText();
bool Matched = IncludeRegex.match(IncludeDirective, &Matches);
Expand All @@ -1680,10 +1681,18 @@ fixCppIncludeInsertions(StringRef Code, const tooling::Replacements &Replaces,
std::string NewInclude = !IncludeDirective.endswith("\n")
? (IncludeDirective + "\n").str()
: IncludeDirective.str();
// When inserting headers at end of the code, also append '\n' to the code
// if it does not end with '\n'.
if (NeedNewLineAtEnd && Offset == Code.size()) {
NewInclude = "\n" + NewInclude;
NeedNewLineAtEnd = false;
}
auto NewReplace = tooling::Replacement(FileName, Offset, 0, NewInclude);
auto Err = Result.add(NewReplace);
if (Err) {
llvm::consumeError(std::move(Err));
unsigned NewOffset = Result.getShiftedCodePosition(Offset);
NewReplace = tooling::Replacement(FileName, NewOffset, 0, NewInclude);
Result = Result.merge(tooling::Replacements(NewReplace));
}
}
Expand Down
14 changes: 11 additions & 3 deletions clang/unittests/Format/CleanupTest.cpp
Expand Up @@ -709,16 +709,24 @@ TEST_F(CleanUpReplacementsTest, EmptyCode) {
EXPECT_EQ(Expected, apply(Code, Replaces));
}

// FIXME: although this case does not crash, the insertion is wrong. A '\n'
// should be inserted between the two #includes.
TEST_F(CleanUpReplacementsTest, NoNewLineAtTheEndOfCode) {
std::string Code = "#include <map>";
std::string Expected = "#include <map>#include <vector>\n";
std::string Expected = "#include <map>\n#include <vector>\n";
tooling::Replacements Replaces =
toReplacements({createInsertion("#include <vector>")});
EXPECT_EQ(Expected, apply(Code, Replaces));
}

TEST_F(CleanUpReplacementsTest, NoNewLineAtTheEndOfCodeMultipleInsertions) {
std::string Code = "#include <map>";
std::string Expected =
"#include <map>\n#include <string>\n#include <vector>\n";
tooling::Replacements Replaces =
toReplacements({createInsertion("#include <string>"),
createInsertion("#include <vector>")});
EXPECT_EQ(Expected, apply(Code, Replaces));
}

TEST_F(CleanUpReplacementsTest, SkipExistingHeaders) {
std::string Code = "#include \"a.h\"\n"
"#include <vector>\n";
Expand Down

0 comments on commit 11a4237

Please sign in to comment.