[clang][HeaderSearch] Treat framework headers as Angled for suggestPath
- Rename the IsSystem flag to be IsAngled since that's how callers
actually use the flag.
- Since frameworks by convention use <> style includes, make sure
we treat them as Angled
Also update clangd's custom logic for frameworks accordingly.
Differential Revision: https://reviews.llvm.org/D156704
diff --git a/clang-tools-extra/clang-include-fixer/IncludeFixer.cpp b/clang-tools-extra/clang-include-fixer/IncludeFixer.cpp
index 45fc156..1bb5cf7 100644
--- a/clang-tools-extra/clang-include-fixer/IncludeFixer.cpp
+++ b/clang-tools-extra/clang-include-fixer/IncludeFixer.cpp
@@ -314,11 +314,11 @@
if (!Entry)
return std::string(Include);
- bool IsSystem = false;
+ bool IsAngled = false;
std::string Suggestion =
- HeaderSearch.suggestPathToFileForDiagnostics(*Entry, "", &IsSystem);
+ HeaderSearch.suggestPathToFileForDiagnostics(*Entry, "", &IsAngled);
- return IsSystem ? '<' + Suggestion + '>' : '"' + Suggestion + '"';
+ return IsAngled ? '<' + Suggestion + '>' : '"' + Suggestion + '"';
}
/// Get the include fixer context for the queried symbol.
diff --git a/clang-tools-extra/clangd/Headers.cpp b/clang-tools-extra/clangd/Headers.cpp
index 83fba21..6005069 100644
--- a/clang-tools-extra/clangd/Headers.cpp
+++ b/clang-tools-extra/clangd/Headers.cpp
@@ -286,11 +286,11 @@
assert(InsertedHeader.valid());
if (InsertedHeader.Verbatim)
return InsertedHeader.File;
- bool IsSystem = false;
+ bool IsAngled = false;
std::string Suggested;
if (HeaderSearchInfo) {
Suggested = HeaderSearchInfo->suggestPathToFileForDiagnostics(
- InsertedHeader.File, BuildDir, IncludingFile, &IsSystem);
+ InsertedHeader.File, BuildDir, IncludingFile, &IsAngled);
} else {
// Calculate include relative to including file only.
StringRef IncludingDir = llvm::sys::path::parent_path(IncludingFile);
@@ -303,7 +303,7 @@
// FIXME: should we allow (some limited number of) "../header.h"?
if (llvm::sys::path::is_absolute(Suggested))
return std::nullopt;
- if (IsSystem)
+ if (IsAngled)
Suggested = "<" + Suggested + ">";
else
Suggested = "\"" + Suggested + "\"";
diff --git a/clang-tools-extra/clangd/index/SymbolCollector.cpp b/clang-tools-extra/clangd/index/SymbolCollector.cpp
index c9a211b..e843413 100644
--- a/clang-tools-extra/clangd/index/SymbolCollector.cpp
+++ b/clang-tools-extra/clangd/index/SymbolCollector.cpp
@@ -328,42 +328,33 @@
// <Foundation/Foundation_Private.h> instead of
// <Foundation/NSObject_Private.h> which should be used instead of directly
// importing the header.
- std::optional<std::string> getFrameworkUmbrellaSpelling(
- llvm::StringRef Framework, SrcMgr::CharacteristicKind HeadersDirKind,
- const HeaderSearch &HS, FrameworkHeaderPath &HeaderPath) {
+ std::optional<std::string>
+ getFrameworkUmbrellaSpelling(llvm::StringRef Framework,
+ const HeaderSearch &HS,
+ FrameworkHeaderPath &HeaderPath) {
auto Res = CacheFrameworkToUmbrellaHeaderSpelling.try_emplace(Framework);
auto *CachedSpelling = &Res.first->second;
if (!Res.second) {
return HeaderPath.IsPrivateHeader ? CachedSpelling->PrivateHeader
: CachedSpelling->PublicHeader;
}
- bool IsSystem = isSystem(HeadersDirKind);
SmallString<256> UmbrellaPath(HeaderPath.HeadersParentDir);
llvm::sys::path::append(UmbrellaPath, "Headers", Framework + ".h");
llvm::vfs::Status Status;
auto StatErr = HS.getFileMgr().getNoncachedStatValue(UmbrellaPath, Status);
- if (!StatErr) {
- if (IsSystem)
- CachedSpelling->PublicHeader = llvm::formatv("<{0}/{0}.h>", Framework);
- else
- CachedSpelling->PublicHeader =
- llvm::formatv("\"{0}/{0}.h\"", Framework);
- }
+ if (!StatErr)
+ CachedSpelling->PublicHeader = llvm::formatv("<{0}/{0}.h>", Framework);
UmbrellaPath = HeaderPath.HeadersParentDir;
llvm::sys::path::append(UmbrellaPath, "PrivateHeaders",
Framework + "_Private.h");
StatErr = HS.getFileMgr().getNoncachedStatValue(UmbrellaPath, Status);
- if (!StatErr) {
- if (IsSystem)
- CachedSpelling->PrivateHeader =
- llvm::formatv("<{0}/{0}_Private.h>", Framework);
- else
- CachedSpelling->PrivateHeader =
- llvm::formatv("\"{0}/{0}_Private.h\"", Framework);
- }
+ if (!StatErr)
+ CachedSpelling->PrivateHeader =
+ llvm::formatv("<{0}/{0}_Private.h>", Framework);
+
return HeaderPath.IsPrivateHeader ? CachedSpelling->PrivateHeader
: CachedSpelling->PublicHeader;
}
@@ -386,21 +377,14 @@
CachePathToFrameworkSpelling.erase(Res.first);
return std::nullopt;
}
- auto DirKind = HS.getFileDirFlavor(FE);
if (auto UmbrellaSpelling =
- getFrameworkUmbrellaSpelling(Framework, DirKind, HS, *HeaderPath)) {
+ getFrameworkUmbrellaSpelling(Framework, HS, *HeaderPath)) {
*CachedHeaderSpelling = *UmbrellaSpelling;
return llvm::StringRef(*CachedHeaderSpelling);
}
- if (isSystem(DirKind))
- *CachedHeaderSpelling =
- llvm::formatv("<{0}/{1}>", Framework, HeaderPath->HeaderSubpath)
- .str();
- else
- *CachedHeaderSpelling =
- llvm::formatv("\"{0}/{1}\"", Framework, HeaderPath->HeaderSubpath)
- .str();
+ *CachedHeaderSpelling =
+ llvm::formatv("<{0}/{1}>", Framework, HeaderPath->HeaderSubpath).str();
return llvm::StringRef(*CachedHeaderSpelling);
}
diff --git a/clang-tools-extra/clangd/unittests/SymbolCollectorTests.cpp b/clang-tools-extra/clangd/unittests/SymbolCollectorTests.cpp
index 338cada..58b9c85 100644
--- a/clang-tools-extra/clangd/unittests/SymbolCollectorTests.cpp
+++ b/clang-tools-extra/clangd/unittests/SymbolCollectorTests.cpp
@@ -702,9 +702,9 @@
EXPECT_THAT(
Symbols,
UnorderedElementsAre(
- AllOf(qName("NSObject"), includeHeader("\"Foundation/NSObject.h\"")),
+ AllOf(qName("NSObject"), includeHeader("<Foundation/NSObject.h>")),
AllOf(qName("PrivateClass"),
- includeHeader("\"Foundation/NSObject+Private.h\"")),
+ includeHeader("<Foundation/NSObject+Private.h>")),
AllOf(qName("Container"))));
// After adding the umbrella headers, we should use that spelling instead.
@@ -722,13 +722,13 @@
"Foundation_Private.h"),
0, llvm::MemoryBuffer::getMemBuffer(PrivateUmbrellaHeader));
runSymbolCollector(Header, Main, {"-F", FrameworksPath, "-xobjective-c++"});
- EXPECT_THAT(Symbols,
- UnorderedElementsAre(
- AllOf(qName("NSObject"),
- includeHeader("\"Foundation/Foundation.h\"")),
- AllOf(qName("PrivateClass"),
- includeHeader("\"Foundation/Foundation_Private.h\"")),
- AllOf(qName("Container"))));
+ EXPECT_THAT(
+ Symbols,
+ UnorderedElementsAre(
+ AllOf(qName("NSObject"), includeHeader("<Foundation/Foundation.h>")),
+ AllOf(qName("PrivateClass"),
+ includeHeader("<Foundation/Foundation_Private.h>")),
+ AllOf(qName("Container"))));
runSymbolCollector(Header, Main,
{"-iframework", FrameworksPath, "-xobjective-c++"});
diff --git a/clang-tools-extra/include-cleaner/lib/HTMLReport.cpp b/clang-tools-extra/include-cleaner/lib/HTMLReport.cpp
index 431d4bb..1bb4080 100644
--- a/clang-tools-extra/include-cleaner/lib/HTMLReport.cpp
+++ b/clang-tools-extra/include-cleaner/lib/HTMLReport.cpp
@@ -170,10 +170,10 @@
std::string spellHeader(const Header &H) {
switch (H.kind()) {
case Header::Physical: {
- bool IsSystem = false;
+ bool IsAngled = false;
std::string Path = HS.suggestPathToFileForDiagnostics(
- H.physical(), MainFE->tryGetRealPathName(), &IsSystem);
- return IsSystem ? "<" + Path + ">" : "\"" + Path + "\"";
+ H.physical(), MainFE->tryGetRealPathName(), &IsAngled);
+ return IsAngled ? "<" + Path + ">" : "\"" + Path + "\"";
}
case Header::Standard:
return H.standard().name().str();
diff --git a/clang-tools-extra/include-cleaner/lib/IncludeSpeller.cpp b/clang-tools-extra/include-cleaner/lib/IncludeSpeller.cpp
index bb49630..2073f0a 100644
--- a/clang-tools-extra/include-cleaner/lib/IncludeSpeller.cpp
+++ b/clang-tools-extra/include-cleaner/lib/IncludeSpeller.cpp
@@ -29,10 +29,10 @@
case Header::Verbatim:
return Input.H.verbatim().str();
case Header::Physical:
- bool IsSystem = false;
+ bool IsAngled = false;
std::string FinalSpelling = Input.HS.suggestPathToFileForDiagnostics(
- Input.H.physical(), Input.Main->tryGetRealPathName(), &IsSystem);
- return IsSystem ? "<" + FinalSpelling + ">" : "\"" + FinalSpelling + "\"";
+ Input.H.physical(), Input.Main->tryGetRealPathName(), &IsAngled);
+ return IsAngled ? "<" + FinalSpelling + ">" : "\"" + FinalSpelling + "\"";
}
llvm_unreachable("Unknown clang::include_cleaner::Header::Kind enum");
}