textDocument/definition: don't jump to the type definition

This commit is contained in:
Fangrui Song 2019-08-22 02:24:20 -07:00
parent 03263c8521
commit 459091af4f

View File

@ -21,30 +21,6 @@ limitations under the License.
#include <stdlib.h> #include <stdlib.h>
namespace ccls { namespace ccls {
namespace {
std::vector<DeclRef> GetNonDefDeclarationTargets(DB *db, SymbolRef sym) {
switch (sym.kind) {
case Kind::Var: {
std::vector<DeclRef> ret = GetNonDefDeclarations(db, sym);
// If there is no declaration, jump to its type.
if (ret.empty()) {
for (auto &def : db->GetVar(sym).def)
if (def.type) {
if (Maybe<DeclRef> use =
GetDefinitionSpell(db, SymbolIdx{def.type, Kind::Type})) {
ret.push_back(*use);
break;
}
}
}
return ret;
}
default:
return GetNonDefDeclarations(db, sym);
}
}
} // namespace
void MessageHandler::textDocument_declaration(TextDocumentPositionParam &param, void MessageHandler::textDocument_declaration(TextDocumentPositionParam &param,
ReplyOnce &reply) { ReplyOnce &reply) {
int file_id; int file_id;
@ -96,7 +72,7 @@ void MessageHandler::textDocument_definition(TextDocumentPositionParam &param,
// |uses| is empty if on a declaration/definition, otherwise it includes // |uses| is empty if on a declaration/definition, otherwise it includes
// all declarations/definitions. // all declarations/definitions.
if (drs.empty()) { if (drs.empty()) {
for (DeclRef dr : GetNonDefDeclarationTargets(db, sym)) for (DeclRef dr : GetNonDefDeclarations(db, sym))
if (!(dr.file_id == file_id && if (!(dr.file_id == file_id &&
dr.range.Contains(ls_pos.line, ls_pos.character))) dr.range.Contains(ls_pos.line, ls_pos.character)))
drs.push_back(dr); drs.push_back(dr);