diff --git a/clang-tools-extra/clang-tidy/utils/IncludeSorter.cpp b/clang-tools-extra/clang-tidy/utils/IncludeSorter.cpp --- a/clang-tools-extra/clang-tidy/utils/IncludeSorter.cpp +++ b/clang-tools-extra/clang-tidy/utils/IncludeSorter.cpp @@ -45,8 +45,12 @@ // Objective-C categories have a `+suffix` format, but should be grouped // with the file they are a category of. + size_t StartIndex = Canonical.find_last_of('/'); + if (StartIndex == StringRef::npos) { + StartIndex = 0; + } return Canonical.substr( - 0, Canonical.find_first_of('+', Canonical.find_last_of('/'))); + 0, Canonical.find_first_of('+', StartIndex)); } return RemoveFirstSuffix( RemoveFirstSuffix(Str, {".cc", ".cpp", ".c", ".h", ".hpp"}), diff --git a/clang-tools-extra/unittests/clang-tidy/IncludeInserterTest.cpp b/clang-tools-extra/unittests/clang-tidy/IncludeInserterTest.cpp --- a/clang-tools-extra/unittests/clang-tidy/IncludeInserterTest.cpp +++ b/clang-tools-extra/unittests/clang-tidy/IncludeInserterTest.cpp @@ -133,7 +133,7 @@ utils::IncludeSorter::IS_Google_ObjC) {} std::vector headersToInclude() const override { - return {"clang_tidy/tests/insert_includes_test_header+foo.h"}; + return {"top_level_test_header+foo.h"}; } }; @@ -158,6 +158,10 @@ {"clang_tidy/tests/" "insert_includes_test_header.h", "\n"}, + // Top-level main file include + + // category. + {"top_level_test_header.h", "\n"}, + {"top_level_test_header+foo.h", "\n"}, // ObjC category. {"clang_tidy/tests/" "insert_includes_test_header+foo.h", @@ -708,23 +712,21 @@ TEST(IncludeInserterTest, InsertCategoryHeaderObjectiveC) { const char *PreCode = R"( -#import "clang_tidy/tests/insert_includes_test_header.h" +#import "top_level_test_header.h" void foo() { int a = 0; })"; const char *PostCode = R"( -#import "clang_tidy/tests/insert_includes_test_header.h" -#import "clang_tidy/tests/insert_includes_test_header+foo.h" +#import "top_level_test_header.h" +#import "top_level_test_header+foo.h" void foo() { int a = 0; })"; - EXPECT_EQ( - PostCode, - runCheckOnCode( - PreCode, "repo/clang_tidy/tests/insert_includes_test_header.mm")); + EXPECT_EQ(PostCode, runCheckOnCode( + PreCode, "top_level_test_header.mm")); } TEST(IncludeInserterTest, InsertGeneratedHeaderObjectiveC) {