mirror of
https://github.com/MaskRay/ccls.git
synced 2024-11-26 09:31:59 +00:00
Add bool include_decl
parameter to GetUsesOfSymbol
Fixes #350 Function declarations/definitions are not counted if include_decl is false. We should do similar thing to Var and Type.
This commit is contained in:
parent
723c78409f
commit
37809def7c
@ -38,7 +38,7 @@ struct TextDocumentDocumentHighlightHandler
|
|||||||
for (const SymbolRef& ref :
|
for (const SymbolRef& ref :
|
||||||
FindSymbolsAtLocation(working_file, file, request->params.position)) {
|
FindSymbolsAtLocation(working_file, file, request->params.position)) {
|
||||||
// Found symbol. Return references to highlight.
|
// Found symbol. Return references to highlight.
|
||||||
std::vector<QueryLocation> uses = GetUsesOfSymbol(db, ref.idx);
|
std::vector<QueryLocation> uses = GetUsesOfSymbol(db, ref.idx, true);
|
||||||
out.result.reserve(uses.size());
|
out.result.reserve(uses.size());
|
||||||
for (const QueryLocation& use : uses) {
|
for (const QueryLocation& use : uses) {
|
||||||
if (use.path != file_id)
|
if (use.path != file_id)
|
||||||
|
@ -53,19 +53,11 @@ struct TextDocumentReferencesHandler
|
|||||||
|
|
||||||
for (const SymbolRef& ref :
|
for (const SymbolRef& ref :
|
||||||
FindSymbolsAtLocation(working_file, file, request->params.position)) {
|
FindSymbolsAtLocation(working_file, file, request->params.position)) {
|
||||||
optional<QueryLocation> excluded_declaration;
|
|
||||||
if (!request->params.context.includeDeclaration) {
|
|
||||||
LOG_S(INFO) << "Excluding declaration in references";
|
|
||||||
excluded_declaration = GetDefinitionSpellingOfSymbol(db, ref.idx);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Found symbol. Return references.
|
// Found symbol. Return references.
|
||||||
std::vector<QueryLocation> uses = GetUsesOfSymbol(db, ref.idx);
|
std::vector<QueryLocation> uses = GetUsesOfSymbol(
|
||||||
|
db, ref.idx, request->params.context.includeDeclaration);
|
||||||
out.result.reserve(uses.size());
|
out.result.reserve(uses.size());
|
||||||
for (const QueryLocation& use : uses) {
|
for (const QueryLocation& use : uses) {
|
||||||
if (excluded_declaration.has_value() && use == *excluded_declaration)
|
|
||||||
continue;
|
|
||||||
|
|
||||||
optional<lsLocation> ls_location =
|
optional<lsLocation> ls_location =
|
||||||
GetLsLocation(db, working_files, use);
|
GetLsLocation(db, working_files, use);
|
||||||
if (ls_location)
|
if (ls_location)
|
||||||
|
@ -97,7 +97,7 @@ struct TextDocumentRenameHandler : BaseMessageHandler<Ipc_TextDocumentRename> {
|
|||||||
for (const SymbolRef& ref :
|
for (const SymbolRef& ref :
|
||||||
FindSymbolsAtLocation(working_file, file, request->params.position)) {
|
FindSymbolsAtLocation(working_file, file, request->params.position)) {
|
||||||
// Found symbol. Return references to rename.
|
// Found symbol. Return references to rename.
|
||||||
std::vector<QueryLocation> uses = GetUsesOfSymbol(db, ref.idx);
|
std::vector<QueryLocation> uses = GetUsesOfSymbol(db, ref.idx, true);
|
||||||
out.result =
|
out.result =
|
||||||
BuildWorkspaceEdit(db, working_files, uses, request->params.newName);
|
BuildWorkspaceEdit(db, working_files, uses, request->params.newName);
|
||||||
break;
|
break;
|
||||||
|
@ -182,7 +182,8 @@ std::vector<QueryLocation> ToQueryLocation(QueryDatabase* db,
|
|||||||
}
|
}
|
||||||
|
|
||||||
std::vector<QueryLocation> GetUsesOfSymbol(QueryDatabase* db,
|
std::vector<QueryLocation> GetUsesOfSymbol(QueryDatabase* db,
|
||||||
const SymbolIdx& symbol) {
|
const SymbolIdx& symbol,
|
||||||
|
bool include_decl) {
|
||||||
switch (symbol.kind) {
|
switch (symbol.kind) {
|
||||||
case SymbolKind::Type: {
|
case SymbolKind::Type: {
|
||||||
QueryType& type = db->types[symbol.idx];
|
QueryType& type = db->types[symbol.idx];
|
||||||
@ -192,9 +193,11 @@ std::vector<QueryLocation> GetUsesOfSymbol(QueryDatabase* db,
|
|||||||
// TODO: the vector allocation could be avoided.
|
// TODO: the vector allocation could be avoided.
|
||||||
QueryFunc& func = db->funcs[symbol.idx];
|
QueryFunc& func = db->funcs[symbol.idx];
|
||||||
std::vector<QueryLocation> result = ToQueryLocation(db, func.callers);
|
std::vector<QueryLocation> result = ToQueryLocation(db, func.callers);
|
||||||
AddRange(&result, func.declarations);
|
if (include_decl) {
|
||||||
if (func.def && func.def->definition_spelling)
|
AddRange(&result, func.declarations);
|
||||||
result.push_back(*func.def->definition_spelling);
|
if (func.def && func.def->definition_spelling)
|
||||||
|
result.push_back(*func.def->definition_spelling);
|
||||||
|
}
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
case SymbolKind::Var: {
|
case SymbolKind::Var: {
|
||||||
|
@ -29,7 +29,8 @@ std::vector<QueryLocation> ToQueryLocation(QueryDatabase* db,
|
|||||||
std::vector<QueryLocation> ToQueryLocation(QueryDatabase* db,
|
std::vector<QueryLocation> ToQueryLocation(QueryDatabase* db,
|
||||||
const std::vector<QueryVarId>& ids);
|
const std::vector<QueryVarId>& ids);
|
||||||
std::vector<QueryLocation> GetUsesOfSymbol(QueryDatabase* db,
|
std::vector<QueryLocation> GetUsesOfSymbol(QueryDatabase* db,
|
||||||
const SymbolIdx& symbol);
|
const SymbolIdx& symbol,
|
||||||
|
bool include_decl);
|
||||||
std::vector<QueryLocation> GetDeclarationsOfSymbolForGotoDefinition(
|
std::vector<QueryLocation> GetDeclarationsOfSymbolForGotoDefinition(
|
||||||
QueryDatabase* db,
|
QueryDatabase* db,
|
||||||
const SymbolIdx& symbol);
|
const SymbolIdx& symbol);
|
||||||
@ -65,4 +66,4 @@ std::vector<SymbolRef> FindSymbolsAtLocation(WorkingFile* working_file,
|
|||||||
|
|
||||||
void EmitDiagnostics(WorkingFiles* working_files,
|
void EmitDiagnostics(WorkingFiles* working_files,
|
||||||
std::string path,
|
std::string path,
|
||||||
std::vector<lsDiagnostic> diagnostics);
|
std::vector<lsDiagnostic> diagnostics);
|
||||||
|
Loading…
Reference in New Issue
Block a user