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 "platform.h"
|
||||||
#include "serializer.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) {
|
IndexedFile::IndexedFile(const std::string& path) : id_cache(path), path(path) {
|
||||||
// TODO: Reconsider if we should still be reusing the same id_cache.
|
// TODO: Reconsider if we should still be reusing the same id_cache.
|
||||||
// Preallocate any existing resolved ids.
|
// Preallocate any existing resolved ids.
|
||||||
@ -192,10 +203,6 @@ struct IndexParam {
|
|||||||
FileConsumer* file_consumer;
|
FileConsumer* file_consumer;
|
||||||
NamespaceHelper ns;
|
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) {}
|
IndexParam(FileConsumer* file_consumer) : file_consumer(file_consumer) {}
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -1242,11 +1249,6 @@ void indexEntityReference(CXClientData client_data,
|
|||||||
if (!loc_spelling)
|
if (!loc_spelling)
|
||||||
break;
|
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.
|
// Note: be careful, calling db->ToFuncId invalidates the FuncDef* ptrs.
|
||||||
IndexFuncId called_id = db->ToFuncId(ref->referencedEntity->USR);
|
IndexFuncId called_id = db->ToFuncId(ref->referencedEntity->USR);
|
||||||
if (IsFunctionCallContext(ref->container->cursor.kind)) {
|
if (IsFunctionCallContext(ref->container->cursor.kind)) {
|
||||||
@ -1254,8 +1256,8 @@ void indexEntityReference(CXClientData client_data,
|
|||||||
IndexedFuncDef* caller_def = db->Resolve(caller_id);
|
IndexedFuncDef* caller_def = db->Resolve(caller_id);
|
||||||
IndexedFuncDef* called_def = db->Resolve(called_id);
|
IndexedFuncDef* called_def = db->Resolve(called_id);
|
||||||
|
|
||||||
caller_def->def.callees.push_back(IndexFuncRef(called_id, loc_spelling.value()));
|
AddFuncRef(&caller_def->def.callees, IndexFuncRef(called_id, loc_spelling.value()));
|
||||||
called_def->callers.push_back(IndexFuncRef(caller_id, loc_spelling.value()));
|
AddFuncRef(&called_def->callers, IndexFuncRef(caller_id, loc_spelling.value()));
|
||||||
AddUsage(called_def->uses, loc_spelling.value());
|
AddUsage(called_def->uses, loc_spelling.value());
|
||||||
} else {
|
} else {
|
||||||
IndexedFuncDef* called_def = db->Resolve(called_id);
|
IndexedFuncDef* called_def = db->Resolve(called_id);
|
||||||
|
@ -195,6 +195,9 @@ struct QueryableFuncDef {
|
|||||||
DefUpdate def;
|
DefUpdate def;
|
||||||
std::vector<QueryableLocation> declarations;
|
std::vector<QueryableLocation> declarations;
|
||||||
std::vector<QueryFuncId> derived;
|
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<QueryFuncRef> callers;
|
||||||
std::vector<QueryableLocation> uses;
|
std::vector<QueryableLocation> uses;
|
||||||
size_t qualified_name_idx = -1;
|
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/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/header.h") continue;
|
||||||
//if (path != "tests/multi_file/simple_impl.cc") 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/templates/implicit_variable_instantiation.cc") continue;
|
||||||
//if (path != "tests/_empty_test.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