Make CXXConversion references wider; use getTypedefNameForAnonDecl; improve CXXDestructor CXXConversion spell

This commit is contained in:
Fangrui Song 2018-09-08 17:49:52 -07:00
parent 92ee7f3e0f
commit c202dd3775
3 changed files with 43 additions and 7 deletions

View File

@ -56,7 +56,7 @@ OUTPUT:
"kind": 6,
"storage": 0,
"declarations": [],
"spell": "4:3-4:4|15041163540773201510|2|1026|-1",
"spell": "4:3-4:7|15041163540773201510|2|1026|-1",
"extent": "4:3-4:12|15041163540773201510|2|0|-1",
"bases": [],
"derived": [],

View File

@ -21,7 +21,7 @@ OUTPUT:
"kind": 6,
"storage": 0,
"declarations": [],
"spell": "5:11-5:12|15826803741381445676|2|1090|-1",
"spell": "5:11-5:17|15826803741381445676|2|1090|-1",
"extent": "5:3-5:23|15826803741381445676|2|0|-1",
"bases": [],
"derived": [],
@ -36,7 +36,7 @@ OUTPUT:
"kind": 6,
"storage": 0,
"declarations": [],
"spell": "8:3-8:4|10963370434658308541|2|5186|-1",
"spell": "8:3-8:11|10963370434658308541|2|5186|-1",
"extent": "8:3-8:26|10963370434658308541|2|0|-1",
"bases": [],
"derived": [],
@ -51,7 +51,7 @@ OUTPUT:
"kind": 6,
"storage": 0,
"declarations": [],
"spell": "2:11-2:12|11628904180681204356|2|1090|-1",
"spell": "2:11-2:17|11628904180681204356|2|1090|-1",
"extent": "2:3-2:23|11628904180681204356|2|0|-1",
"bases": [],
"derived": [],

View File

@ -675,6 +675,21 @@ public:
IndexParam::DeclInfo *info;
Usr usr = GetUsr(D, &info);
if (is_def)
switch (OrigD->getKind()) {
case Decl::CXXConversion: // *operator* int => *operator int*
case Decl::CXXDestructor: // *~*A => *~A*
if (Loc.isFileID()) {
SourceRange R =
cast<FunctionDecl>(OrigD)->getNameInfo().getSourceRange();
if (R.getEnd().isFileID())
loc = FromTokenRange(SM, Lang, R);
}
break;
default:
break;
}
auto do_def_decl = [&](auto *entity) {
if (is_def) {
entity->def.spell = GetUse(db, lid, loc, SemDC, role);
@ -704,8 +719,10 @@ public:
return true;
case SymbolKind::Func:
func = &db->ToFunc(usr);
// Span one more column to the left/right if D is CXXConstructor.
if (!is_def && !is_decl && D->getKind() == Decl::CXXConstructor)
// Mark as Role::Implicit to span one more column to the left/right.
if (!is_def && !is_decl &&
(D->getKind() == Decl::CXXConstructor ||
D->getKind() == Decl::CXXConversion))
role = Role(role | Role::Implicit);
do_def_decl(func);
if (Spell != Loc)
@ -728,7 +745,7 @@ public:
do_def_decl(type);
if (Spell != Loc)
AddMacroUse(db, SM, usr, SymbolKind::Type, Spell);
if (type->def.detailed_name[0] == '\0')
if (type->def.detailed_name[0] == '\0' && info->short_name.size())
SetName(OrigD, info->short_name, info->qualified, type->def);
if (is_def || is_decl) {
const Decl *DC = cast<Decl>(SemDC);
@ -885,6 +902,25 @@ public:
// spec has no Union, use Class
type->def.kind = RD->getTagKind() == TTK_Struct ? lsSymbolKind::Struct
: lsSymbolKind::Class;
if (type->def.detailed_name[0] == '\0' && info->short_name.empty()) {
if (TypedefNameDecl *TD = RD->getTypedefNameForAnonDecl()) {
StringRef Name = TD->getName();
StringRef Tag;
switch (RD->getTagKind()) {
case TTK_Struct: Tag = "struct "; break;
case TTK_Interface: Tag = "__interface "; break;
case TTK_Union: Tag = "union "; break;
case TTK_Class: Tag = "class "; break;
case TTK_Enum: Tag = "enum "; break;
}
std::string name = ("anon " + Tag + Name).str();
type->def.detailed_name = Intern(name);
type->def.short_name_size = name.size();
} else {
// e.g. "struct {}"
SetName(OrigD, "", "", type->def);
}
}
if (is_def) {
SmallVector<std::pair<const RecordDecl *, int>, 2> Stack{{RD, 0}};
llvm::DenseSet<const RecordDecl *> Seen;