From: Eric Liu Date: Tue, 14 Jun 2016 14:09:21 +0000 (+0000) Subject: [clang-format] do not add existing includes. X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=c736d7a85fc9b1173a058a8a345b32453d22cee9;p=clang [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 git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@272669 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Format/Format.cpp b/lib/Format/Format.cpp index 45ae4338fc..4e13694116 100644 --- a/lib/Format/Format.cpp +++ b/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 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/unittests/Format/CleanupTest.cpp b/unittests/Format/CleanupTest.cpp index 9037304a72..f51e3acf9a 100644 --- a/unittests/Format/CleanupTest.cpp +++ b/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 \n"; + std::string Expected = "#include \"a.h\"\n" + "#include \n"; + tooling::Replacements Replaces = {createInsertion("#include "), + createInsertion("#include \"a.h\"")}; + EXPECT_EQ(Expected, apply(Code, Replaces)); +} + +TEST_F(CleanUpReplacementsTest, AddIncludesWithDifferentForms) { + std::string Code = "#include \"a.h\"\n" + "#include \n"; + // FIXME: this might not be the best behavior. + std::string Expected = "#include \"a.h\"\n" + "#include \"vector\"\n" + "#include \n" + "#include \n"; + tooling::Replacements Replaces = {createInsertion("#include \"vector\""), + createInsertion("#include ")}; + EXPECT_EQ(Expected, apply(Code, Replaces)); +} + } // end namespace } // end namespace format } // end namespace clang