@@ -121,7 +121,8 @@ StringRef ReadTransaction::Implementation::getModuleName(IDCode moduleNameCode)
121
121
122
122
bool ReadTransaction::Implementation::getProviderFileReferences (IDCode provider,
123
123
llvm::function_ref<bool (TimestampedPath path)> receiver) {
124
- return getProviderFileCodeReferences (provider, [&](IDCode pathCode, IDCode unitCode, llvm::sys::TimePoint<> modTime, IDCode moduleNameCode, bool isSystem) -> bool {
124
+ auto unitFilter = [](IDCode unitCode)->bool { return true ; };
125
+ return getProviderFileCodeReferences (provider, unitFilter, [&](IDCode pathCode, IDCode unitCode, llvm::sys::TimePoint<> modTime, IDCode moduleNameCode, bool isSystem) -> bool {
125
126
std::string pathString;
126
127
llvm::raw_string_ostream OS (pathString);
127
128
if (!getFullFilePathFromCode (pathCode, OS)) {
@@ -138,9 +139,11 @@ bool ReadTransaction::Implementation::getProviderFileReferences(IDCode provider,
138
139
});
139
140
}
140
141
142
+ // / `unitFilter` returns `true` if the unit should be included, `false` if it should be ignored.
141
143
static bool passFileReferencesForProviderCursor (lmdb::val &key,
142
144
lmdb::val &value,
143
145
lmdb::cursor &cursor,
146
+ function_ref<bool (IDCode unitCode)> unitFilter,
144
147
llvm::function_ref<bool(IDCode pathCode, IDCode unitCode, llvm::sys::TimePoint<> modTime, IDCode moduleNameCode, bool isSystem)> receiver) {
145
148
// Entries are sorted by file code and there can be multiple same file entries
146
149
// from different units. We want to pass each file only once with its most recent
@@ -159,32 +162,46 @@ static bool passFileReferencesForProviderCursor(lmdb::val &key,
159
162
const auto &entry = *(TimestampedFileForProviderData*)value.data ();
160
163
llvm::sys::TimePoint<> modTime = llvm::sys::TimePoint<>(std::chrono::nanoseconds (entry.NanoTime ));
161
164
if (!currFileCode) {
162
- currFileCode = entry.FileCode ;
163
- currUnitCode = entry.UnitCode ;
164
- currModTime = modTime;
165
- currModuleNameCode = entry.ModuleNameCode ;
166
- currIsSystem = entry.IsSystem ;
165
+ if (unitFilter (entry.UnitCode )) {
166
+ currFileCode = entry.FileCode ;
167
+ currUnitCode = entry.UnitCode ;
168
+ currModTime = modTime;
169
+ currModuleNameCode = entry.ModuleNameCode ;
170
+ currIsSystem = entry.IsSystem ;
171
+ }
167
172
} else if (currFileCode.getValue () == entry.FileCode ) {
168
173
if (currModTime < modTime) {
169
- currModTime = modTime;
170
- currUnitCode = entry.UnitCode ;
174
+ if (unitFilter (entry.UnitCode )) {
175
+ currModTime = modTime;
176
+ currUnitCode = entry.UnitCode ;
177
+ }
171
178
}
172
179
} else {
173
180
if (!passCurrFile ())
174
181
return false ;
175
- currFileCode = entry.FileCode ;
176
- currUnitCode = entry.UnitCode ;
177
- currModTime = modTime;
178
- currModuleNameCode = entry.ModuleNameCode ;
179
- currIsSystem = entry.IsSystem ;
182
+ if (unitFilter (entry.UnitCode )) {
183
+ currFileCode = entry.FileCode ;
184
+ currUnitCode = entry.UnitCode ;
185
+ currModTime = modTime;
186
+ currModuleNameCode = entry.ModuleNameCode ;
187
+ currIsSystem = entry.IsSystem ;
188
+ } else {
189
+ currFileCode.reset ();
190
+ currUnitCode.reset ();
191
+ }
180
192
}
181
193
} while (cursor.get (key, value, MDB_NEXT_DUP));
182
194
183
- return passCurrFile ();
195
+ if (currFileCode) {
196
+ return passCurrFile ();
197
+ } else {
198
+ return true ;
199
+ }
184
200
}
185
201
186
202
bool ReadTransaction::Implementation::getProviderFileCodeReferences (IDCode provider,
187
- llvm::function_ref<bool (IDCode pathCode, IDCode unitCode, llvm::sys::TimePoint<> modTime, IDCode moduleNameCode, bool isSystem)> receiver) {
203
+ function_ref<bool (IDCode unitCode)> unitFilter,
204
+ function_ref<bool(IDCode pathCode, IDCode unitCode, llvm::sys::TimePoint<> modTime, IDCode moduleNameCode, bool isSystem)> receiver) {
188
205
auto &db = DBase->impl ();
189
206
auto &dbiFilesByProvider = db.getDBITimestampedFilesByProvider ();
190
207
auto cursor = lmdb::cursor::open (Txn, dbiFilesByProvider);
@@ -195,10 +212,12 @@ bool ReadTransaction::Implementation::getProviderFileCodeReferences(IDCode provi
195
212
if (!found)
196
213
return true ;
197
214
198
- return passFileReferencesForProviderCursor (key, value, cursor, std::move (receiver));
215
+ return passFileReferencesForProviderCursor (key, value, cursor, std::move (unitFilter), std::move ( receiver));
199
216
}
200
217
201
- bool ReadTransaction::Implementation::foreachProviderAndFileCodeReference (llvm::function_ref<bool (IDCode provider, IDCode pathCode, IDCode unitCode, llvm::sys::TimePoint<> modTime, IDCode moduleNameCode, bool isSystem)> receiver) {
218
+ bool ReadTransaction::Implementation::foreachProviderAndFileCodeReference (
219
+ function_ref<bool (IDCode unitCode)> unitFilter,
220
+ function_ref<bool(IDCode provider, IDCode pathCode, IDCode unitCode, llvm::sys::TimePoint<> modTime, IDCode moduleNameCode, bool isSystem)> receiver) {
202
221
auto &db = DBase->impl ();
203
222
auto &dbiFilesByProvider = db.getDBITimestampedFilesByProvider ();
204
223
auto cursor = lmdb::cursor::open (Txn, dbiFilesByProvider);
@@ -207,7 +226,7 @@ bool ReadTransaction::Implementation::foreachProviderAndFileCodeReference(llvm::
207
226
lmdb::val value{};
208
227
while (cursor.get (key, value, MDB_NEXT_NODUP)) {
209
228
IDCode providerCode = *(IDCode*)key.data ();
210
- bool cont = passFileReferencesForProviderCursor (key, value, cursor, [&](IDCode pathCode, IDCode unitCode, llvm::sys::TimePoint<> modTime, IDCode moduleNameCode, bool isSystem) -> bool {
229
+ bool cont = passFileReferencesForProviderCursor (key, value, cursor, unitFilter, [&](IDCode pathCode, IDCode unitCode, llvm::sys::TimePoint<> modTime, IDCode moduleNameCode, bool isSystem) -> bool {
211
230
return receiver (providerCode, pathCode, unitCode, modTime, moduleNameCode, isSystem);
212
231
});
213
232
if (!cont)
@@ -635,12 +654,15 @@ bool ReadTransaction::getProviderFileReferences(IDCode provider,
635
654
}
636
655
637
656
bool ReadTransaction::getProviderFileCodeReferences (IDCode provider,
638
- llvm::function_ref<bool (IDCode pathCode, IDCode unitCode, llvm::sys::TimePoint<> modTime, IDCode moduleNameCode, bool isSystem)> receiver) {
639
- return Impl->getProviderFileCodeReferences (provider, std::move (receiver));
657
+ function_ref<bool (IDCode unitCode)> unitFilter,
658
+ function_ref<bool(IDCode pathCode, IDCode unitCode, llvm::sys::TimePoint<> modTime, IDCode moduleNameCode, bool isSystem)> receiver) {
659
+ return Impl->getProviderFileCodeReferences (provider, std::move (unitFilter), std::move (receiver));
640
660
}
641
661
642
- bool ReadTransaction::foreachProviderAndFileCodeReference (llvm::function_ref<bool (IDCode provider, IDCode pathCode, IDCode unitCode, llvm::sys::TimePoint<> modTime, IDCode moduleNameCode, bool isSystem)> receiver) {
643
- return Impl->foreachProviderAndFileCodeReference (std::move (receiver));
662
+ bool ReadTransaction::foreachProviderAndFileCodeReference (
663
+ function_ref<bool (IDCode unitCode)> unitFilter,
664
+ function_ref<bool(IDCode provider, IDCode pathCode, IDCode unitCode, llvm::sys::TimePoint<> modTime, IDCode moduleNameCode, bool isSystem)> receiver) {
665
+ return Impl->foreachProviderAndFileCodeReference (std::move (unitFilter), std::move (receiver));
644
666
}
645
667
646
668
bool ReadTransaction::foreachUSROfGlobalSymbolKind (SymbolKind symKind, llvm::function_ref<bool (ArrayRef<IDCode> usrCodes)> receiver) {
0 commit comments