diff options
| author | Douglas Gregor <dgregor@apple.com> | 2010-11-05 21:11:19 +0000 |
|---|---|---|
| committer | Douglas Gregor <dgregor@apple.com> | 2010-11-05 21:11:19 +0000 |
| commit | 16443fdd31f47577aa53b4997222413112088bc7 (patch) | |
| tree | 31d7df7a7ae6996a2c1c2caa8d948db26ccf7c3c /clang/tools | |
| parent | 45846666f1df3ea66447b13ada0d9414a18237a5 (diff) | |
| download | bcm5719-llvm-16443fdd31f47577aa53b4997222413112088bc7.tar.gz bcm5719-llvm-16443fdd31f47577aa53b4997222413112088bc7.zip | |
Teach clang_getCursorReferenced() that a
CXXConstructorExpr/CXXTemporaryObjectExpr references the constructor
it calls. Then, tweak clang_getCursor() to prefer such a call over a
type reference to the type being called.
llvm-svn: 118297
Diffstat (limited to 'clang/tools')
| -rw-r--r-- | clang/tools/libclang/CIndex.cpp | 12 |
1 files changed, 12 insertions, 0 deletions
diff --git a/clang/tools/libclang/CIndex.cpp b/clang/tools/libclang/CIndex.cpp index 30d1c28758f..9ecaa1f7bef 100644 --- a/clang/tools/libclang/CIndex.cpp +++ b/clang/tools/libclang/CIndex.cpp @@ -2435,6 +2435,9 @@ static Decl *getDeclFromExpr(Stmt *E) { if (CallExpr *CE = dyn_cast<CallExpr>(E)) return getDeclFromExpr(CE->getCallee()); + if (CXXConstructExpr *CE = llvm::dyn_cast<CXXConstructExpr>(E)) + if (!CE->isElidable()) + return CE->getConstructor(); if (ObjCMessageExpr *OME = dyn_cast<ObjCMessageExpr>(E)) return OME->getMethodDecl(); @@ -2870,6 +2873,15 @@ enum CXChildVisitResult GetCursorVisitor(CXCursor cursor, CXCursor parent, CXClientData client_data) { CXCursor *BestCursor = static_cast<CXCursor *>(client_data); + + // If our current best cursor is the construction of a temporary object, + // don't replace that cursor with a type reference, because we want + // clang_getCursor() to point at the constructor. + if (clang_isExpression(BestCursor->kind) && + isa<CXXTemporaryObjectExpr>(getCursorExpr(*BestCursor)) && + cursor.kind == CXCursor_TypeRef) + return CXChildVisit_Recurse; + *BestCursor = cursor; return CXChildVisit_Recurse; } |

