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 | |
| 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')
| -rw-r--r-- | clang/tools/c-index-test/c-index-test.c | 11 | ||||
| -rw-r--r-- | clang/tools/libclang/CXCursor.cpp | 27 |
2 files changed, 33 insertions, 5 deletions
diff --git a/clang/tools/c-index-test/c-index-test.c b/clang/tools/c-index-test/c-index-test.c index e8763ffc00a..0978ccb28d7 100644 --- a/clang/tools/c-index-test/c-index-test.c +++ b/clang/tools/c-index-test/c-index-test.c @@ -2437,11 +2437,14 @@ static void inspect_print_cursor(CXCursor Cursor) { clang_Cursor_getObjCSelectorIndex(Cursor)); if (clang_Cursor_isDynamicCall(Cursor)) printf(" Dynamic-call"); - if (Cursor.kind == CXCursor_ObjCMessageExpr) { + if (Cursor.kind == CXCursor_ObjCMessageExpr || + Cursor.kind == CXCursor_MemberRefExpr) { CXType T = clang_Cursor_getReceiverType(Cursor); - CXString S = clang_getTypeKindSpelling(T.kind); - printf(" Receiver-type=%s", clang_getCString(S)); - clang_disposeString(S); + if (T.kind != CXType_Invalid) { + CXString S = clang_getTypeKindSpelling(T.kind); + printf(" Receiver-type=%s", clang_getCString(S)); + clang_disposeString(S); + } } { 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); } |

