Browse Source

Make $ccls/inheritanceHierarchy and textDocument/typeDefinition find declarations if definitions do not exist; spelling ranges of operator=

pull/522/head
Fangrui Song 6 years ago
parent
commit
d758b78635
  1. 2
      index_tests/operators/operator.cc
  2. 1
      src/indexer.cc
  3. 3
      src/messages/ccls_inheritanceHierarchy.cc
  4. 34
      src/messages/textDocument_typeDefinition.cc

2
index_tests/operators/operator.cc

@ -45,7 +45,7 @@ OUTPUT:
"kind": 6,
"storage": 0,
"declarations": [],
"spell": "2:8-2:16|15041163540773201510|2|1026|-1",
"spell": "2:8-2:18|15041163540773201510|2|1026|-1",
"extent": "2:3-2:27|15041163540773201510|2|0|-1",
"bases": [],
"derived": [],

1
src/indexer.cc

@ -664,6 +664,7 @@ public:
switch (OrigD->getKind()) {
case Decl::CXXConversion: // *operator* int => *operator int*
case Decl::CXXDestructor: // *~*A => *~A*
case Decl::CXXMethod: // *operator*= => *operator=*
if (Loc.isFileID()) {
SourceRange R =
cast<FunctionDecl>(OrigD)->getNameInfo().getSourceRange();

3
src/messages/ccls_inheritanceHierarchy.cc

@ -71,6 +71,9 @@ bool ExpandHelper(MessageHandler *m, Out_CclsInheritanceHierarchy::Entry *entry,
if (def->spell) {
if (auto loc = GetLsLocation(m->db, m->working_files, *def->spell))
entry->location = *loc;
} else if (entity.declarations.size()) {
if (auto loc = GetLsLocation(m->db, m->working_files, entity.declarations[0]))
entry->location = *loc;
}
} else if (!derived) {
entry->numChildren = 0;

34
src/messages/textDocument_typeDefinition.cc

@ -30,32 +30,40 @@ struct Handler_TextDocumentTypeDefinition
QueryFile *file;
if (!FindFileOrFail(db, project, request->id,
request->params.textDocument.uri.GetPath(), &file,
nullptr)) {
nullptr))
return;
}
WorkingFile *working_file =
working_files->GetFileByFilename(file->def->path);
Out_TextDocumentTypeDefinition out;
out.id = request->id;
auto Add = [&](const QueryType &type) {
for (const auto &def : type.def)
if (def.spell) {
if (auto ls_loc = GetLsLocationEx(db, working_files, *def.spell,
g_config->xref.container))
out.result.push_back(*ls_loc);
}
if (out.result.empty())
for (const DeclRef &dr : type.declarations)
if (auto ls_loc = GetLsLocationEx(db, working_files, dr,
g_config->xref.container))
out.result.push_back(*ls_loc);
};
for (SymbolRef sym :
FindSymbolsAtLocation(working_file, file, request->params.position)) {
Usr usr = sym.usr;
switch (sym.kind) {
case SymbolKind::Var: {
const QueryVar::Def *def = db->GetVar(sym).AnyDef();
if (!def || !def->type)
continue;
usr = def->type;
[[fallthrough]];
if (def && def->type)
Add(db->Type(def->type));
break;
}
case SymbolKind::Type: {
QueryType &type = db->Type(usr);
for (const auto &def : type.def)
if (def.spell) {
if (auto ls_loc = GetLsLocationEx(db, working_files, *def.spell,
g_config->xref.container))
out.result.push_back(*ls_loc);
for (auto &def : db->GetType(sym).def)
if (def.alias_of) {
Add(db->Type(def.alias_of));
break;
}
break;
}

Loading…
Cancel
Save