Febbe created this revision. Herald added a project: All. Febbe requested review of this revision. Herald added a project: clang. Herald added a subscriber: cfe-commits.
- Main Include Files have now always prio (0,0) - They can't be matched by negative matchers anymore. - `SortPriority` now truly defaults to `Priority` - If it is unclear, which include is the main include, use both instead of using the first. fixes #58284 fixes #60589 Repository: rG LLVM Github Monorepo https://reviews.llvm.org/D143691 Files: clang/lib/Format/Format.cpp clang/lib/Tooling/Inclusions/HeaderIncludes.cpp clang/lib/Tooling/Inclusions/IncludeStyle.cpp
Index: clang/lib/Tooling/Inclusions/IncludeStyle.cpp =================================================================== --- clang/lib/Tooling/Inclusions/IncludeStyle.cpp +++ clang/lib/Tooling/Inclusions/IncludeStyle.cpp @@ -15,9 +15,9 @@ void MappingTraits<IncludeStyle::IncludeCategory>::mapping( IO &IO, IncludeStyle::IncludeCategory &Category) { - IO.mapOptional("Regex", Category.Regex); - IO.mapOptional("Priority", Category.Priority); - IO.mapOptional("SortPriority", Category.SortPriority); + IO.mapRequired("Regex", Category.Regex); + IO.mapRequired("Priority", Category.Priority); + IO.mapOptional("SortPriority", Category.SortPriority, Category.Priority); IO.mapOptional("CaseSensitive", Category.RegexIsCaseSensitive); } Index: clang/lib/Tooling/Inclusions/HeaderIncludes.cpp =================================================================== --- clang/lib/Tooling/Inclusions/HeaderIncludes.cpp +++ clang/lib/Tooling/Inclusions/HeaderIncludes.cpp @@ -206,33 +206,35 @@ } } +constexpr int DefaultMainIncludePriority = 0; +constexpr int DefaultMainIncludeSortPriority = 0; + int IncludeCategoryManager::getIncludePriority(StringRef IncludeName, bool CheckMainHeader) const { - int Ret = INT_MAX; + if (CheckMainHeader && IsMainFile && isMainHeader(IncludeName)) + return DefaultMainIncludePriority; + for (unsigned i = 0, e = CategoryRegexs.size(); i != e; ++i) if (CategoryRegexs[i].match(IncludeName)) { - Ret = Style.IncludeCategories[i].Priority; - break; + return Style.IncludeCategories[i].Priority; } - if (CheckMainHeader && IsMainFile && Ret > 0 && isMainHeader(IncludeName)) - Ret = 0; - return Ret; + + return std::numeric_limits<int>::max(); } int IncludeCategoryManager::getSortIncludePriority(StringRef IncludeName, bool CheckMainHeader) const { - int Ret = INT_MAX; + if (CheckMainHeader && IsMainFile && isMainHeader(IncludeName)) + return DefaultMainIncludeSortPriority; + for (unsigned i = 0, e = CategoryRegexs.size(); i != e; ++i) if (CategoryRegexs[i].match(IncludeName)) { - Ret = Style.IncludeCategories[i].SortPriority; - if (Ret == 0) - Ret = Style.IncludeCategories[i].Priority; - break; + return Style.IncludeCategories[i].SortPriority; } - if (CheckMainHeader && IsMainFile && Ret > 0 && isMainHeader(IncludeName)) - Ret = 0; - return Ret; + + return std::numeric_limits<int>::max(); } + bool IncludeCategoryManager::isMainHeader(StringRef IncludeName) const { if (!IncludeName.startswith("\"")) return false; Index: clang/lib/Format/Format.cpp =================================================================== --- clang/lib/Format/Format.cpp +++ clang/lib/Format/Format.cpp @@ -2966,16 +2966,12 @@ SmallVector<StringRef, 4> Matches; SmallVector<IncludeDirective, 16> IncludesInBlock; - // In compiled files, consider the first #include to be the main #include of - // the file if it is not a system #include. This ensures that the header - // doesn't have hidden dependencies - // (http://llvm.org/docs/CodingStandards.html#include-style). - // // FIXME: Do some validation, e.g. edit distance of the base name, to fix // cases where the first #include is unlikely to be the main header. tooling::IncludeCategoryManager Categories(Style.IncludeStyle, FileName); bool FirstIncludeBlock = true; - bool MainIncludeFound = false; + // Todo(remove before merge): removed: multiple files can be main includes + // This option caused random sorting, depending which was detected first. bool FormattingOff = false; // '[' must be the first and '-' the last character inside [...]. @@ -3029,11 +3025,11 @@ } int Category = Categories.getIncludePriority( IncludeName, - /*CheckMainHeader=*/!MainIncludeFound && FirstIncludeBlock); - int Priority = Categories.getSortIncludePriority( - IncludeName, !MainIncludeFound && FirstIncludeBlock); - if (Category == 0) - MainIncludeFound = true; + /*CheckMainHeader=*/FirstIncludeBlock); + int Priority = + Categories.getSortIncludePriority(IncludeName, FirstIncludeBlock); + // Todo(remove before merge): reason for removal: every header can have + // 0,0 priority IncludesInBlock.push_back( {IncludeName, Line, Prev, Category, Priority}); } else if (!IncludesInBlock.empty() && !EmptyLineSkipped) {
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits