From a8b51c1e200a8f7f8cb274b5d8d744d94e0fdb59 Mon Sep 17 00:00:00 2001 From: Argyrios Kyrtzidis Date: Mon, 29 Feb 2016 07:56:00 +0000 Subject: [index] Add a caller relation for a call reference. llvm-svn: 262207 --- clang/lib/Index/IndexBody.cpp | 45 ++++++++++++++++++++++++++++--------------- 1 file changed, 29 insertions(+), 16 deletions(-) (limited to 'clang/lib/Index/IndexBody.cpp') diff --git a/clang/lib/Index/IndexBody.cpp b/clang/lib/Index/IndexBody.cpp index f7164453db6..fda8388a324 100644 --- a/clang/lib/Index/IndexBody.cpp +++ b/clang/lib/Index/IndexBody.cpp @@ -88,7 +88,7 @@ public: } else if (auto CE = dyn_cast(Parent)) { if (CE->getCallee()->IgnoreParenCasts() == E) { - Roles |= (unsigned)SymbolRole::Call; + addCallRole(Roles, Relations); if (auto *ME = dyn_cast(E)) { if (auto *CXXMD = dyn_cast_or_null(ME->getMemberDecl())) if (CXXMD->isVirtual() && !ME->hasQualifier()) { @@ -120,6 +120,15 @@ public: return Roles; } + void addCallRole(SymbolRoleSet &Roles, + SmallVectorImpl &Relations) { + Roles |= (unsigned)SymbolRole::Call; + if (auto *FD = dyn_cast(ParentDC)) + Relations.emplace_back((unsigned)SymbolRole::RelationCalledBy, FD); + else if (auto *MD = dyn_cast(ParentDC)) + Relations.emplace_back((unsigned)SymbolRole::RelationCalledBy, MD); + } + bool VisitDeclRefExpr(DeclRefExpr *E) { SmallVector Relations; SymbolRoleSet Roles = getRolesForRef(E, Relations); @@ -169,11 +178,12 @@ public: }; if (ObjCMethodDecl *MD = E->getMethodDecl()) { - SymbolRoleSet Roles = (unsigned)SymbolRole::Call; + SymbolRoleSet Roles{}; + SmallVector Relations; + addCallRole(Roles, Relations); if (E->isImplicit()) Roles |= (unsigned)SymbolRole::Implicit; - SmallVector Relations; if (isDynamic(E)) { Roles |= (unsigned)SymbolRole::Dynamic; if (auto *RecD = E->getReceiverInterface()) @@ -206,39 +216,42 @@ public: Parent, ParentDC, SymbolRoleSet(), {}, E); } + bool passObjCLiteralMethodCall(const ObjCMethodDecl *MD, const Expr *E) { + SymbolRoleSet Roles{}; + SmallVector Relations; + addCallRole(Roles, Relations); + Roles |= (unsigned)SymbolRole::Implicit; + return IndexCtx.handleReference(MD, E->getLocStart(), + Parent, ParentDC, Roles, Relations, E); + } + bool VisitObjCBoxedExpr(ObjCBoxedExpr *E) { if (ObjCMethodDecl *MD = E->getBoxingMethod()) { - SymbolRoleSet Roles = (unsigned)SymbolRole::Call; - Roles |= (unsigned)SymbolRole::Implicit; - return IndexCtx.handleReference(MD, E->getLocStart(), - Parent, ParentDC, Roles, {}, E); + return passObjCLiteralMethodCall(MD, E); } return true; } bool VisitObjCDictionaryLiteral(ObjCDictionaryLiteral *E) { if (ObjCMethodDecl *MD = E->getDictWithObjectsMethod()) { - SymbolRoleSet Roles = (unsigned)SymbolRole::Call; - Roles |= (unsigned)SymbolRole::Implicit; - return IndexCtx.handleReference(MD, E->getLocStart(), - Parent, ParentDC, Roles, {}, E); + return passObjCLiteralMethodCall(MD, E); } return true; } bool VisitObjCArrayLiteral(ObjCArrayLiteral *E) { if (ObjCMethodDecl *MD = E->getArrayWithObjectsMethod()) { - SymbolRoleSet Roles = (unsigned)SymbolRole::Call; - Roles |= (unsigned)SymbolRole::Implicit; - return IndexCtx.handleReference(MD, E->getLocStart(), - Parent, ParentDC, Roles, {}, E); + return passObjCLiteralMethodCall(MD, E); } return true; } bool VisitCXXConstructExpr(CXXConstructExpr *E) { + SymbolRoleSet Roles{}; + SmallVector Relations; + addCallRole(Roles, Relations); return IndexCtx.handleReference(E->getConstructor(), E->getLocation(), - Parent, ParentDC, (unsigned)SymbolRole::Call, {}, E); + Parent, ParentDC, Roles, Relations, E); } bool TraverseCXXOperatorCallExpr(CXXOperatorCallExpr *E, -- cgit v1.2.3