diff options
Diffstat (limited to 'clang/tools/libclang/CIndex.cpp')
-rw-r--r-- | clang/tools/libclang/CIndex.cpp | 57 |
1 files changed, 43 insertions, 14 deletions
diff --git a/clang/tools/libclang/CIndex.cpp b/clang/tools/libclang/CIndex.cpp index bbceea945fb..3c585ed2b02 100644 --- a/clang/tools/libclang/CIndex.cpp +++ b/clang/tools/libclang/CIndex.cpp @@ -126,12 +126,15 @@ namespace { class VisitorJob { public: - enum Kind { DeclVisitKind, StmtVisitKind, MemberExprPartsKind }; + enum Kind { DeclVisitKind, StmtVisitKind, MemberExprPartsKind, + TypeLocVisitKind }; protected: - void *data; + void *dataA; + void *dataB; CXCursor parent; Kind K; - VisitorJob(void *d, CXCursor C, Kind k) : data(d), parent(C), K(k) {} + VisitorJob(CXCursor C, Kind k, void *d1, void *d2 = 0) + : dataA(d1), dataB(d2), parent(C), K(k) {} public: Kind getKind() const { return K; } const CXCursor &getParent() const { return parent; } @@ -143,9 +146,9 @@ typedef llvm::SmallVector<VisitorJob, 10> VisitorWorkList; #define DEF_JOB(NAME, DATA, KIND)\ class NAME : public VisitorJob {\ public:\ - NAME(DATA *d, CXCursor parent) : VisitorJob(d, parent, VisitorJob::KIND) {}\ + NAME(DATA *d, CXCursor parent) : VisitorJob(parent, VisitorJob::KIND, d) {} \ static bool classof(const VisitorJob *VJ) { return VJ->getKind() == KIND; }\ - DATA *get() const { return static_cast<DATA*>(data); }\ + DATA *get() const { return static_cast<DATA*>(dataA); }\ }; DEF_JOB(DeclVisit, Decl, DeclVisitKind) @@ -153,6 +156,22 @@ DEF_JOB(StmtVisit, Stmt, StmtVisitKind) DEF_JOB(MemberExprParts, MemberExpr, MemberExprPartsKind) #undef DEF_JOB +class TypeLocVisit : public VisitorJob { +public: + TypeLocVisit(TypeLoc tl, CXCursor parent) : + VisitorJob(parent, VisitorJob::TypeLocVisitKind, + tl.getType().getAsOpaquePtr(), tl.getOpaqueData()) {} + + static bool classof(const VisitorJob *VJ) { + return VJ->getKind() == TypeLocVisitKind; + } + + TypeLoc get() { + QualType T = QualType::getFromOpaquePtr(dataA); + return TypeLoc(T, dataB); + } +}; + static inline void WLAddStmt(VisitorWorkList &WL, CXCursor Parent, Stmt *S) { if (S) WL.push_back(StmtVisit(S, Parent)); @@ -161,6 +180,11 @@ static inline void WLAddDecl(VisitorWorkList &WL, CXCursor Parent, Decl *D) { if (D) WL.push_back(DeclVisit(D, Parent)); } +static inline void WLAddTypeLoc(VisitorWorkList &WL, CXCursor Parent, + TypeSourceInfo *TI) { + if (TI) + WL.push_back(TypeLocVisit(TI->getTypeLoc(), Parent)); +} // Cursor visitor. class CursorVisitor : public DeclVisitor<CursorVisitor, bool>, @@ -334,7 +358,6 @@ public: // Expression visitors bool VisitDeclRefExpr(DeclRefExpr *E); bool VisitBlockExpr(BlockExpr *B); - bool VisitCompoundLiteralExpr(CompoundLiteralExpr *E); bool VisitExplicitCastExpr(ExplicitCastExpr *E); bool VisitObjCMessageExpr(ObjCMessageExpr *E); bool VisitObjCEncodeExpr(ObjCEncodeExpr *E); @@ -361,6 +384,7 @@ public: #define DATA_RECURSIVE_VISIT(NAME)\ bool Visit##NAME(NAME *S) { return VisitDataRecursive(S); } DATA_RECURSIVE_VISIT(BinaryOperator) + DATA_RECURSIVE_VISIT(CompoundLiteralExpr) DATA_RECURSIVE_VISIT(CXXMemberCallExpr) DATA_RECURSIVE_VISIT(CXXOperatorCallExpr) DATA_RECURSIVE_VISIT(DoStmt) @@ -1563,14 +1587,6 @@ bool CursorVisitor::VisitExplicitCastExpr(ExplicitCastExpr *E) { return VisitCastExpr(E); } -bool CursorVisitor::VisitCompoundLiteralExpr(CompoundLiteralExpr *E) { - if (TypeSourceInfo *TSInfo = E->getTypeSourceInfo()) - if (Visit(TSInfo->getTypeLoc())) - return true; - - return VisitExpr(E); -} - bool CursorVisitor::VisitAddrLabelExpr(AddrLabelExpr *E) { return Visit(MakeCursorLabelRef(E->getLabel(), E->getLabelLoc(), TU)); } @@ -1853,6 +1869,12 @@ void CursorVisitor::EnqueueWorkList(VisitorWorkList &WL, Stmt *S) { default: EnqueueChildren(WL, C, S); break; + case Stmt::CompoundLiteralExprClass: { + CompoundLiteralExpr *CL = cast<CompoundLiteralExpr>(S); + EnqueueChildren(WL, C, CL); + WLAddTypeLoc(WL, C, CL->getTypeSourceInfo()); + break; + } case Stmt::CXXOperatorCallExprClass: { CXXOperatorCallExpr *CE = cast<CXXOperatorCallExpr>(S); // Note that we enqueue things in reverse order so that @@ -1951,6 +1973,12 @@ bool CursorVisitor::RunVisitorWorkList(VisitorWorkList &WL) { continue; } + case VisitorJob::TypeLocVisitKind: { + // Perform default visitation for TypeLocs. + if (Visit(cast<TypeLocVisit>(LI).get())) + return true; + continue; + } case VisitorJob::StmtVisitKind: { Stmt *S = cast<StmtVisit>(LI).get(); if (!S) @@ -1969,6 +1997,7 @@ bool CursorVisitor::RunVisitorWorkList(VisitorWorkList &WL) { case Stmt::BinaryOperatorClass: case Stmt::CallExprClass: case Stmt::CaseStmtClass: + case Stmt::CompoundLiteralExprClass: case Stmt::CompoundStmtClass: case Stmt::CXXMemberCallExprClass: case Stmt::CXXOperatorCallExprClass: |