mirror of
https://github.com/MaskRay/ccls.git
synced 2025-01-19 12:05:50 +00:00
Fix indexing function call when there is implicit ctor call
This commit is contained in:
parent
fdbb820d50
commit
abbc6380f4
@ -6,6 +6,17 @@
|
||||
#include "platform.h"
|
||||
#include "serializer.h"
|
||||
|
||||
namespace {
|
||||
|
||||
void AddFuncRef(std::vector<IndexFuncRef>* result, IndexFuncRef ref) {
|
||||
if (!result->empty() && (*result)[result->size() - 1] == ref)
|
||||
return;
|
||||
result->push_back(ref);
|
||||
}
|
||||
|
||||
} // namespace
|
||||
|
||||
|
||||
IndexedFile::IndexedFile(const std::string& path) : id_cache(path), path(path) {
|
||||
// TODO: Reconsider if we should still be reusing the same id_cache.
|
||||
// Preallocate any existing resolved ids.
|
||||
@ -192,10 +203,6 @@ struct IndexParam {
|
||||
FileConsumer* file_consumer;
|
||||
NamespaceHelper ns;
|
||||
|
||||
// Record last func usage we reported, as clang will record the reference
|
||||
// twice. We don't want to double report.
|
||||
Range last_func_usage_location;
|
||||
|
||||
IndexParam(FileConsumer* file_consumer) : file_consumer(file_consumer) {}
|
||||
};
|
||||
|
||||
@ -1242,11 +1249,6 @@ void indexEntityReference(CXClientData client_data,
|
||||
if (!loc_spelling)
|
||||
break;
|
||||
|
||||
// Don't report duplicate usages.
|
||||
if (param->last_func_usage_location == loc_spelling.value())
|
||||
break;
|
||||
param->last_func_usage_location = loc_spelling.value();
|
||||
|
||||
// Note: be careful, calling db->ToFuncId invalidates the FuncDef* ptrs.
|
||||
IndexFuncId called_id = db->ToFuncId(ref->referencedEntity->USR);
|
||||
if (IsFunctionCallContext(ref->container->cursor.kind)) {
|
||||
@ -1254,8 +1256,8 @@ void indexEntityReference(CXClientData client_data,
|
||||
IndexedFuncDef* caller_def = db->Resolve(caller_id);
|
||||
IndexedFuncDef* called_def = db->Resolve(called_id);
|
||||
|
||||
caller_def->def.callees.push_back(IndexFuncRef(called_id, loc_spelling.value()));
|
||||
called_def->callers.push_back(IndexFuncRef(caller_id, loc_spelling.value()));
|
||||
AddFuncRef(&caller_def->def.callees, IndexFuncRef(called_id, loc_spelling.value()));
|
||||
AddFuncRef(&called_def->callers, IndexFuncRef(caller_id, loc_spelling.value()));
|
||||
AddUsage(called_def->uses, loc_spelling.value());
|
||||
} else {
|
||||
IndexedFuncDef* called_def = db->Resolve(called_id);
|
||||
|
@ -195,6 +195,9 @@ struct QueryableFuncDef {
|
||||
DefUpdate def;
|
||||
std::vector<QueryableLocation> declarations;
|
||||
std::vector<QueryFuncId> derived;
|
||||
// TODO: It seems like callers is always the same as uses except callers does
|
||||
// not include the definition or declaration. We should get a large space
|
||||
// saving by removing it.
|
||||
std::vector<QueryFuncRef> callers;
|
||||
std::vector<QueryableLocation> uses;
|
||||
size_t qualified_name_idx = -1;
|
||||
|
@ -119,7 +119,7 @@ void RunTests() {
|
||||
//if (path != "tests/templates/namespace_template_class_template_func_usage_folded_into_one.cc") continue;
|
||||
//if (path != "tests/multi_file/header.h") continue;
|
||||
//if (path != "tests/multi_file/simple_impl.cc") continue;
|
||||
//if (path != "tests/usage/func_called_from_template.cc") continue;
|
||||
//if (path != "tests/usage/func_called_implicit_ctor.cc") continue;
|
||||
//if (path != "tests/templates/implicit_variable_instantiation.cc") continue;
|
||||
//if (path != "tests/_empty_test.cc") continue;
|
||||
|
||||
|
53
tests/usage/func_called_implicit_ctor.cc
Normal file
53
tests/usage/func_called_implicit_ctor.cc
Normal file
@ -0,0 +1,53 @@
|
||||
struct Wrapper {
|
||||
Wrapper(int i);
|
||||
};
|
||||
|
||||
int called() { return 1; }
|
||||
|
||||
Wrapper caller() {
|
||||
return called();
|
||||
}
|
||||
|
||||
/*
|
||||
OUTPUT:
|
||||
{
|
||||
"types": [{
|
||||
"id": 0,
|
||||
"usr": "c:@S@Wrapper",
|
||||
"short_name": "Wrapper",
|
||||
"qualified_name": "Wrapper",
|
||||
"definition_spelling": "1:8-1:15",
|
||||
"definition_extent": "1:1-3:2",
|
||||
"funcs": [0],
|
||||
"uses": ["*1:8-1:15", "2:3-2:10", "*7:1-7:8"]
|
||||
}],
|
||||
"funcs": [{
|
||||
"id": 0,
|
||||
"usr": "c:@S@Wrapper@F@Wrapper#I#",
|
||||
"short_name": "Wrapper",
|
||||
"qualified_name": "Wrapper::Wrapper",
|
||||
"declarations": ["2:3-2:10"],
|
||||
"declaring_type": 0,
|
||||
"callers": ["2@8:10-8:16"],
|
||||
"uses": ["2:3-2:10", "8:10-8:16"]
|
||||
}, {
|
||||
"id": 1,
|
||||
"usr": "c:@F@called#",
|
||||
"short_name": "called",
|
||||
"qualified_name": "called",
|
||||
"definition_spelling": "5:5-5:11",
|
||||
"definition_extent": "5:1-5:27",
|
||||
"callers": ["2@8:10-8:16"],
|
||||
"uses": ["5:5-5:11", "8:10-8:16"]
|
||||
}, {
|
||||
"id": 2,
|
||||
"usr": "c:@F@caller#",
|
||||
"short_name": "caller",
|
||||
"qualified_name": "caller",
|
||||
"definition_spelling": "7:9-7:15",
|
||||
"definition_extent": "7:1-9:2",
|
||||
"callees": ["0@8:10-8:16", "1@8:10-8:16"],
|
||||
"uses": ["7:9-7:15"]
|
||||
}]
|
||||
}
|
||||
*/
|
Loading…
Reference in New Issue
Block a user