[PATCH] D89783: [format] foo.<name>.h should be the main-header for foo.<name>.cc
Haojian Wu via Phabricator via cfe-commits
cfe-commits at lists.llvm.org
Tue Oct 20 02:35:56 PDT 2020
hokein created this revision.
hokein added a reviewer: adamcz.
Herald added a project: clang.
hokein requested review of this revision.
This fixes a regression introduced in https://reviews.llvm.org/D88640.
Repository:
rG LLVM Github Monorepo
https://reviews.llvm.org/D89783
Files:
clang/include/clang/Tooling/Inclusions/HeaderIncludes.h
clang/lib/Tooling/Inclusions/HeaderIncludes.cpp
clang/unittests/Format/SortIncludesTest.cpp
Index: clang/unittests/Format/SortIncludesTest.cpp
===================================================================
--- clang/unittests/Format/SortIncludesTest.cpp
+++ clang/unittests/Format/SortIncludesTest.cpp
@@ -151,7 +151,7 @@
EXPECT_TRUE(sortIncludes(FmtStyle, Code, GetCodeRange(Code), "a.cc").empty());
}
-TEST_F(SortIncludesTest, NoMainFileHeader) {
+TEST_F(SortIncludesTest, MainFileHeader) {
std::string Code = "#include <string>\n"
"\n"
"#include \"a/extra_action.proto.h\"\n";
@@ -159,6 +159,13 @@
EXPECT_TRUE(
sortIncludes(FmtStyle, Code, GetCodeRange(Code), "a/extra_action.cc")
.empty());
+
+ EXPECT_EQ("#include \"foo.bar.h\"\n"
+ "\n"
+ "#include \"a.h\"\n",
+ sort("#include \"a.h\"\n"
+ "#include \"foo.bar.h\"\n",
+ "foo.bar.cc"));
}
TEST_F(SortIncludesTest, SortedIncludesInMultipleBlocksAreMerged) {
Index: clang/lib/Tooling/Inclusions/HeaderIncludes.cpp
===================================================================
--- clang/lib/Tooling/Inclusions/HeaderIncludes.cpp
+++ clang/lib/Tooling/Inclusions/HeaderIncludes.cpp
@@ -190,7 +190,6 @@
IncludeCategoryManager::IncludeCategoryManager(const IncludeStyle &Style,
StringRef FileName)
: Style(Style), FileName(FileName) {
- FileStem = matchingStem(FileName);
for (const auto &Category : Style.IncludeCategories)
CategoryRegexs.emplace_back(Category.Regex, llvm::Regex::IgnoreCase);
IsMainFile = FileName.endswith(".c") || FileName.endswith(".cc") ||
@@ -234,16 +233,30 @@
if (!IncludeName.startswith("\""))
return false;
+ IncludeName =
+ IncludeName.drop_front(1).drop_back(1); // remove the surrounding "" or <>
// Not matchingStem: implementation files may have compound extensions but
// headers may not.
- StringRef HeaderStem =
- llvm::sys::path::stem(IncludeName.drop_front(1).drop_back(
- 1) /* remove the surrounding "" or <> */);
- if (FileStem.startswith(HeaderStem) ||
- FileStem.startswith_lower(HeaderStem)) {
+ StringRef HeaderStem = llvm::sys::path::stem(IncludeName);
+ StringRef FileStem = llvm::sys::path::stem(FileName); // foo.cu for foo.cu.cc
+ StringRef MatchingFileStem = matchingStem(FileName); // foo for foo.cu.cc
+ // main-header examples:
+ // 1) foo.h => foo.cc
+ // 2) foo.h => foo.<name>.cc (e.g. foo.cu.cc)
+ // 3) foo.<name>.h => foo.<name>.cc
+ //
+ // non-main-header examples:
+ // foo.proto.h => foo.cc
+ // foo.h => bar.cc
+ StringRef Matching;
+ if (MatchingFileStem.startswith_lower(HeaderStem))
+ Matching = MatchingFileStem; // example 1), 2)
+ else if (FileStem.equals_lower(HeaderStem))
+ Matching = FileStem; // example 3)
+ if (!Matching.empty()) {
llvm::Regex MainIncludeRegex(HeaderStem.str() + Style.IncludeIsMainRegex,
llvm::Regex::IgnoreCase);
- if (MainIncludeRegex.match(FileStem))
+ if (MainIncludeRegex.match(Matching))
return true;
}
return false;
Index: clang/include/clang/Tooling/Inclusions/HeaderIncludes.h
===================================================================
--- clang/include/clang/Tooling/Inclusions/HeaderIncludes.h
+++ clang/include/clang/Tooling/Inclusions/HeaderIncludes.h
@@ -40,8 +40,6 @@
const IncludeStyle Style;
bool IsMainFile;
std::string FileName;
- // This refers to a substring in FileName.
- StringRef FileStem;
SmallVector<llvm::Regex, 4> CategoryRegexs;
};
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D89783.299312.patch
Type: text/x-patch
Size: 3593 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20201020/ca956500/attachment.bin>
More information about the cfe-commits
mailing list