Var DetailedName

This commit is contained in:
Fangrui Song 2018-02-26 17:23:45 -08:00
parent 09dd20226f
commit 60c0267432
2 changed files with 32 additions and 19 deletions

View File

@ -390,9 +390,16 @@ struct VarDefDefinitionData {
if (qualified) if (qualified)
return detailed_name; return detailed_name;
int i = short_name_offset; int i = short_name_offset;
while (i && (isalnum(detailed_name[i - 1]) || detailed_name[i - 1] == '_' || for (int paren = 0; i; i--) {
detailed_name[i - 1] == ':')) // Skip parentheses in "(anon struct)::name"
i--; if (detailed_name[i - 1] == ')')
paren++;
else if (detailed_name[i - 1] == '(')
paren--;
else if (!(paren > 0 || isalnum(detailed_name[i - 1]) ||
detailed_name[i - 1] == '_' || detailed_name[i - 1] == ':'))
break;
}
return detailed_name.substr(0, i) + detailed_name.substr(short_name_offset); return detailed_name.substr(0, i) + detailed_name.substr(short_name_offset);
} }
}; };

View File

@ -46,7 +46,7 @@ struct Out_CqueryMemberHierarchy
lsLocation location; lsLocation location;
// For unexpanded nodes, this is an upper bound because some entities may be // For unexpanded nodes, this is an upper bound because some entities may be
// undefined. If it is 0, there are no members. // undefined. If it is 0, there are no members.
int numChildren; int numChildren = 0;
// Empty if the |levels| limit is reached. // Empty if the |levels| limit is reached.
std::vector<Entry> children; std::vector<Entry> children;
}; };
@ -71,13 +71,10 @@ bool Expand(MessageHandler* m,
// builtin types have no declaration and empty |detailed_name|. // builtin types have no declaration and empty |detailed_name|.
if (CXType_FirstBuiltin <= type.usr && type.usr <= CXType_LastBuiltin) { if (CXType_FirstBuiltin <= type.usr && type.usr <= CXType_LastBuiltin) {
entry->name = ClangBuiltinTypeName(CXTypeKind(type.usr)); entry->name = ClangBuiltinTypeName(CXTypeKind(type.usr));
entry->numChildren = 0;
return true; return true;
} }
if (!def) { if (!def)
entry->numChildren = 0;
return false; return false;
}
if (detailed_name) if (detailed_name)
entry->name = def->detailed_name; entry->name = def->detailed_name;
else else
@ -99,10 +96,9 @@ bool Expand(MessageHandler* m,
}); });
if (def->alias_of) { if (def->alias_of) {
const QueryType::Def* def1 = m->db->types[def->alias_of->id].AnyDef(); const QueryType::Def* def1 = m->db->types[def->alias_of->id].AnyDef();
if (!def1)
continue;
Out_CqueryMemberHierarchy::Entry entry1; Out_CqueryMemberHierarchy::Entry entry1;
entry1.id = *def->alias_of; entry1.id = *def->alias_of;
if (def1) {
if (def1->spell) { if (def1->spell) {
if (optional<lsLocation> loc = if (optional<lsLocation> loc =
GetLsLocation(m->db, m->working_files, *def1->spell)) GetLsLocation(m->db, m->working_files, *def1->spell))
@ -110,15 +106,19 @@ bool Expand(MessageHandler* m,
} }
if (detailed_name) if (detailed_name)
entry1.fieldName = def1->detailed_name; entry1.fieldName = def1->detailed_name;
if (Expand(m, &entry1, detailed_name, levels - 1)) }
if (Expand(m, &entry1, detailed_name, levels - 1)) {
// For builtin types |name| is set.
if (detailed_name && entry1.fieldName.empty())
entry1.fieldName = std::string(entry1.name);
entry->children.push_back(std::move(entry1)); entry->children.push_back(std::move(entry1));
}
} else { } else {
EachDefinedEntity(m->db->vars, def->vars, [&](QueryVar& var) { EachDefinedEntity(m->db->vars, def->vars, [&](QueryVar& var) {
const QueryVar::Def* def1 = var.AnyDef(); const QueryVar::Def* def1 = var.AnyDef();
if (!def1) if (!def1)
return; return;
Out_CqueryMemberHierarchy::Entry entry1; Out_CqueryMemberHierarchy::Entry entry1;
entry1.id = def1->type ? *def1->type : QueryTypeId();
if (detailed_name) if (detailed_name)
entry1.fieldName = def1->DetailedName(false); entry1.fieldName = def1->DetailedName(false);
else else
@ -128,8 +128,14 @@ bool Expand(MessageHandler* m,
GetLsLocation(m->db, m->working_files, *def1->spell)) GetLsLocation(m->db, m->working_files, *def1->spell))
entry1.location = *loc; entry1.location = *loc;
} }
if (def1->type && Expand(m, &entry1, detailed_name, levels - 1)) if (def1->type) {
entry1.id = *def1->type;
if (Expand(m, &entry1, detailed_name, levels - 1))
entry->children.push_back(std::move(entry1)); entry->children.push_back(std::move(entry1));
} else {
entry1.id = QueryTypeId();
entry->children.push_back(std::move(entry1));
}
}); });
} }
} }