Author: alexfh Date: Thu Jan 12 09:31:50 2017 New Revision: 291767 URL: http://llvm.org/viewvc/llvm-project?rev=291767&view=rev Log: Correctly classify main file includes if there is a prefix added
Summary: Prevents misclassifying includes based on the command-line filename (e.g. if a project is in a subdirectory). This is slightly more robust than the additional duplicate detection, however the current classification scheme is still kind of brittle for a lot of code. Reviewers: hokein, alexfh Subscribers: cfe-commits, #clang-tools-extra Patch by Julian Bangert! Differential Revision: https://reviews.llvm.org/D26015 Modified: clang-tools-extra/trunk/clang-tidy/utils/IncludeSorter.cpp clang-tools-extra/trunk/unittests/clang-tidy/IncludeInserterTest.cpp Modified: clang-tools-extra/trunk/clang-tidy/utils/IncludeSorter.cpp URL: http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/clang-tidy/utils/IncludeSorter.cpp?rev=291767&r1=291766&r2=291767&view=diff ============================================================================== --- clang-tools-extra/trunk/clang-tidy/utils/IncludeSorter.cpp (original) +++ clang-tools-extra/trunk/clang-tidy/utils/IncludeSorter.cpp Thu Jan 12 09:31:50 2017 @@ -61,7 +61,8 @@ DetermineIncludeKind(StringRef Canonical : IncludeSorter::IK_CXXSystemInclude; } StringRef CanonicalInclude = MakeCanonicalName(IncludeFile, Style); - if (CanonicalFile.equals(CanonicalInclude)) { + if (CanonicalFile.endswith(CanonicalInclude) + || CanonicalInclude.endswith(CanonicalFile)) { return IncludeSorter::IK_MainTUInclude; } if (Style == IncludeSorter::IS_Google) { Modified: clang-tools-extra/trunk/unittests/clang-tidy/IncludeInserterTest.cpp URL: http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/unittests/clang-tidy/IncludeInserterTest.cpp?rev=291767&r1=291766&r2=291767&view=diff ============================================================================== --- clang-tools-extra/trunk/unittests/clang-tidy/IncludeInserterTest.cpp (original) +++ clang-tools-extra/trunk/unittests/clang-tidy/IncludeInserterTest.cpp Thu Jan 12 09:31:50 2017 @@ -73,6 +73,17 @@ public: bool IsAngledInclude() const override { return false; } }; +class EarlyInAlphabetHeaderInserterCheck : public IncludeInserterCheckBase { +public: + EarlyInAlphabetHeaderInserterCheck(StringRef CheckName, ClangTidyContext *Context) + : IncludeInserterCheckBase(CheckName, Context) {} + + std::vector<StringRef> HeadersToInclude() const override { + return {"a/header.h"}; + } + bool IsAngledInclude() const override { return false; } +}; + class MultipleHeaderInserterCheck : public IncludeInserterCheckBase { public: MultipleHeaderInserterCheck(StringRef CheckName, ClangTidyContext *Context) @@ -114,6 +125,7 @@ std::string runCheckOnCode(StringRef Cod "insert_includes_test_header.h", "\n"}, // Non system headers + {"a/header.h", "\n"}, {"path/to/a/header.h", "\n"}, {"path/to/z/header.h", "\n"}, {"path/to/header.h", "\n"}, @@ -522,6 +534,77 @@ void foo() { "insert_includes_test_header.cc")); } +TEST(IncludeInserterTest, DontInsertDuplicateIncludeEvenIfMiscategorized) { + const char *PreCode = R"( +#include "clang_tidy/tests/insert_includes_test_header.h" + +#include <map> +#include <set> +#include <vector> + +#include "a/header.h" +#include "path/to/a/header.h" +#include "path/to/header.h" + +void foo() { + int a = 0; +})"; + + const char *PostCode = R"( +#include "clang_tidy/tests/insert_includes_test_header.h" + +#include <map> +#include <set> +#include <vector> + +#include "a/header.h" +#include "path/to/a/header.h" +#include "path/to/header.h" + +void foo() { + int a = 0; +})"; + + EXPECT_EQ(PostCode, runCheckOnCode<EarlyInAlphabetHeaderInserterCheck>( + PreCode, "workspace_folder/clang_tidy/tests/" + "insert_includes_test_header.cc")); +} + +TEST(IncludeInserterTest, HandleOrderInSubdirectory) { + const char *PreCode = R"( +#include "clang_tidy/tests/insert_includes_test_header.h" + +#include <map> +#include <set> +#include <vector> + +#include "path/to/a/header.h" +#include "path/to/header.h" + +void foo() { + int a = 0; +})"; + + const char *PostCode = R"( +#include "clang_tidy/tests/insert_includes_test_header.h" + +#include <map> +#include <set> +#include <vector> + +#include "a/header.h" +#include "path/to/a/header.h" +#include "path/to/header.h" + +void foo() { + int a = 0; +})"; + + EXPECT_EQ(PostCode, runCheckOnCode<EarlyInAlphabetHeaderInserterCheck>( + PreCode, "workspace_folder/clang_tidy/tests/" + "insert_includes_test_header.cc")); +} + } // anonymous namespace } // namespace tidy } // namespace clang _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits