@@ -290,9 +290,10 @@ class SymbolCollector::HeaderFileURICache {
290290 }
291291
292292 struct FrameworkHeaderPath {
293- // Path to the framework directory containing the Headers/PrivateHeaders
294- // directories e.g. /Frameworks/Foundation.framework/
295- llvm::StringRef HeadersParentDir;
293+ // Path to the frameworks directory containing the .framework directory.
294+ llvm::StringRef FrameworkParentDir;
295+ // Name of the framework.
296+ llvm::StringRef FrameworkName;
296297 // Subpath relative to the Headers or PrivateHeaders dir, e.g. NSObject.h
297298 // Note: This is NOT relative to the `HeadersParentDir`.
298299 llvm::StringRef HeaderSubpath;
@@ -306,19 +307,17 @@ class SymbolCollector::HeaderFileURICache {
306307 path::reverse_iterator I = path::rbegin (Path);
307308 path::reverse_iterator Prev = I;
308309 path::reverse_iterator E = path::rend (Path);
310+ FrameworkHeaderPath HeaderPath;
309311 while (I != E) {
310- if (*I == " Headers" ) {
311- FrameworkHeaderPath HeaderPath;
312- HeaderPath.HeadersParentDir = Path.substr (0 , I - E);
312+ if (*I == " Headers" || *I == " PrivateHeaders" ) {
313313 HeaderPath.HeaderSubpath = Path.substr (Prev - E);
314- HeaderPath.IsPrivateHeader = false ;
315- return HeaderPath;
316- }
317- if (*I == " PrivateHeaders" ) {
318- FrameworkHeaderPath HeaderPath;
319- HeaderPath.HeadersParentDir = Path.substr (0 , I - E);
320- HeaderPath.HeaderSubpath = Path.substr (Prev - E);
321- HeaderPath.IsPrivateHeader = true ;
314+ HeaderPath.IsPrivateHeader = *I == " PrivateHeaders" ;
315+ if (++I == E)
316+ break ;
317+ HeaderPath.FrameworkName = *I;
318+ if (!HeaderPath.FrameworkName .consume_back (" .framework" ))
319+ break ;
320+ HeaderPath.FrameworkParentDir = Path.substr (0 , I - E);
322321 return HeaderPath;
323322 }
324323 Prev = I;
@@ -334,26 +333,27 @@ class SymbolCollector::HeaderFileURICache {
334333 // <Foundation/NSObject_Private.h> which should be used instead of directly
335334 // importing the header.
336335 std::optional<std::string>
337- getFrameworkUmbrellaSpelling (llvm::StringRef Framework,
338- const HeaderSearch &HS,
336+ getFrameworkUmbrellaSpelling (const HeaderSearch &HS,
339337 FrameworkHeaderPath &HeaderPath) {
338+ StringRef Framework = HeaderPath.FrameworkName ;
340339 auto Res = CacheFrameworkToUmbrellaHeaderSpelling.try_emplace (Framework);
341340 auto *CachedSpelling = &Res.first ->second ;
342341 if (!Res.second ) {
343342 return HeaderPath.IsPrivateHeader ? CachedSpelling->PrivateHeader
344343 : CachedSpelling->PublicHeader ;
345344 }
346- SmallString<256 > UmbrellaPath (HeaderPath.HeadersParentDir );
347- llvm::sys::path::append (UmbrellaPath, " Headers" , Framework + " .h" );
345+ SmallString<256 > UmbrellaPath (HeaderPath.FrameworkParentDir );
346+ llvm::sys::path::append (UmbrellaPath, Framework + " .framework" , " Headers" ,
347+ Framework + " .h" );
348348
349349 llvm::vfs::Status Status;
350350 auto StatErr = HS.getFileMgr ().getNoncachedStatValue (UmbrellaPath, Status);
351351 if (!StatErr)
352352 CachedSpelling->PublicHeader = llvm::formatv (" <{0}/{0}.h>" , Framework);
353353
354- UmbrellaPath = HeaderPath.HeadersParentDir ;
355- llvm::sys::path::append (UmbrellaPath, " PrivateHeaders " ,
356- Framework + " _Private.h" );
354+ UmbrellaPath = HeaderPath.FrameworkParentDir ;
355+ llvm::sys::path::append (UmbrellaPath, Framework + " .framework " ,
356+ " PrivateHeaders " , Framework + " _Private.h" );
357357
358358 StatErr = HS.getFileMgr ().getNoncachedStatValue (UmbrellaPath, Status);
359359 if (!StatErr)
@@ -369,8 +369,7 @@ class SymbolCollector::HeaderFileURICache {
369369 // give <Foundation/Foundation.h> if the umbrella header exists, otherwise
370370 // <Foundation/NSObject.h>.
371371 std::optional<llvm::StringRef>
372- getFrameworkHeaderIncludeSpelling (FileEntryRef FE, llvm::StringRef Framework,
373- HeaderSearch &HS) {
372+ getFrameworkHeaderIncludeSpelling (FileEntryRef FE, HeaderSearch &HS) {
374373 auto Res = CachePathToFrameworkSpelling.try_emplace (FE.getName ());
375374 auto *CachedHeaderSpelling = &Res.first ->second ;
376375 if (!Res.second )
@@ -384,13 +383,15 @@ class SymbolCollector::HeaderFileURICache {
384383 return std::nullopt ;
385384 }
386385 if (auto UmbrellaSpelling =
387- getFrameworkUmbrellaSpelling (Framework, HS, *HeaderPath)) {
386+ getFrameworkUmbrellaSpelling (HS, *HeaderPath)) {
388387 *CachedHeaderSpelling = *UmbrellaSpelling;
389388 return llvm::StringRef (*CachedHeaderSpelling);
390389 }
391390
392391 *CachedHeaderSpelling =
393- llvm::formatv (" <{0}/{1}>" , Framework, HeaderPath->HeaderSubpath ).str ();
392+ llvm::formatv (" <{0}/{1}>" , HeaderPath->FrameworkName ,
393+ HeaderPath->HeaderSubpath )
394+ .str ();
394395 return llvm::StringRef (*CachedHeaderSpelling);
395396 }
396397
@@ -409,11 +410,8 @@ class SymbolCollector::HeaderFileURICache {
409410 // Framework headers are spelled as <FrameworkName/Foo.h>, not
410411 // "path/FrameworkName.framework/Headers/Foo.h".
411412 auto &HS = PP->getHeaderSearchInfo ();
412- if (const auto *HFI = HS.getExistingFileInfo (*FE))
413- if (!HFI->Framework .empty ())
414- if (auto Spelling =
415- getFrameworkHeaderIncludeSpelling (*FE, HFI->Framework , HS))
416- return *Spelling;
413+ if (auto Spelling = getFrameworkHeaderIncludeSpelling (*FE, HS))
414+ return *Spelling;
417415
418416 if (!tooling::isSelfContainedHeader (*FE, PP->getSourceManager (),
419417 PP->getHeaderSearchInfo ())) {
0 commit comments