diff options
author | Eric Liu <ioeric@google.com> | 2016-06-14 14:09:21 +0000 |
---|---|---|
committer | Eric Liu <ioeric@google.com> | 2016-06-14 14:09:21 +0000 |
commit | 3753f912bf2218ab02afae404ca7d39cebe94811 (patch) | |
tree | 94c6c77c00bbaa587bfbb145147680061a9b35c0 | |
parent | 887a399418dba637d19e6aeec2071dfc03077583 (diff) | |
download | bcm5719-llvm-3753f912bf2218ab02afae404ca7d39cebe94811.tar.gz bcm5719-llvm-3753f912bf2218ab02afae404ca7d39cebe94811.zip |
[clang-format] do not add existing includes.
Summary: do not add existing includes.
Reviewers: djasper
Subscribers: klimek, cfe-commits
Differential Revision: http://reviews.llvm.org/D21323
llvm-svn: 272669
-rw-r--r-- | clang/lib/Format/Format.cpp | 8 | ||||
-rw-r--r-- | clang/unittests/Format/CleanupTest.cpp | 23 |
2 files changed, 30 insertions, 1 deletions
diff --git a/clang/lib/Format/Format.cpp b/clang/lib/Format/Format.cpp index 45ae4338fc8..4e136941162 100644 --- a/clang/lib/Format/Format.cpp +++ b/clang/lib/Format/Format.cpp @@ -1486,7 +1486,6 @@ unsigned getOffsetAfterHeaderGuardsAndComments(StringRef FileName, // code. // FIXME: do not insert headers into conditional #include blocks, e.g. #includes // surrounded by compile condition "#if...". -// FIXME: do not insert existing headers. // FIXME: insert empty lines between newly created blocks. tooling::Replacements fixCppIncludeInsertions(StringRef Code, const tooling::Replacements &Replaces, @@ -1533,10 +1532,12 @@ fixCppIncludeInsertions(StringRef Code, const tooling::Replacements &Replaces, TrimmedCode.split(Lines, '\n'); unsigned Offset = MinInsertOffset; unsigned NextLineOffset; + std::set<StringRef> ExistingIncludes; for (auto Line : Lines) { NextLineOffset = std::min(Code.size(), Offset + Line.size() + 1); if (IncludeRegex.match(Line, &Matches)) { StringRef IncludeName = Matches[2]; + ExistingIncludes.insert(IncludeName); int Category = Categories.getIncludePriority( IncludeName, /*CheckMainHeader=*/FirstIncludeOffset < 0); CategoryEndOffsets[Category] = NextLineOffset; @@ -1572,6 +1573,11 @@ fixCppIncludeInsertions(StringRef Code, const tooling::Replacements &Replaces, "'#include ...'"); (void)Matched; auto IncludeName = Matches[2]; + if (ExistingIncludes.find(IncludeName) != ExistingIncludes.end()) { + DEBUG(llvm::dbgs() << "Skip adding existing include : " << IncludeName + << "\n"); + continue; + } int Category = Categories.getIncludePriority(IncludeName, /*CheckMainHeader=*/true); Offset = CategoryEndOffsets[Category]; diff --git a/clang/unittests/Format/CleanupTest.cpp b/clang/unittests/Format/CleanupTest.cpp index 9037304a723..f51e3acf9ac 100644 --- a/clang/unittests/Format/CleanupTest.cpp +++ b/clang/unittests/Format/CleanupTest.cpp @@ -688,6 +688,29 @@ TEST_F(CleanUpReplacementsTest, NoNewLineAtTheEndOfCode) { EXPECT_EQ(Expected, apply(Code, Replaces)); } +TEST_F(CleanUpReplacementsTest, SkipExistingHeaders) { + std::string Code = "#include \"a.h\"\n" + "#include <vector>\n"; + std::string Expected = "#include \"a.h\"\n" + "#include <vector>\n"; + tooling::Replacements Replaces = {createInsertion("#include <vector>"), + createInsertion("#include \"a.h\"")}; + EXPECT_EQ(Expected, apply(Code, Replaces)); +} + +TEST_F(CleanUpReplacementsTest, AddIncludesWithDifferentForms) { + std::string Code = "#include \"a.h\"\n" + "#include <vector>\n"; + // FIXME: this might not be the best behavior. + std::string Expected = "#include \"a.h\"\n" + "#include \"vector\"\n" + "#include <vector>\n" + "#include <a.h>\n"; + tooling::Replacements Replaces = {createInsertion("#include \"vector\""), + createInsertion("#include <a.h>")}; + EXPECT_EQ(Expected, apply(Code, Replaces)); +} + } // end namespace } // end namespace format } // end namespace clang |