Rename some variables in the indexer.

This commit is contained in:
Jacob Dufault 2017-05-27 10:03:49 -07:00
parent b66f015a4a
commit e9025104cb

View File

@ -910,35 +910,35 @@ void indexDeclaration(CXClientData client_data, const CXIdxDeclInfo* decl) {
std::string decl_usr = decl_cursor.get_usr(); std::string decl_usr = decl_cursor.get_usr();
IndexVarId var_id = db->ToVarId(decl->entityInfo->USR); IndexVarId var_id = db->ToVarId(decl->entityInfo->USR);
IndexVar* var_def = db->Resolve(var_id); IndexVar* var = db->Resolve(var_id);
// TODO: Eventually run with this if. Right now I want to iron out bugs // TODO: Eventually run with this if. Right now I want to iron out bugs
// this may shadow. // this may shadow.
// TODO: Verify this gets called multiple times // TODO: Verify this gets called multiple times
// if (!decl->isRedeclaration) { // if (!decl->isRedeclaration) {
var_def->def.short_name = decl->entityInfo->name; var->def.short_name = decl->entityInfo->name;
std::string type_name = clang::ToString(clang_getTypeSpelling(clang_getCursorType(decl->cursor))); std::string type_name = clang::ToString(clang_getTypeSpelling(clang_getCursorType(decl->cursor)));
var_def->def.detailed_name = type_name + " " + ns->QualifiedName(decl->semanticContainer, var_def->def.short_name); var->def.detailed_name = type_name + " " + ns->QualifiedName(decl->semanticContainer, var->def.short_name);
var_def->def.is_local = !decl->semanticContainer || IsLocalSemanticContainer(decl->semanticContainer->cursor.kind); var->def.is_local = !decl->semanticContainer || IsLocalSemanticContainer(decl->semanticContainer->cursor.kind);
//} //}
if (decl->isDefinition) { if (decl->isDefinition) {
var_def->def.definition_spelling = ResolveSpelling(decl->cursor); var->def.definition_spelling = ResolveSpelling(decl->cursor);
var_def->def.definition_extent = ResolveExtent(decl->cursor);; var->def.definition_extent = ResolveExtent(decl->cursor);;
} }
else { else {
var_def->def.declaration = ResolveSpelling(decl->cursor); var->def.declaration = ResolveSpelling(decl->cursor);
} }
UniqueAdd(var_def->uses, decl_loc_spelling); UniqueAdd(var->uses, decl_loc_spelling);
// std::cerr << std::endl << "Visiting declaration" << std::endl; // std::cerr << std::endl << "Visiting declaration" << std::endl;
// Dump(decl_cursor); // Dump(decl_cursor);
AddDeclInitializerUsages(db, decl_cursor); AddDeclInitializerUsages(db, decl_cursor);
var_def = db->Resolve(var_id); var = db->Resolve(var_id);
// Declaring variable type information. Note that we do not insert an // Declaring variable type information. Note that we do not insert an
// interesting reference for parameter declarations - that is handled when // interesting reference for parameter declarations - that is handled when
@ -959,7 +959,7 @@ void indexDeclaration(CXClientData client_data, const CXIdxDeclInfo* decl) {
if (!is_enum_member) if (!is_enum_member)
db->Resolve(var_type.value())->instances.push_back(var_id); db->Resolve(var_type.value())->instances.push_back(var_id);
var_def->def.variable_type = var_type.value(); var->def.variable_type = var_type.value();
} }
} }
@ -968,7 +968,7 @@ void indexDeclaration(CXClientData client_data, const CXIdxDeclInfo* decl) {
IndexTypeId declaring_type_id = IndexTypeId declaring_type_id =
db->ToTypeId(decl->semanticContainer->cursor); db->ToTypeId(decl->semanticContainer->cursor);
IndexType* declaring_type_def = db->Resolve(declaring_type_id); IndexType* declaring_type_def = db->Resolve(declaring_type_id);
var_def->def.declaring_type = declaring_type_id; var->def.declaring_type = declaring_type_id;
declaring_type_def->def.vars.push_back(var_id); declaring_type_def->def.vars.push_back(var_id);
} }
@ -988,7 +988,7 @@ void indexDeclaration(CXClientData client_data, const CXIdxDeclInfo* decl) {
decl_cursor.template_specialization_to_template_definition(); decl_cursor.template_specialization_to_template_definition();
IndexFuncId func_id = db->ToFuncId(resolved.cx_cursor); IndexFuncId func_id = db->ToFuncId(resolved.cx_cursor);
IndexFunc* func_def = db->Resolve(func_id); IndexFunc* func = db->Resolve(func_id);
// We don't actually need to know the return type, but we need to mark it // We don't actually need to know the return type, but we need to mark it
// as an interesting usage. // as an interesting usage.
@ -1011,17 +1011,17 @@ void indexDeclaration(CXClientData client_data, const CXIdxDeclInfo* decl) {
// TODO: support multiple definitions per function; right now we are // TODO: support multiple definitions per function; right now we are
// hacking the 'declarations' field by // hacking the 'declarations' field by
// adding a definition when we really don't have one. // adding a definition when we really don't have one.
if (decl->isDefinition && !func_def->def.definition_extent.has_value()) { if (decl->isDefinition && !func->def.definition_extent.has_value()) {
func_def->def.definition_spelling = ResolveSpelling(decl->cursor); func->def.definition_spelling = ResolveSpelling(decl->cursor);
func_def->def.definition_extent = ResolveExtent(decl->cursor); func->def.definition_extent = ResolveExtent(decl->cursor);
RemoveItem(func_def->declarations, *func_def->def.definition_spelling); RemoveItem(func->declarations, *func->def.definition_spelling);
} }
else { else {
Range decl_spelling = ResolveSpelling(decl->cursor); Range decl_spelling = ResolveSpelling(decl->cursor);
// Only add the declaration if it's not already a definition. // Only add the declaration if it's not already a definition.
if (!func_def->def.definition_spelling || *func_def->def.definition_spelling != decl_spelling) if (!func->def.definition_spelling || *func->def.definition_spelling != decl_spelling)
UniqueAdd(func_def->declarations, decl_spelling); UniqueAdd(func->declarations, decl_spelling);
} }
// If decl_cursor != resolved, then decl_cursor is a template // If decl_cursor != resolved, then decl_cursor is a template
@ -1031,15 +1031,15 @@ void indexDeclaration(CXClientData client_data, const CXIdxDeclInfo* decl) {
// TODO: Eventually run with this if. Right now I want to iron out bugs // TODO: Eventually run with this if. Right now I want to iron out bugs
// this may shadow. // this may shadow.
// if (!decl->isRedeclaration) { // if (!decl->isRedeclaration) {
func_def->def.short_name = decl->entityInfo->name; func->def.short_name = decl->entityInfo->name;
// Build detailed name. The type desc looks like void (void *). We // Build detailed name. The type desc looks like void (void *). We
// insert the qualified name before the first '('. // insert the qualified name before the first '('.
std::string qualified_name = ns->QualifiedName(decl->semanticContainer, func_def->def.short_name); std::string qualified_name = ns->QualifiedName(decl->semanticContainer, func->def.short_name);
std::string type_desc = decl_cursor.get_type_description(); std::string type_desc = decl_cursor.get_type_description();
size_t offset = type_desc.find('('); size_t offset = type_desc.find('(');
type_desc.insert(offset, qualified_name); type_desc.insert(offset, qualified_name);
func_def->def.detailed_name = type_desc; func->def.detailed_name = type_desc;
bool is_ctor_or_dtor = bool is_ctor_or_dtor =
decl->entityInfo->kind == CXIdxEntity_CXXConstructor || decl->entityInfo->kind == CXIdxEntity_CXXConstructor ||
@ -1053,7 +1053,7 @@ void indexDeclaration(CXClientData client_data, const CXIdxDeclInfo* decl) {
IndexTypeId declaring_type_id = IndexTypeId declaring_type_id =
db->ToTypeId(decl->semanticContainer->cursor); db->ToTypeId(decl->semanticContainer->cursor);
IndexType* declaring_type_def = db->Resolve(declaring_type_id); IndexType* declaring_type_def = db->Resolve(declaring_type_id);
func_def->def.declaring_type = declaring_type_id; func->def.declaring_type = declaring_type_id;
// Mark a type reference at the ctor/dtor location. // Mark a type reference at the ctor/dtor location.
if (is_ctor_or_dtor) { if (is_ctor_or_dtor) {
@ -1077,15 +1077,15 @@ void indexDeclaration(CXClientData client_data, const CXIdxDeclInfo* decl) {
// FIXME if it ever shows up. Methods should only ever have 1 base // FIXME if it ever shows up. Methods should only ever have 1 base
// type, though. // type, though.
if (num_overridden > 1) if (num_overridden > 1)
std::cerr << "[indexer]: warning: multiple base overrides for " << func_def->def.detailed_name << std::endl; std::cerr << "[indexer]: warning: multiple base overrides for " << func->def.detailed_name << std::endl;
for (unsigned i = 0; i < num_overridden; ++i) { for (unsigned i = 0; i < num_overridden; ++i) {
clang::Cursor parent = overridden[i]; clang::Cursor parent = overridden[i];
IndexFuncId parent_id = db->ToFuncId(parent.get_usr()); IndexFuncId parent_id = db->ToFuncId(parent.get_usr());
IndexFunc* parent_def = db->Resolve(parent_id); IndexFunc* parent_def = db->Resolve(parent_id);
func_def = db->Resolve(func_id); // ToFuncId invalidated func_def func = db->Resolve(func_id); // ToFuncId invalidated func_def
func_def->def.base = parent_id; func->def.base = parent_id;
parent_def->derived.push_back(func_id); parent_def->derived.push_back(func_id);
} }
@ -1133,18 +1133,18 @@ void indexDeclaration(CXClientData client_data, const CXIdxDeclInfo* decl) {
decl->semanticContainer, decl->lexicalContainer); decl->semanticContainer, decl->lexicalContainer);
IndexTypeId type_id = db->ToTypeId(decl->entityInfo->USR); IndexTypeId type_id = db->ToTypeId(decl->entityInfo->USR);
IndexType* type_def = db->Resolve(type_id); IndexType* type = db->Resolve(type_id);
if (alias_of) if (alias_of)
type_def->def.alias_of = alias_of.value(); type->def.alias_of = alias_of.value();
type_def->def.short_name = decl->entityInfo->name; type->def.short_name = decl->entityInfo->name;
type_def->def.detailed_name = type->def.detailed_name =
ns->QualifiedName(decl->semanticContainer, type_def->def.short_name); ns->QualifiedName(decl->semanticContainer, type->def.short_name);
type_def->def.definition_spelling = ResolveSpelling(decl->cursor); type->def.definition_spelling = ResolveSpelling(decl->cursor);
type_def->def.definition_extent = ResolveExtent(decl->cursor); type->def.definition_extent = ResolveExtent(decl->cursor);
UniqueAdd(type_def->uses, decl_loc_spelling); UniqueAdd(type->uses, decl_loc_spelling);
break; break;
} }
@ -1155,7 +1155,7 @@ void indexDeclaration(CXClientData client_data, const CXIdxDeclInfo* decl) {
Range decl_loc_spelling = ResolveSpelling(decl->cursor); Range decl_loc_spelling = ResolveSpelling(decl->cursor);
IndexTypeId type_id = db->ToTypeId(decl->entityInfo->USR); IndexTypeId type_id = db->ToTypeId(decl->entityInfo->USR);
IndexType* type_def = db->Resolve(type_id); IndexType* type = db->Resolve(type_id);
// TODO: Eventually run with this if. Right now I want to iron out bugs // TODO: Eventually run with this if. Right now I want to iron out bugs
// this may shadow. // this may shadow.
@ -1168,20 +1168,20 @@ void indexDeclaration(CXClientData client_data, const CXIdxDeclInfo* decl) {
ns->RegisterQualifiedName(decl->entityInfo->USR, ns->RegisterQualifiedName(decl->entityInfo->USR,
decl->semanticContainer, decl->semanticContainer,
decl->entityInfo->name); decl->entityInfo->name);
type_def->def.short_name = decl->entityInfo->name; type->def.short_name = decl->entityInfo->name;
} else { } else {
type_def->def.short_name = "<anonymous>"; type->def.short_name = "<anonymous>";
} }
type_def->def.detailed_name = type->def.detailed_name =
ns->QualifiedName(decl->semanticContainer, type_def->def.short_name); ns->QualifiedName(decl->semanticContainer, type->def.short_name);
// } // }
assert(decl->isDefinition); assert(decl->isDefinition);
type_def->def.definition_spelling = ResolveSpelling(decl->cursor); type->def.definition_spelling = ResolveSpelling(decl->cursor);
type_def->def.definition_extent = ResolveExtent(decl->cursor); type->def.definition_extent = ResolveExtent(decl->cursor);
UniqueAdd(type_def->uses, decl_loc_spelling); UniqueAdd(type->uses, decl_loc_spelling);
// type_def->alias_of // type_def->alias_of
// type_def->funcs // type_def->funcs
@ -1201,12 +1201,12 @@ void indexDeclaration(CXClientData client_data, const CXIdxDeclInfo* decl) {
optional<IndexTypeId> parent_type_id = optional<IndexTypeId> parent_type_id =
ResolveToDeclarationType(db, base_class->cursor); ResolveToDeclarationType(db, base_class->cursor);
// type_def ptr could be invalidated by ResolveToDeclarationType. // type_def ptr could be invalidated by ResolveToDeclarationType.
type_def = db->Resolve(type_id); type = db->Resolve(type_id);
if (parent_type_id) { if (parent_type_id) {
IndexType* parent_type_def = IndexType* parent_type_def =
db->Resolve(parent_type_id.value()); db->Resolve(parent_type_id.value());
parent_type_def->derived.push_back(type_id); parent_type_def->derived.push_back(type_id);
type_def->def.parents.push_back(parent_type_id.value()); type->def.parents.push_back(parent_type_id.value());
} }
} }
} }
@ -1365,8 +1365,8 @@ void indexEntityReference(CXClientData client_data,
referenced = referenced.template_specialization_to_template_definition(); referenced = referenced.template_specialization_to_template_definition();
IndexVarId var_id = db->ToVarId(referenced.get_usr()); IndexVarId var_id = db->ToVarId(referenced.get_usr());
IndexVar* var_def = db->Resolve(var_id); IndexVar* var = db->Resolve(var_id);
UniqueAdd(var_def->uses, loc_spelling); UniqueAdd(var->uses, loc_spelling);
break; break;
} }
@ -1389,24 +1389,24 @@ void indexEntityReference(CXClientData client_data,
Range loc_spelling = ResolveSpelling(ref->cursor); Range loc_spelling = ResolveSpelling(ref->cursor);
IndexFuncId called_id = db->ToFuncId(ref->referencedEntity->USR); IndexFuncId called_id = db->ToFuncId(ref->referencedEntity->USR);
IndexFunc* called_def = db->Resolve(called_id); IndexFunc* called = db->Resolve(called_id);
// libclang doesn't provide a nice api to check if the given function // libclang doesn't provide a nice api to check if the given function
// call is implicit. ref->kind should probably work (it's either direct // call is implicit. ref->kind should probably work (it's either direct
// or implicit), but libclang only supports implicit for objective-c. // or implicit), but libclang only supports implicit for objective-c.
bool is_implicit = CanBeCalledImplicitly(ref->referencedEntity->kind) && bool is_implicit = CanBeCalledImplicitly(ref->referencedEntity->kind) &&
!CursorSpellingContainsString(ref->cursor, param->tu->cx_tu, called_def->def.short_name); !CursorSpellingContainsString(ref->cursor, param->tu->cx_tu, called->def.short_name);
if (IsFunctionCallContext(ref->container->cursor.kind)) { if (IsFunctionCallContext(ref->container->cursor.kind)) {
IndexFuncId caller_id = db->ToFuncId(ref->container->cursor); IndexFuncId caller_id = db->ToFuncId(ref->container->cursor);
IndexFunc* caller_def = db->Resolve(caller_id); IndexFunc* caller = db->Resolve(caller_id);
// Calling db->ToFuncId invalidates the FuncDef* ptrs. // Calling db->ToFuncId invalidates the FuncDef* ptrs.
called_def = db->Resolve(called_id); called = db->Resolve(called_id);
AddFuncRef(&caller_def->def.callees, IndexFuncRef(called_id, loc_spelling, is_implicit)); AddFuncRef(&caller->def.callees, IndexFuncRef(called_id, loc_spelling, is_implicit));
AddFuncRef(&called_def->callers, IndexFuncRef(caller_id, loc_spelling, is_implicit)); AddFuncRef(&called->callers, IndexFuncRef(caller_id, loc_spelling, is_implicit));
} else { } else {
AddFuncRef(&called_def->callers, IndexFuncRef(loc_spelling, is_implicit)); AddFuncRef(&called->callers, IndexFuncRef(loc_spelling, is_implicit));
} }
break; break;
@ -1418,21 +1418,18 @@ void indexEntityReference(CXClientData client_data,
case CXIdxEntity_Union: case CXIdxEntity_Union:
case CXIdxEntity_Struct: case CXIdxEntity_Struct:
case CXIdxEntity_CXXClass: { case CXIdxEntity_CXXClass: {
Range loc_spelling = ResolveSpelling(ref->cursor); clang::Cursor referenced_cursor = ref->referencedEntity->cursor;
referenced_cursor = referenced_cursor.template_specialization_to_template_definition();
IndexTypeId referenced_id = db->ToTypeId(referenced_cursor.get_usr());
clang::Cursor referenced = ref->referencedEntity->cursor; IndexType* referenced = db->Resolve(referenced_id);
referenced = referenced.template_specialization_to_template_definition();
IndexTypeId referenced_id = db->ToTypeId(referenced.get_usr());
IndexType* referenced_def = db->Resolve(referenced_id);
// //
// The following will generate two TypeRefs to Foo, both located at the // The following will generate two TypeRefs to Foo, both located at the
// same spot (line 3, column 3). One of the parents will be set to // same spot (line 3, column 3). One of the parents will be set to
// CXIdxEntity_Variable, the other will be CXIdxEntity_Function. There // CXIdxEntity_Variable, the other will be CXIdxEntity_Function. There
// does // does not appear to be a good way to disambiguate these references, as
// not appear to be a good way to disambiguate these references, as using // using parent type alone breaks other indexing tasks.
// parent type alone breaks other indexing tasks.
// //
// To work around this, we check to see if the usage location has been // To work around this, we check to see if the usage location has been
// inserted into all_uses previously. // inserted into all_uses previously.
@ -1442,7 +1439,7 @@ void indexEntityReference(CXClientData client_data,
// Foo f; // Foo f;
// } // }
// //
UniqueAdd(referenced_def->uses, loc_spelling); UniqueAdd(referenced->uses, ResolveSpelling(ref->cursor));
break; break;
} }