@@ -78,6 +78,8 @@ class SymbolIndexImpl {
78
78
size_t countOfCanonicalSymbolsWithKind (SymbolKind symKind, bool workspaceOnly);
79
79
bool foreachCanonicalSymbolOccurrenceByKind (SymbolKind symKind, bool workspaceOnly,
80
80
function_ref<bool (SymbolOccurrenceRef Occur)> Receiver);
81
+ bool foreachUnitTestSymbolReferencedByOutputPaths (ArrayRef<CanonicalFilePath> FilePaths,
82
+ function_ref<bool (SymbolOccurrenceRef Occur)> Receiver);
81
83
82
84
private:
83
85
bool foreachCanonicalSymbolImpl (bool workspaceOnly,
@@ -88,7 +90,8 @@ class SymbolIndexImpl {
88
90
function_ref<bool(SymbolOccurrenceRef)> Receiver);
89
91
std::vector<SymbolDataProviderRef> lookupProvidersForUSR (StringRef USR, SymbolRoleSet roles, SymbolRoleSet relatedRoles);
90
92
std::vector<std::pair<SymbolDataProviderRef, bool >> findCanonicalProvidersForUSR (IDCode usrCode);
91
- SymbolDataProviderRef createProviderForCode (IDCode providerCode, ReadTransaction &reader);
93
+ SymbolDataProviderRef createVisibleProviderForCode (IDCode providerCode, ReadTransaction &reader);
94
+ SymbolDataProviderRef createProviderForCode (IDCode providerCode, ReadTransaction &reader, function_ref<bool (ReadTransaction &, const UnitInfo &)> unitFilter);
92
95
};
93
96
94
97
} // anonymous namespace
@@ -162,7 +165,13 @@ void SymbolIndexImpl::dumpProviderFileAssociations(raw_ostream &OS) {
162
165
});
163
166
}
164
167
165
- SymbolDataProviderRef SymbolIndexImpl::createProviderForCode (IDCode providerCode, ReadTransaction &reader) {
168
+ SymbolDataProviderRef SymbolIndexImpl::createVisibleProviderForCode (IDCode providerCode, ReadTransaction &reader) {
169
+ return createProviderForCode (providerCode, reader, [&](ReadTransaction &reader, const UnitInfo &unitInfo) -> bool {
170
+ return VisibilityChecker->isUnitVisible (unitInfo, reader);
171
+ });
172
+ }
173
+
174
+ SymbolDataProviderRef SymbolIndexImpl::createProviderForCode (IDCode providerCode, ReadTransaction &reader, function_ref<bool (ReadTransaction &, const UnitInfo &)> unitFilter) {
166
175
StringRef recordName = reader.getProviderName (providerCode);
167
176
if (recordName.empty ()) {
168
177
++NumMissingProvidersLookedUp;
@@ -175,7 +184,7 @@ SymbolDataProviderRef SymbolIndexImpl::createProviderForCode(IDCode providerCode
175
184
auto unitInfo = reader.getUnitInfo (unitCode);
176
185
if (unitInfo.isInvalid ())
177
186
return true ;
178
- if (!VisibilityChecker-> isUnitVisible (unitInfo, reader ))
187
+ if (!unitFilter (reader, unitInfo ))
179
188
return true ;
180
189
181
190
if (!providerKind.hasValue ()) {
@@ -206,7 +215,7 @@ SymbolIndexImpl::lookupProvidersForUSR(StringRef USR, SymbolRoleSet roles, Symbo
206
215
std::vector<SymbolDataProviderRef> providers;
207
216
ReadTransaction reader (DBase);
208
217
reader.lookupProvidersForUSR (USR, roles, relatedRoles, [&](IDCode providerCode, SymbolRoleSet roles, SymbolRoleSet relatedRoles) -> bool {
209
- if (auto prov = createProviderForCode (providerCode, reader))
218
+ if (auto prov = createVisibleProviderForCode (providerCode, reader))
210
219
providers.push_back (prov);
211
220
return true ;
212
221
});
@@ -279,7 +288,7 @@ bool SymbolIndexImpl::foreachCanonicalSymbolImpl(bool workspaceOnly,
279
288
if (provInfo.IsInvisible )
280
289
return provInfo;
281
290
if (!provInfo.Provider ) {
282
- provInfo.Provider = createProviderForCode (provCode, reader);
291
+ provInfo.Provider = createVisibleProviderForCode (provCode, reader);
283
292
if (!provInfo.Provider )
284
293
provInfo.IsInvisible = true ;
285
294
}
@@ -442,13 +451,54 @@ SymbolIndexImpl::findCanonicalProvidersForUSR(IDCode usrCode) {
442
451
bool isCanon = provCodeAndHasDef.second ;
443
452
if (!isCanon && foundCanon)
444
453
break ;
445
- if (auto prov = createProviderForCode (provCode, reader))
454
+ if (auto prov = createVisibleProviderForCode (provCode, reader))
446
455
foundProvs.emplace_back (std::move (prov), isCanon);
447
456
foundCanon |= isCanon;
448
457
}
449
458
return foundProvs;
450
459
}
451
460
461
+ bool SymbolIndexImpl::foreachUnitTestSymbolReferencedByOutputPaths (ArrayRef<CanonicalFilePath> outFilePaths, function_ref<bool (SymbolOccurrenceRef Occur)> receiver) {
462
+ std::vector<SymbolDataProviderRef> providers;
463
+ {
464
+ ReadTransaction reader (DBase);
465
+
466
+ std::unordered_set<IDCode> providerCodes;
467
+ reader.foreachUSROfGlobalUnitTestSymbol ([&](ArrayRef<IDCode> usrCodes) -> bool {
468
+ for (IDCode usrCode : usrCodes) {
469
+ reader.lookupProvidersForUSR (usrCode, None, None, [&](IDCode providerCode, SymbolRoleSet roles, SymbolRoleSet relatedRoles) -> bool {
470
+ providerCodes.insert (providerCode);
471
+ return true ;
472
+ });
473
+ }
474
+ return true ;
475
+ });
476
+
477
+ if (providerCodes.empty ()) {
478
+ return true ;
479
+ }
480
+
481
+ std::unordered_set<IDCode> outFileCodes;
482
+ for (const CanonicalFilePath &path : outFilePaths) {
483
+ outFileCodes.insert (reader.getFilePathCode (path));
484
+ }
485
+ for (IDCode providerCode : providerCodes) {
486
+ auto provider = createProviderForCode (providerCode, reader, [&](ReadTransaction &reader, const UnitInfo &unitInfo) -> bool {
487
+ return outFileCodes.count (unitInfo.OutFileCode );
488
+ });
489
+ if (provider) {
490
+ providers.push_back (std::move (provider));
491
+ }
492
+ }
493
+ }
494
+
495
+ for (SymbolDataProviderRef provider : providers) {
496
+ bool cont = provider->foreachUnitTestSymbolOccurrence (receiver);
497
+ if (!cont) return false ;
498
+ }
499
+ return true ;
500
+ }
501
+
452
502
// ===----------------------------------------------------------------------===//
453
503
// SymbolIndex
454
504
// ===----------------------------------------------------------------------===//
@@ -527,3 +577,8 @@ bool SymbolIndex::foreachCanonicalSymbolOccurrenceByKind(SymbolKind symKind, boo
527
577
function_ref<bool (SymbolOccurrenceRef Occur)> Receiver) {
528
578
return IMPL->foreachCanonicalSymbolOccurrenceByKind (symKind, workspaceOnly, std::move (Receiver));
529
579
}
580
+
581
+ bool SymbolIndex::foreachUnitTestSymbolReferencedByOutputPaths (ArrayRef<CanonicalFilePath> FilePaths,
582
+ function_ref<bool (SymbolOccurrenceRef Occur)> Receiver) {
583
+ return IMPL->foreachUnitTestSymbolReferencedByOutputPaths (FilePaths, std::move (Receiver));
584
+ }
0 commit comments