[clang] [llvm] [InstallAPI] Add *umbrella-header options (PR #86587)
Juergen Ributzka via cfe-commits
cfe-commits at lists.llvm.org
Mon Mar 25 19:24:56 PDT 2024
================
@@ -424,6 +448,56 @@ InstallAPIContext Options::createContext() {
if (!Glob->didMatch())
Diags->Report(diag::warn_glob_did_not_match) << Glob->str();
+ // Mark any explicit or inferred umbrella headers. If one exists, move
+ // that to the beginning of the input headers.
+ auto MarkandMoveUmbrellaInHeaders = [&](Regex &Regex,
+ HeaderType Type) -> bool {
+ auto It = find_if(Ctx.InputHeaders, [&Regex, Type](const HeaderFile &H) {
+ return (H.getType() == Type) && Regex.match(H.getPath());
+ });
+
+ if (It == Ctx.InputHeaders.end())
+ return false;
+ It->setUmbrellaHeader();
+
+ // Because there can be an umbrella header per header type,
+ // find the first non umbrella header to swap position with.
+ auto BeginPos = find_if(Ctx.InputHeaders, [](const HeaderFile &H) {
+ return !H.isUmbrellaHeader();
+ });
+ if (BeginPos != Ctx.InputHeaders.end() && BeginPos < It)
+ std::swap(*BeginPos, *It);
+ return true;
+ };
+
+ auto FindUmbrellaHeader = [&](StringRef HeaderPath, HeaderType Type) -> bool {
+ if (!HeaderPath.empty()) {
+ auto EscapedString = Regex::escape(HeaderPath);
+ Regex UmbrellaRegex(EscapedString);
+ if (!MarkandMoveUmbrellaInHeaders(UmbrellaRegex, Type)) {
+ Diags->Report(diag::err_no_such_umbrella_header_file)
+ << HeaderPath << (unsigned)Type - 1;
----------------
ributzka wrote:
Could the `HeaderType` enum be reshuffled so this arithmetic is not required?
https://github.com/llvm/llvm-project/pull/86587
More information about the cfe-commits
mailing list