Uniquify textDocument/references

There can be duplicates with template instantiation.
This commit is contained in:
Fangrui Song 2018-07-30 18:00:43 -07:00
parent af881dff18
commit fc6e2af66f
4 changed files with 6 additions and 8 deletions

View File

@ -1110,8 +1110,6 @@ std::string IndexFile::ToString() {
return ccls::Serialize(SerializeFormat::Json, *this); return ccls::Serialize(SerializeFormat::Json, *this);
} }
MAKE_HASHABLE(Use, t.range, t.file_id)
template <typename T> template <typename T>
void Uniquify(std::vector<T>& a) { void Uniquify(std::vector<T>& a) {
std::unordered_set<T> seen; std::unordered_set<T> seen;

View File

@ -61,10 +61,11 @@ struct Use : Reference {
// |file| is used in Query* but not in Index* // |file| is used in Query* but not in Index*
int file_id = -1; int file_id = -1;
bool operator==(const Use& o) const { bool operator==(const Use& o) const {
return range == o.range && usr == o.usr && kind == o.kind && // lexical container info is ignored.
role == o.role && file_id == o.file_id; return range == o.range && file_id == o.file_id;
} }
}; };
MAKE_HASHABLE(Use, t.range, t.file_id)
void Reflect(Reader& visitor, Reference& value); void Reflect(Reader& visitor, Reference& value);
void Reflect(Writer& visitor, Reference& value); void Reflect(Writer& visitor, Reference& value);

View File

@ -63,6 +63,7 @@ struct Handler_TextDocumentReferences
Out_TextDocumentReferences out; Out_TextDocumentReferences out;
out.id = request->id; out.id = request->id;
bool container = g_config->xref.container; bool container = g_config->xref.container;
std::unordered_set<Use> seen_uses;
for (SymbolRef sym : FindSymbolsAtLocation(wfile, file, params.position)) { for (SymbolRef sym : FindSymbolsAtLocation(wfile, file, params.position)) {
// Found symbol. Return references. // Found symbol. Return references.
@ -76,7 +77,8 @@ struct Handler_TextDocumentReferences
stack.pop_back(); stack.pop_back();
auto fn = [&](Use use, lsSymbolKind parent_kind) { auto fn = [&](Use use, lsSymbolKind parent_kind) {
if (Role(use.role & params.context.role) == params.context.role && if (Role(use.role & params.context.role) == params.context.role &&
!(use.role & params.context.excludeRole)) !(use.role & params.context.excludeRole) &&
seen_uses.insert(use).second)
if (std::optional<lsLocationEx> ls_loc = if (std::optional<lsLocationEx> ls_loc =
GetLsLocationEx(db, working_files, use, container)) { GetLsLocationEx(db, working_files, use, container)) {
if (container) if (container)

View File

@ -12,9 +12,6 @@
#include <unordered_map> #include <unordered_map>
#include <unordered_set> #include <unordered_set>
// Used by |REMOVE_ADD| so only |range| is needed.
MAKE_HASHABLE(Use, t.range, t.file_id);
namespace { namespace {
void AssignFileId(const Lid2file_id &, int file_id, SymbolRef &ref) { void AssignFileId(const Lid2file_id &, int file_id, SymbolRef &ref) {