Skip to content

Commit fb7ddd0

Browse files
committed
Revert "[clangd] Properly compute framework-style include spelling"
This reverts commit 4dfd113 due to the failures on Linux CI: https://lab.llvm.org/buildbot/#/builders/188/builds/9296
1 parent cd4ed08 commit fb7ddd0

File tree

2 files changed

+0
-212
lines changed

2 files changed

+0
-212
lines changed

clang-tools-extra/clangd/index/SymbolCollector.cpp

Lines changed: 0 additions & 138 deletions
Original file line numberDiff line numberDiff line change
@@ -183,13 +183,6 @@ const Decl *getRefContainer(const Decl *Enclosing,
183183
// including filename normalization, URI conversion etc.
184184
// Expensive checks are cached internally.
185185
class SymbolCollector::HeaderFileURICache {
186-
struct FrameworkUmbrellaSpelling {
187-
// Spelling for the public umbrella header, e.g. <Foundation/Foundation.h>
188-
llvm::Optional<std::string> PublicHeader;
189-
// Spelling for the private umbrella header, e.g.
190-
// <Foundation/Foundation_Private.h>
191-
llvm::Optional<std::string> PrivateHeader;
192-
};
193186
// Weird double-indirect access to PP, which might not be ready yet when
194187
// HeaderFiles is created but will be by the time it's used.
195188
// (IndexDataConsumer::setPreprocessor can happen before or after initialize)
@@ -200,9 +193,6 @@ class SymbolCollector::HeaderFileURICache {
200193
llvm::DenseMap<const FileEntry *, const std::string *> CacheFEToURI;
201194
llvm::StringMap<std::string> CachePathToURI;
202195
llvm::DenseMap<FileID, llvm::StringRef> CacheFIDToInclude;
203-
llvm::StringMap<std::string> CachePathToFrameworkSpelling;
204-
llvm::StringMap<FrameworkUmbrellaSpelling>
205-
CacheFrameworkToUmbrellaHeaderSpelling;
206196

207197
public:
208198
HeaderFileURICache(Preprocessor *&PP, const SourceManager &SM,
@@ -259,125 +249,6 @@ class SymbolCollector::HeaderFileURICache {
259249
return R.first->second;
260250
}
261251

262-
struct FrameworkHeaderPath {
263-
// Path to the framework directory containing the Headers/PrivateHeaders
264-
// directories e.g. /Frameworks/Foundation.framework/
265-
llvm::StringRef HeadersParentDir;
266-
// Subpath relative to the Headers or PrivateHeaders dir, e.g. NSObject.h
267-
// Note: This is NOT relative to the `HeadersParentDir`.
268-
llvm::StringRef HeaderSubpath;
269-
// Whether this header is under the PrivateHeaders dir
270-
bool IsPrivateHeader;
271-
};
272-
273-
llvm::Optional<FrameworkHeaderPath>
274-
splitFrameworkHeaderPath(llvm::StringRef Path) {
275-
using namespace llvm::sys;
276-
path::reverse_iterator I = path::rbegin(Path);
277-
path::reverse_iterator Prev = I;
278-
path::reverse_iterator E = path::rend(Path);
279-
while (I != E) {
280-
if (*I == "Headers") {
281-
FrameworkHeaderPath HeaderPath;
282-
HeaderPath.HeadersParentDir = Path.substr(0, I - E);
283-
HeaderPath.HeaderSubpath = Path.substr(Prev - E);
284-
return HeaderPath;
285-
}
286-
if (*I == "PrivateHeaders") {
287-
FrameworkHeaderPath HeaderPath;
288-
HeaderPath.HeadersParentDir = Path.substr(0, I - E);
289-
HeaderPath.HeaderSubpath = Path.substr(Prev - E);
290-
HeaderPath.IsPrivateHeader = true;
291-
return HeaderPath;
292-
}
293-
Prev = I;
294-
++I;
295-
}
296-
// Unexpected, must not be a framework header.
297-
return llvm::None;
298-
}
299-
300-
// Frameworks typically have an umbrella header of the same name, e.g.
301-
// <Foundation/Foundation.h> instead of <Foundation/NSObject.h> or
302-
// <Foundation/Foundation_Private.h> instead of
303-
// <Foundation/NSObject_Private.h> which should be used instead of directly
304-
// importing the header.
305-
llvm::Optional<std::string> getFrameworkUmbrellaSpelling(
306-
llvm::StringRef Framework, SrcMgr::CharacteristicKind HeadersDirKind,
307-
HeaderSearch &HS, FrameworkHeaderPath &HeaderPath) {
308-
auto Res = CacheFrameworkToUmbrellaHeaderSpelling.try_emplace(Framework);
309-
auto *CachedSpelling = &Res.first->second;
310-
if (!Res.second) {
311-
return HeaderPath.IsPrivateHeader ? CachedSpelling->PrivateHeader
312-
: CachedSpelling->PublicHeader;
313-
}
314-
bool IsSystem = isSystem(HeadersDirKind);
315-
SmallString<256> UmbrellaPath(HeaderPath.HeadersParentDir);
316-
llvm::sys::path::append(UmbrellaPath, "Headers", Framework + ".h");
317-
318-
llvm::vfs::Status Status;
319-
auto StatErr = HS.getFileMgr().getNoncachedStatValue(UmbrellaPath, Status);
320-
if (!StatErr) {
321-
if (IsSystem)
322-
CachedSpelling->PublicHeader = llvm::formatv("<{0}/{0}.h>", Framework);
323-
else
324-
CachedSpelling->PublicHeader =
325-
llvm::formatv("\"{0}/{0}.h\"", Framework);
326-
}
327-
328-
UmbrellaPath = HeaderPath.HeadersParentDir;
329-
llvm::sys::path::append(UmbrellaPath, "PrivateHeaders",
330-
Framework + "_Private.h");
331-
332-
StatErr = HS.getFileMgr().getNoncachedStatValue(UmbrellaPath, Status);
333-
if (!StatErr) {
334-
if (IsSystem)
335-
CachedSpelling->PrivateHeader =
336-
llvm::formatv("<{0}/{0}_Private.h>", Framework);
337-
else
338-
CachedSpelling->PrivateHeader =
339-
llvm::formatv("\"{0}/{0}_Private.h\"", Framework);
340-
}
341-
return HeaderPath.IsPrivateHeader ? CachedSpelling->PrivateHeader
342-
: CachedSpelling->PublicHeader;
343-
}
344-
345-
// Compute the framework include spelling for `FE` which is in a framework
346-
// named `Framework`, e.g. `NSObject.h` in framework `Foundation` would
347-
// give <Foundation/Foundation.h> if the umbrella header exists, otherwise
348-
// <Foundation/NSObject.h>.
349-
llvm::Optional<llvm::StringRef> getFrameworkHeaderIncludeSpelling(
350-
const FileEntry *FE, llvm::StringRef Framework, HeaderSearch &HS) {
351-
auto Res = CachePathToFrameworkSpelling.try_emplace(FE->getName());
352-
auto *CachedHeaderSpelling = &Res.first->second;
353-
if (!Res.second)
354-
return llvm::StringRef(*CachedHeaderSpelling);
355-
356-
auto HeaderPath = splitFrameworkHeaderPath(FE->getName());
357-
if (!HeaderPath) {
358-
// Unexpected: must not be a proper framework header, don't cache the
359-
// failure.
360-
CachePathToFrameworkSpelling.erase(Res.first);
361-
return llvm::None;
362-
}
363-
auto DirKind = HS.getFileDirFlavor(FE);
364-
if (auto UmbrellaSpelling =
365-
getFrameworkUmbrellaSpelling(Framework, DirKind, HS, *HeaderPath)) {
366-
*CachedHeaderSpelling = *UmbrellaSpelling;
367-
return llvm::StringRef(*CachedHeaderSpelling);
368-
}
369-
370-
if (isSystem(DirKind))
371-
*CachedHeaderSpelling =
372-
llvm::formatv("<{0}/{1}>", Framework, HeaderPath->HeaderSubpath)
373-
.str();
374-
else
375-
*CachedHeaderSpelling =
376-
llvm::formatv("\"{0}/{1}\"", Framework, HeaderPath->HeaderSubpath)
377-
.str();
378-
return llvm::StringRef(*CachedHeaderSpelling);
379-
}
380-
381252
llvm::StringRef getIncludeHeaderUncached(FileID FID) {
382253
const FileEntry *FE = SM.getFileEntryForID(FID);
383254
if (!FE || FE->getName().empty())
@@ -394,15 +265,6 @@ class SymbolCollector::HeaderFileURICache {
394265
return toURI(Canonical);
395266
}
396267
}
397-
// Framework headers are spelled as <FrameworkName/Foo.h>, not
398-
// "path/FrameworkName.framework/Headers/Foo.h".
399-
auto &HS = PP->getHeaderSearchInfo();
400-
if (const auto *HFI = HS.getExistingFileInfo(FE, /*WantExternal*/ false))
401-
if (!HFI->Framework.empty())
402-
if (auto Spelling =
403-
getFrameworkHeaderIncludeSpelling(FE, HFI->Framework, HS))
404-
return *Spelling;
405-
406268
if (!isSelfContainedHeader(FE, FID, PP->getSourceManager(),
407269
PP->getHeaderSearchInfo())) {
408270
// A .inc or .def file is often included into a real header to define

clang-tools-extra/clangd/unittests/SymbolCollectorTests.cpp

Lines changed: 0 additions & 74 deletions
Original file line numberDiff line numberDiff line change
@@ -663,80 +663,6 @@ TEST_F(SymbolCollectorTest, ObjCClassExtensions) {
663663
qName("Cat::meow"), qName("Cat::pur")));
664664
}
665665

666-
TEST_F(SymbolCollectorTest, ObjCFrameworkIncludeHeader) {
667-
CollectorOpts.CollectIncludePath = true;
668-
auto FrameworksPath = testPath("Frameworks/");
669-
std::string FrameworkHeader = R"(
670-
__attribute((objc_root_class))
671-
@interface NSObject
672-
@end
673-
)";
674-
InMemoryFileSystem->addFile(
675-
testPath("Frameworks/Foundation.framework/Headers/NSObject.h"), 0,
676-
llvm::MemoryBuffer::getMemBuffer(FrameworkHeader));
677-
std::string PrivateFrameworkHeader = R"(
678-
#import <Foundation/NSObject.h>
679-
680-
@interface PrivateClass : NSObject
681-
@end
682-
)";
683-
InMemoryFileSystem->addFile(
684-
testPath(
685-
"Frameworks/Foundation.framework/PrivateHeaders/NSObject+Private.h"),
686-
0, llvm::MemoryBuffer::getMemBuffer(PrivateFrameworkHeader));
687-
688-
std::string Header = R"(
689-
#import <Foundation/NSObject+Private.h>
690-
#import <Foundation/NSObject.h>
691-
692-
@interface Container : NSObject
693-
@end
694-
)";
695-
std::string Main = "";
696-
TestFileName = testPath("test.m");
697-
runSymbolCollector(Header, Main, {"-F", FrameworksPath, "-xobjective-c++"});
698-
EXPECT_THAT(
699-
Symbols,
700-
UnorderedElementsAre(
701-
AllOf(qName("NSObject"), includeHeader("\"Foundation/NSObject.h\"")),
702-
AllOf(qName("PrivateClass"),
703-
includeHeader("\"Foundation/NSObject+Private.h\"")),
704-
AllOf(qName("Container"))));
705-
706-
// After adding the umbrella headers, we should use that spelling instead.
707-
std::string UmbrellaHeader = R"(
708-
#import <Foundation/NSObject.h>
709-
)";
710-
InMemoryFileSystem->addFile(
711-
testPath("Frameworks/Foundation.framework/Headers/Foundation.h"), 0,
712-
llvm::MemoryBuffer::getMemBuffer(UmbrellaHeader));
713-
std::string PrivateUmbrellaHeader = R"(
714-
#import <Foundation/NSObject+Private.h>
715-
)";
716-
InMemoryFileSystem->addFile(
717-
testPath("Frameworks/Foundation.framework/PrivateHeaders/"
718-
"Foundation_Private.h"),
719-
0, llvm::MemoryBuffer::getMemBuffer(PrivateUmbrellaHeader));
720-
runSymbolCollector(Header, Main, {"-F", FrameworksPath, "-xobjective-c++"});
721-
EXPECT_THAT(Symbols,
722-
UnorderedElementsAre(
723-
AllOf(qName("NSObject"),
724-
includeHeader("\"Foundation/Foundation.h\"")),
725-
AllOf(qName("PrivateClass"),
726-
includeHeader("\"Foundation/Foundation_Private.h\"")),
727-
AllOf(qName("Container"))));
728-
729-
runSymbolCollector(Header, Main,
730-
{"-iframework", FrameworksPath, "-xobjective-c++"});
731-
EXPECT_THAT(
732-
Symbols,
733-
UnorderedElementsAre(
734-
AllOf(qName("NSObject"), includeHeader("<Foundation/Foundation.h>")),
735-
AllOf(qName("PrivateClass"),
736-
includeHeader("<Foundation/Foundation_Private.h>")),
737-
AllOf(qName("Container"))));
738-
}
739-
740666
TEST_F(SymbolCollectorTest, Locations) {
741667
Annotations Header(R"cpp(
742668
// Declared in header, defined in main.

0 commit comments

Comments
 (0)