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)
return detailed_name;
int i = short_name_offset;
while (i && (isalnum(detailed_name[i - 1]) || detailed_name[i - 1] == '_' ||
detailed_name[i - 1] == ':'))
i--;
for (int paren = 0; i; i--) {
// Skip parentheses in "(anon struct)::name"
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);
}
};

View File

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