diff options
author | Douglas Gregor <dgregor@apple.com> | 2010-10-01 21:11:22 +0000 |
---|---|---|
committer | Douglas Gregor <dgregor@apple.com> | 2010-10-01 21:11:22 +0000 |
commit | e6712983d24fe1e87d297450a57fd012c971f65f (patch) | |
tree | d754f873e6b30c4af808957dc64d2a3c6f9e48bc /clang/tools/libclang/CIndex.cpp | |
parent | 73594596368a7591efa81f8e5eeff1fff431ed7c (diff) | |
download | bcm5719-llvm-e6712983d24fe1e87d297450a57fd012c971f65f.tar.gz bcm5719-llvm-e6712983d24fe1e87d297450a57fd012c971f65f.zip |
Teach clang_getCursorReferenced() about Objective-C property reference
and protocol expressions. Fixes <rdar://problem/7833565>.
llvm-svn: 115346
Diffstat (limited to 'clang/tools/libclang/CIndex.cpp')
-rw-r--r-- | clang/tools/libclang/CIndex.cpp | 12 |
1 files changed, 9 insertions, 3 deletions
diff --git a/clang/tools/libclang/CIndex.cpp b/clang/tools/libclang/CIndex.cpp index a291f47c019..908b99d4e12 100644 --- a/clang/tools/libclang/CIndex.cpp +++ b/clang/tools/libclang/CIndex.cpp @@ -2518,20 +2518,26 @@ CXFile clang_getFile(CXTranslationUnit tu, const char *file_name) { //===----------------------------------------------------------------------===// static Decl *getDeclFromExpr(Stmt *E) { + if (CastExpr *CE = dyn_cast<CastExpr>(E)) + return getDeclFromExpr(CE->getSubExpr()); + if (DeclRefExpr *RefExpr = dyn_cast<DeclRefExpr>(E)) return RefExpr->getDecl(); if (MemberExpr *ME = dyn_cast<MemberExpr>(E)) return ME->getMemberDecl(); if (ObjCIvarRefExpr *RE = dyn_cast<ObjCIvarRefExpr>(E)) return RE->getDecl(); - + if (ObjCPropertyRefExpr *PRE = dyn_cast<ObjCPropertyRefExpr>(E)) + return PRE->getProperty(); + if (CallExpr *CE = dyn_cast<CallExpr>(E)) return getDeclFromExpr(CE->getCallee()); - if (CastExpr *CE = dyn_cast<CastExpr>(E)) - return getDeclFromExpr(CE->getSubExpr()); if (ObjCMessageExpr *OME = dyn_cast<ObjCMessageExpr>(E)) return OME->getMethodDecl(); + if (ObjCProtocolExpr *PE = dyn_cast<ObjCProtocolExpr>(E)) + return PE->getProtocol(); + return 0; } |