diff options
author | Argyrios Kyrtzidis <akyrtzi@gmail.com> | 2017-04-27 17:23:04 +0000 |
---|---|---|
committer | Argyrios Kyrtzidis <akyrtzi@gmail.com> | 2017-04-27 17:23:04 +0000 |
commit | 2a68486c8f1133087a69da103baebf324917033d (patch) | |
tree | d49fa8d775678789db5d51f6076564351c925757 /clang/tools/libclang/CXCursor.cpp | |
parent | 883522b1fac4a893265cd594b438dc5497901a0f (diff) | |
download | bcm5719-llvm-2a68486c8f1133087a69da103baebf324917033d.tar.gz bcm5719-llvm-2a68486c8f1133087a69da103baebf324917033d.zip |
[libclang] Enhance clang_Cursor_isDynamicCall and clang_Cursor_getReceiverType to handle ObjC property references
Also enhance clang_Cursor_getReceiverType to handle C++ method calls.
llvm-svn: 301568
Diffstat (limited to 'clang/tools/libclang/CXCursor.cpp')
-rw-r--r-- | clang/tools/libclang/CXCursor.cpp | 27 |
1 files changed, 26 insertions, 1 deletions
diff --git a/clang/tools/libclang/CXCursor.cpp b/clang/tools/libclang/CXCursor.cpp index c19aa65ac62..6a2dbfdeda3 100644 --- a/clang/tools/libclang/CXCursor.cpp +++ b/clang/tools/libclang/CXCursor.cpp @@ -1523,6 +1523,10 @@ int clang_Cursor_isDynamicCall(CXCursor C) { return true; } + if (auto *PropRefE = dyn_cast<ObjCPropertyRefExpr>(E)) { + return !PropRefE->isSuperReceiver(); + } + const MemberExpr *ME = nullptr; if (isa<MemberExpr>(E)) ME = cast<MemberExpr>(E); @@ -1532,7 +1536,9 @@ int clang_Cursor_isDynamicCall(CXCursor C) { if (ME) { if (const CXXMethodDecl * MD = dyn_cast_or_null<CXXMethodDecl>(ME->getMemberDecl())) - return MD->isVirtual() && !ME->hasQualifier(); + return MD->isVirtual() && + ME->performsVirtualDispatch( + cxcursor::getCursorContext(C).getLangOpts()); } return 0; @@ -1547,5 +1553,24 @@ CXType clang_Cursor_getReceiverType(CXCursor C) { if (const ObjCMessageExpr *MsgE = dyn_cast_or_null<ObjCMessageExpr>(E)) return cxtype::MakeCXType(MsgE->getReceiverType(), TU); + if (auto *PropRefE = dyn_cast<ObjCPropertyRefExpr>(E)) { + return cxtype::MakeCXType( + PropRefE->getReceiverType(cxcursor::getCursorContext(C)), TU); + } + + const MemberExpr *ME = nullptr; + if (isa<MemberExpr>(E)) + ME = cast<MemberExpr>(E); + else if (const CallExpr *CE = dyn_cast<CallExpr>(E)) + ME = dyn_cast_or_null<MemberExpr>(CE->getCallee()); + + if (ME) { + if (const CXXMethodDecl * + MD = dyn_cast_or_null<CXXMethodDecl>(ME->getMemberDecl())) { + auto receiverTy = ME->getBase()->IgnoreImpCasts()->getType(); + return cxtype::MakeCXType(receiverTy, TU); + } + } + return cxtype::MakeCXType(QualType(), TU); } |