mirror of
https://github.com/MaskRay/ccls.git
synced 2025-02-17 06:01:15 +00:00
Make CXXConversion references wider; use getTypedefNameForAnonDecl; improve CXXDestructor CXXConversion spell
This commit is contained in:
parent
92ee7f3e0f
commit
c202dd3775
@ -56,7 +56,7 @@ OUTPUT:
|
|||||||
"kind": 6,
|
"kind": 6,
|
||||||
"storage": 0,
|
"storage": 0,
|
||||||
"declarations": [],
|
"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",
|
"extent": "4:3-4:12|15041163540773201510|2|0|-1",
|
||||||
"bases": [],
|
"bases": [],
|
||||||
"derived": [],
|
"derived": [],
|
||||||
|
@ -21,7 +21,7 @@ OUTPUT:
|
|||||||
"kind": 6,
|
"kind": 6,
|
||||||
"storage": 0,
|
"storage": 0,
|
||||||
"declarations": [],
|
"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",
|
"extent": "5:3-5:23|15826803741381445676|2|0|-1",
|
||||||
"bases": [],
|
"bases": [],
|
||||||
"derived": [],
|
"derived": [],
|
||||||
@ -36,7 +36,7 @@ OUTPUT:
|
|||||||
"kind": 6,
|
"kind": 6,
|
||||||
"storage": 0,
|
"storage": 0,
|
||||||
"declarations": [],
|
"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",
|
"extent": "8:3-8:26|10963370434658308541|2|0|-1",
|
||||||
"bases": [],
|
"bases": [],
|
||||||
"derived": [],
|
"derived": [],
|
||||||
@ -51,7 +51,7 @@ OUTPUT:
|
|||||||
"kind": 6,
|
"kind": 6,
|
||||||
"storage": 0,
|
"storage": 0,
|
||||||
"declarations": [],
|
"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",
|
"extent": "2:3-2:23|11628904180681204356|2|0|-1",
|
||||||
"bases": [],
|
"bases": [],
|
||||||
"derived": [],
|
"derived": [],
|
||||||
|
@ -675,6 +675,21 @@ public:
|
|||||||
IndexParam::DeclInfo *info;
|
IndexParam::DeclInfo *info;
|
||||||
Usr usr = GetUsr(D, &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) {
|
auto do_def_decl = [&](auto *entity) {
|
||||||
if (is_def) {
|
if (is_def) {
|
||||||
entity->def.spell = GetUse(db, lid, loc, SemDC, role);
|
entity->def.spell = GetUse(db, lid, loc, SemDC, role);
|
||||||
@ -704,8 +719,10 @@ public:
|
|||||||
return true;
|
return true;
|
||||||
case SymbolKind::Func:
|
case SymbolKind::Func:
|
||||||
func = &db->ToFunc(usr);
|
func = &db->ToFunc(usr);
|
||||||
// Span one more column to the left/right if D is CXXConstructor.
|
// Mark as Role::Implicit to span one more column to the left/right.
|
||||||
if (!is_def && !is_decl && D->getKind() == Decl::CXXConstructor)
|
if (!is_def && !is_decl &&
|
||||||
|
(D->getKind() == Decl::CXXConstructor ||
|
||||||
|
D->getKind() == Decl::CXXConversion))
|
||||||
role = Role(role | Role::Implicit);
|
role = Role(role | Role::Implicit);
|
||||||
do_def_decl(func);
|
do_def_decl(func);
|
||||||
if (Spell != Loc)
|
if (Spell != Loc)
|
||||||
@ -728,7 +745,7 @@ public:
|
|||||||
do_def_decl(type);
|
do_def_decl(type);
|
||||||
if (Spell != Loc)
|
if (Spell != Loc)
|
||||||
AddMacroUse(db, SM, usr, SymbolKind::Type, Spell);
|
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);
|
SetName(OrigD, info->short_name, info->qualified, type->def);
|
||||||
if (is_def || is_decl) {
|
if (is_def || is_decl) {
|
||||||
const Decl *DC = cast<Decl>(SemDC);
|
const Decl *DC = cast<Decl>(SemDC);
|
||||||
@ -885,6 +902,25 @@ public:
|
|||||||
// spec has no Union, use Class
|
// spec has no Union, use Class
|
||||||
type->def.kind = RD->getTagKind() == TTK_Struct ? lsSymbolKind::Struct
|
type->def.kind = RD->getTagKind() == TTK_Struct ? lsSymbolKind::Struct
|
||||||
: lsSymbolKind::Class;
|
: 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) {
|
if (is_def) {
|
||||||
SmallVector<std::pair<const RecordDecl *, int>, 2> Stack{{RD, 0}};
|
SmallVector<std::pair<const RecordDecl *, int>, 2> Stack{{RD, 0}};
|
||||||
llvm::DenseSet<const RecordDecl *> Seen;
|
llvm::DenseSet<const RecordDecl *> Seen;
|
||||||
|
Loading…
Reference in New Issue
Block a user