Skip to content

Commit 9126c26

Browse files
authored
Merge pull request #21 from akyrtzi/unit-test-symbol-lookup
[Index] Introduce IndexSystem::foreachUnitTestSymbolReferencedByOutputPaths()
2 parents 3c0fe32 + 9c9dded commit 9126c26

File tree

10 files changed

+135
-6
lines changed

10 files changed

+135
-6
lines changed

include/IndexStoreDB/Database/ReadTransaction.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,9 @@ class INDEXSTOREDB_EXPORT ReadTransaction {
5252
/// Returns USR codes in batches.
5353
bool foreachUSROfGlobalSymbolKind(SymbolKind symKind, llvm::function_ref<bool(ArrayRef<IDCode> usrCodes)> receiver);
5454

55+
/// Returns USR codes in batches.
56+
bool foreachUSROfGlobalUnitTestSymbol(llvm::function_ref<bool(ArrayRef<IDCode> usrCodes)> receiver);
57+
5558
/// Returns USR codes in batches.
5659
bool findUSRsWithNameContaining(StringRef pattern,
5760
bool anchorStart, bool anchorEnd,

include/IndexStoreDB/Index/IndexSystem.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -124,6 +124,11 @@ class INDEXSTOREDB_EXPORT IndexSystem {
124124
bool foreachFileIncludedByFile(StringRef SourcePath,
125125
function_ref<bool(CanonicalFilePathRef TargetPath, unsigned Line)> Receiver);
126126

127+
/// Returns unit test class/method occurrences that are referenced from units associated with the provided output file paths.
128+
/// \returns `false` if the receiver returned `false` to stop receiving symbols, `true` otherwise.
129+
bool foreachUnitTestSymbolReferencedByOutputPaths(ArrayRef<StringRef> FilePaths,
130+
function_ref<bool(SymbolOccurrenceRef Occur)> Receiver);
131+
127132
private:
128133
IndexSystem(void *Impl) : Impl(Impl) {}
129134

include/IndexStoreDB/Index/SymbolDataProvider.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,9 @@ class SymbolDataProvider {
5656
SymbolRoleSet RoleSet,
5757
function_ref<bool(SymbolOccurrenceRef Occur)> Receiver) = 0;
5858

59+
virtual bool foreachUnitTestSymbolOccurrence(
60+
function_ref<bool(SymbolOccurrenceRef Occur)> Receiver) = 0;
61+
5962
private:
6063
virtual void anchor();
6164
};

include/IndexStoreDB/Index/SymbolIndex.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -83,6 +83,9 @@ class SymbolIndex {
8383
bool foreachCanonicalSymbolOccurrenceByKind(SymbolKind symKind, bool workspaceOnly,
8484
function_ref<bool(SymbolOccurrenceRef Occur)> Receiver);
8585

86+
bool foreachUnitTestSymbolReferencedByOutputPaths(ArrayRef<CanonicalFilePath> FilePaths,
87+
function_ref<bool(SymbolOccurrenceRef Occur)> Receiver);
88+
8689
private:
8790
void *Impl; // A SymbolIndexImpl.
8891
};

lib/Database/ReadTransaction.cpp

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -248,6 +248,14 @@ bool ReadTransaction::Implementation::foreachUSROfGlobalSymbolKind(SymbolKind sy
248248
return foreachUSROfGlobalSymbolKind(globalKindOpt.getValue(), receiver);
249249
}
250250

251+
bool ReadTransaction::Implementation::foreachUSROfGlobalUnitTestSymbol(function_ref<bool(ArrayRef<IDCode> usrCodes)> receiver) {
252+
bool cont = foreachUSROfGlobalSymbolKind(GlobalSymbolKind::TestClassOrExtension, receiver);
253+
if (cont) {
254+
cont = foreachUSROfGlobalSymbolKind(GlobalSymbolKind::TestMethod, receiver);
255+
}
256+
return cont;
257+
}
258+
251259
bool ReadTransaction::Implementation::foreachUSROfGlobalSymbolKind(GlobalSymbolKind globalKind,
252260
function_ref<bool(ArrayRef<IDCode> usrCodes)> receiver) {
253261
auto &db = DBase->impl();
@@ -639,6 +647,10 @@ bool ReadTransaction::foreachUSROfGlobalSymbolKind(SymbolKind symKind, llvm::fun
639647
return Impl->foreachUSROfGlobalSymbolKind(symKind, std::move(receiver));
640648
}
641649

650+
bool ReadTransaction::foreachUSROfGlobalUnitTestSymbol(llvm::function_ref<bool(ArrayRef<IDCode> usrCodes)> receiver) {
651+
return Impl->foreachUSROfGlobalUnitTestSymbol(std::move(receiver));
652+
}
653+
642654
bool ReadTransaction::findUSRsWithNameContaining(StringRef pattern,
643655
bool anchorStart, bool anchorEnd,
644656
bool subsequence, bool ignoreCase,

lib/Database/ReadTransactionImpl.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,7 @@ class ReadTransaction::Implementation {
5454
bool foreachProviderAndFileCodeReference(llvm::function_ref<bool(IDCode provider, IDCode pathCode, IDCode unitCode, llvm::sys::TimePoint<> modTime, IDCode moduleNameCode, bool isSystem)> receiver);
5555

5656
bool foreachUSROfGlobalSymbolKind(SymbolKind symKind, llvm::function_ref<bool(ArrayRef<IDCode> usrCodes)> receiver);
57+
bool foreachUSROfGlobalUnitTestSymbol(llvm::function_ref<bool(ArrayRef<IDCode> usrCodes)> receiver);
5758
bool foreachUSROfGlobalSymbolKind(GlobalSymbolKind globalSymKind, function_ref<bool(ArrayRef<IDCode> usrCodes)> receiver);
5859

5960
bool findUSRsWithNameContaining(StringRef pattern,

lib/Index/IndexSystem.cpp

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -179,6 +179,9 @@ class IndexSystemImpl {
179179

180180
bool foreachFileIncludedByFile(StringRef SourcePath,
181181
function_ref<bool(CanonicalFilePathRef TargetPath, unsigned Line)> Receiver);
182+
183+
bool foreachUnitTestSymbolReferencedByOutputPaths(ArrayRef<StringRef> FilePaths,
184+
function_ref<bool(SymbolOccurrenceRef Occur)> Receiver);
182185
};
183186

184187
} // anonymous namespace
@@ -519,6 +522,15 @@ bool IndexSystemImpl::foreachFileIncludedByFile(StringRef SourcePath,
519522
return PathIndex->foreachFileIncludedByFile(canonSourcePath, Receiver);
520523
}
521524

525+
bool IndexSystemImpl::foreachUnitTestSymbolReferencedByOutputPaths(ArrayRef<StringRef> FilePaths, function_ref<bool(SymbolOccurrenceRef Occur)> Receiver) {
526+
SmallVector<CanonicalFilePath, 8> canonPaths;
527+
canonPaths.reserve(FilePaths.size());
528+
for (StringRef path : FilePaths) {
529+
canonPaths.push_back(PathIndex->getCanonicalPath(path));
530+
}
531+
return SymIndex->foreachUnitTestSymbolReferencedByOutputPaths(canonPaths, std::move(Receiver));
532+
}
533+
522534
//===----------------------------------------------------------------------===//
523535
// IndexSystem
524536
//===----------------------------------------------------------------------===//
@@ -696,3 +708,8 @@ bool IndexSystem::foreachFileIncludedByFile(StringRef SourcePath,
696708
function_ref<bool(CanonicalFilePathRef TargetPath, unsigned Line)> Receiver) {
697709
return IMPL->foreachFileIncludedByFile(SourcePath, Receiver);
698710
}
711+
712+
bool IndexSystem::foreachUnitTestSymbolReferencedByOutputPaths(ArrayRef<StringRef> FilePaths,
713+
function_ref<bool(SymbolOccurrenceRef Occur)> Receiver) {
714+
return IMPL->foreachUnitTestSymbolReferencedByOutputPaths(FilePaths, std::move(Receiver));
715+
}

lib/Index/StoreSymbolRecord.cpp

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -376,3 +376,29 @@ bool StoreSymbolRecord::foreachRelatedSymbolOccurrenceByUSR(ArrayRef<db::IDCode>
376376

377377
return !Err && Finished;
378378
}
379+
380+
bool StoreSymbolRecord::foreachUnitTestSymbolOccurrence(function_ref<bool(SymbolOccurrenceRef Occur)> Receiver) {
381+
bool Finished = true;
382+
bool Err = doForData([&](IndexRecordReader &Reader) {
383+
SmallVector<IndexRecordSymbol, 8> FoundDecls;
384+
auto filter = [&](IndexRecordSymbol recSym, bool &stop) -> bool {
385+
auto symInfo = getSymbolInfo(recSym);
386+
return symInfo.Properties.contains(SymbolProperty::UnitTest);
387+
};
388+
auto receiver = [&](IndexRecordSymbol sym) {
389+
FoundDecls.push_back(sym);
390+
};
391+
Reader.searchSymbols(filter, receiver);
392+
if (FoundDecls.empty())
393+
return;
394+
395+
// Return all occurrences.
396+
auto Pred = [](IndexRecordOccurrence) -> bool { return true; };
397+
PredOccurrenceConverter Converter(*this, Pred, Receiver);
398+
Finished = Reader.foreachOccurrence(/*symbolsFilter=*/FoundDecls,
399+
/*relatedSymbolsFilter=*/None,
400+
Converter);
401+
});
402+
403+
return !Err && Finished;
404+
}

lib/Index/StoreSymbolRecord.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -82,6 +82,10 @@ class StoreSymbolRecord : public SymbolDataProvider {
8282
virtual bool foreachRelatedSymbolOccurrenceByUSR(ArrayRef<db::IDCode> USRs,
8383
SymbolRoleSet RoleSet,
8484
function_ref<bool(SymbolOccurrenceRef Occur)> Receiver) override;
85+
86+
virtual bool foreachUnitTestSymbolOccurrence(
87+
function_ref<bool(SymbolOccurrenceRef Occur)> Receiver) override;
88+
8589
};
8690

8791
} // namespace index

lib/Index/SymbolIndex.cpp

Lines changed: 61 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,8 @@ class SymbolIndexImpl {
7878
size_t countOfCanonicalSymbolsWithKind(SymbolKind symKind, bool workspaceOnly);
7979
bool foreachCanonicalSymbolOccurrenceByKind(SymbolKind symKind, bool workspaceOnly,
8080
function_ref<bool(SymbolOccurrenceRef Occur)> Receiver);
81+
bool foreachUnitTestSymbolReferencedByOutputPaths(ArrayRef<CanonicalFilePath> FilePaths,
82+
function_ref<bool(SymbolOccurrenceRef Occur)> Receiver);
8183

8284
private:
8385
bool foreachCanonicalSymbolImpl(bool workspaceOnly,
@@ -88,7 +90,8 @@ class SymbolIndexImpl {
8890
function_ref<bool(SymbolOccurrenceRef)> Receiver);
8991
std::vector<SymbolDataProviderRef> lookupProvidersForUSR(StringRef USR, SymbolRoleSet roles, SymbolRoleSet relatedRoles);
9092
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);
9295
};
9396

9497
} // anonymous namespace
@@ -162,7 +165,13 @@ void SymbolIndexImpl::dumpProviderFileAssociations(raw_ostream &OS) {
162165
});
163166
}
164167

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) {
166175
StringRef recordName = reader.getProviderName(providerCode);
167176
if (recordName.empty()) {
168177
++NumMissingProvidersLookedUp;
@@ -175,7 +184,7 @@ SymbolDataProviderRef SymbolIndexImpl::createProviderForCode(IDCode providerCode
175184
auto unitInfo = reader.getUnitInfo(unitCode);
176185
if (unitInfo.isInvalid())
177186
return true;
178-
if (!VisibilityChecker->isUnitVisible(unitInfo, reader))
187+
if (!unitFilter(reader, unitInfo))
179188
return true;
180189

181190
if (!providerKind.hasValue()) {
@@ -206,7 +215,7 @@ SymbolIndexImpl::lookupProvidersForUSR(StringRef USR, SymbolRoleSet roles, Symbo
206215
std::vector<SymbolDataProviderRef> providers;
207216
ReadTransaction reader(DBase);
208217
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))
210219
providers.push_back(prov);
211220
return true;
212221
});
@@ -279,7 +288,7 @@ bool SymbolIndexImpl::foreachCanonicalSymbolImpl(bool workspaceOnly,
279288
if (provInfo.IsInvisible)
280289
return provInfo;
281290
if (!provInfo.Provider) {
282-
provInfo.Provider = createProviderForCode(provCode, reader);
291+
provInfo.Provider = createVisibleProviderForCode(provCode, reader);
283292
if (!provInfo.Provider)
284293
provInfo.IsInvisible = true;
285294
}
@@ -442,13 +451,54 @@ SymbolIndexImpl::findCanonicalProvidersForUSR(IDCode usrCode) {
442451
bool isCanon = provCodeAndHasDef.second;
443452
if (!isCanon && foundCanon)
444453
break;
445-
if (auto prov = createProviderForCode(provCode, reader))
454+
if (auto prov = createVisibleProviderForCode(provCode, reader))
446455
foundProvs.emplace_back(std::move(prov), isCanon);
447456
foundCanon |= isCanon;
448457
}
449458
return foundProvs;
450459
}
451460

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+
452502
//===----------------------------------------------------------------------===//
453503
// SymbolIndex
454504
//===----------------------------------------------------------------------===//
@@ -527,3 +577,8 @@ bool SymbolIndex::foreachCanonicalSymbolOccurrenceByKind(SymbolKind symKind, boo
527577
function_ref<bool(SymbolOccurrenceRef Occur)> Receiver) {
528578
return IMPL->foreachCanonicalSymbolOccurrenceByKind(symKind, workspaceOnly, std::move(Receiver));
529579
}
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

Comments
 (0)