Fix removing entries from querydb.

I expect this will resolve most of the issues with the index getting messed up when actively editing a file.
This commit is contained in:
Jacob Dufault 2017-05-20 00:33:11 -07:00
parent b3d5327342
commit 9ae526089a
2 changed files with 31 additions and 4 deletions

View File

@ -828,5 +828,34 @@ TEST_CASE("type usages") {
REQUIRE(update.types_uses[0].to_add[0].range == Range(Position(2, 0)));
}
TEST_CASE("apply delta") {
IndexFile previous("foo.cc");
IndexFile current("foo.cc");
IndexFunc* pf = previous.Resolve(previous.ToFuncId("usr"));
IndexFunc* cf = current.Resolve(current.ToFuncId("usr"));
pf->callers.push_back(IndexFuncRef(IndexFuncId(0), Range(Position(1, 0))));
pf->callers.push_back(IndexFuncRef(IndexFuncId(0), Range(Position(2, 0))));
cf->callers.push_back(IndexFuncRef(IndexFuncId(0), Range(Position(4, 0))));
cf->callers.push_back(IndexFuncRef(IndexFuncId(0), Range(Position(5, 0))));
QueryDatabase db;
IdMap previous_map(&db, previous.id_cache);
IdMap current_map(&db, current.id_cache);
REQUIRE(db.funcs.size() == 1);
IndexUpdate import_update = IndexUpdate::CreateDelta(nullptr, &previous_map, nullptr, &previous);
IndexUpdate delta_update = IndexUpdate::CreateDelta(&previous_map, &current_map, &previous, &current);
db.ApplyIndexUpdate(&import_update);
REQUIRE(db.funcs[0]->callers.size() == 2);
REQUIRE(db.funcs[0]->callers[0].loc.range == Range(Position(1, 0)));
REQUIRE(db.funcs[0]->callers[1].loc.range == Range(Position(2, 0)));
db.ApplyIndexUpdate(&delta_update);
REQUIRE(db.funcs[0]->callers.size() == 2);
REQUIRE(db.funcs[0]->callers[0].loc.range == Range(Position(4, 0)));
REQUIRE(db.funcs[0]->callers[1].loc.range == Range(Position(5, 0)));
}
TEST_SUITE_END();

View File

@ -75,12 +75,10 @@ void PushRange(std::queue<T>* dest, const std::vector<T>& to_add) {
template<typename T>
void RemoveRange(std::vector<T>* dest, const std::vector<T>& to_remove) {
auto it = std::remove_if(dest->begin(), dest->end(), [&](const T& t) {
dest->erase(std::remove_if(dest->begin(), dest->end(), [&](const T& t) {
// TODO: make to_remove a set?
return std::find(to_remove.begin(), to_remove.end(), t) != to_remove.end();
});
if (it != dest->end())
dest->erase(it);
}), dest->end());
}
// http://stackoverflow.com/a/38140932