mirror of
https://github.com/intel/llvm.git
synced 2026-01-16 05:32:28 +08:00
[clang-format] append newline after code when inserting new headers at 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
This commit is contained in:
@@ -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);
|
||||
@@ -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));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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";
|
||||
|
||||
Reference in New Issue
Block a user