diff options
author | Ted Kremenek <kremenek@apple.com> | 2010-11-17 00:50:47 +0000 |
---|---|---|
committer | Ted Kremenek <kremenek@apple.com> | 2010-11-17 00:50:47 +0000 |
commit | 8eaa165c7e5bc6e88abca87d2272fbd769ac31c9 (patch) | |
tree | 0f296e5ad2d8f967e6e1e8aace1bc1c3b8a4012a | |
parent | e48db8dfae32c74b3b3bfa62104b335472b00552 (diff) | |
download | bcm5719-llvm-8eaa165c7e5bc6e88abca87d2272fbd769ac31c9.tar.gz bcm5719-llvm-8eaa165c7e5bc6e88abca87d2272fbd769ac31c9.zip |
CursorVisitor: refactor visitation of
explicit template args within data-recursion
algorithm.
llvm-svn: 119442
-rw-r--r-- | clang/tools/libclang/CIndex.cpp | 47 |
1 files changed, 26 insertions, 21 deletions
diff --git a/clang/tools/libclang/CIndex.cpp b/clang/tools/libclang/CIndex.cpp index 23d25976132..3b17414052f 100644 --- a/clang/tools/libclang/CIndex.cpp +++ b/clang/tools/libclang/CIndex.cpp @@ -136,7 +136,8 @@ class VisitorJob { public: enum Kind { DeclVisitKind, StmtVisitKind, MemberExprPartsKind, TypeLocVisitKind, OverloadExprPartsKind, - DeclRefExprPartsKind, LabelRefVisitKind }; + DeclRefExprPartsKind, LabelRefVisitKind, + ExplicitTemplateArgsVisitKind }; protected: void *dataA; void *dataB; @@ -1638,6 +1639,8 @@ DEF_JOB(StmtVisit, Stmt, StmtVisitKind) DEF_JOB(MemberExprParts, MemberExpr, MemberExprPartsKind) DEF_JOB(DeclRefExprParts, DeclRefExpr, DeclRefExprPartsKind) DEF_JOB(OverloadExprParts, OverloadExpr, OverloadExprPartsKind) +DEF_JOB(ExplicitTemplateArgsVisit, ExplicitTemplateArgumentList, + ExplicitTemplateArgsVisitKind) #undef DEF_JOB class DeclVisit : public VisitorJob { @@ -1651,7 +1654,6 @@ public: Decl *get() const { return static_cast<Decl*>(dataA); } bool isFirst() const { return dataB ? true : false; } }; - class TypeLocVisit : public VisitorJob { public: TypeLocVisit(TypeLoc tl, CXCursor parent) : @@ -1718,6 +1720,7 @@ public: void VisitVAArgExpr(VAArgExpr *E); private: + void AddExplicitTemplateArgs(const ExplicitTemplateArgumentList *A); void AddStmt(Stmt *S); void AddDecl(Decl *D, bool isFirst = true); void AddTypeLoc(TypeSourceInfo *TI); @@ -1733,6 +1736,12 @@ void EnqueueVisitor::AddDecl(Decl *D, bool isFirst) { if (D) WL.push_back(DeclVisit(D, Parent, isFirst)); } +void EnqueueVisitor:: + AddExplicitTemplateArgs(const ExplicitTemplateArgumentList *A) { + if (A) + WL.push_back(ExplicitTemplateArgsVisit( + const_cast<ExplicitTemplateArgumentList*>(A), Parent)); +} void EnqueueVisitor::AddTypeLoc(TypeSourceInfo *TI) { if (TI) WL.push_back(TypeLocVisit(TI->getTypeLoc(), Parent)); @@ -1800,6 +1809,9 @@ void EnqueueVisitor::VisitCXXUnresolvedConstructExpr(CXXUnresolvedConstructExpr AddTypeLoc(E->getTypeSourceInfo()); } void EnqueueVisitor::VisitDeclRefExpr(DeclRefExpr *DR) { + if (DR->hasExplicitTemplateArgs()) { + AddExplicitTemplateArgs(&DR->getExplicitTemplateArgs()); + } WL.push_back(DeclRefExprParts(DR, Parent)); } void EnqueueVisitor::VisitDeclStmt(DeclStmt *S) { @@ -1855,6 +1867,7 @@ void EnqueueVisitor::VisitObjCMessageExpr(ObjCMessageExpr *M) { AddTypeLoc(M->getClassReceiverTypeInfo()); } void EnqueueVisitor::VisitOverloadExpr(OverloadExpr *E) { + AddExplicitTemplateArgs(E->getOptionalExplicitTemplateArgs()); WL.push_back(OverloadExprParts(E, Parent)); } void EnqueueVisitor::VisitStmt(Stmt *S) { @@ -1919,6 +1932,17 @@ bool CursorVisitor::RunVisitorWorkList(VisitorWorkList &WL) { continue; } + case VisitorJob::ExplicitTemplateArgsVisitKind: { + const ExplicitTemplateArgumentList *ArgList = + cast<ExplicitTemplateArgsVisit>(&LI)->get(); + for (const TemplateArgumentLoc *Arg = ArgList->getTemplateArgs(), + *ArgEnd = Arg + ArgList->NumTemplateArgs; + Arg != ArgEnd; ++Arg) { + if (VisitTemplateArgumentLoc(*Arg)) + return true; + } + continue; + } case VisitorJob::TypeLocVisitKind: { // Perform default visitation for TypeLocs. if (Visit(cast<TypeLocVisit>(&LI)->get())) @@ -2005,15 +2029,6 @@ bool CursorVisitor::RunVisitorWorkList(VisitorWorkList &WL) { // Visit declaration name. if (VisitDeclarationNameInfo(DR->getNameInfo())) return true; - // Visit explicitly-specified template arguments. - if (DR->hasExplicitTemplateArgs()) { - ExplicitTemplateArgumentList &Args = DR->getExplicitTemplateArgs(); - for (TemplateArgumentLoc *Arg = Args.getTemplateArgs(), - *ArgEnd = Arg + Args.NumTemplateArgs; - Arg != ArgEnd; ++Arg) - if (VisitTemplateArgumentLoc(*Arg)) - return true; - } continue; } case VisitorJob::OverloadExprPartsKind: { @@ -2028,16 +2043,6 @@ bool CursorVisitor::RunVisitorWorkList(VisitorWorkList &WL) { // Visit the overloaded declaration reference. if (Visit(MakeCursorOverloadedDeclRef(O, TU))) return true; - // Visit the explicitly-specified template arguments. - if (const ExplicitTemplateArgumentList *ArgList - = O->getOptionalExplicitTemplateArgs()) { - for (const TemplateArgumentLoc *Arg = ArgList->getTemplateArgs(), - *ArgEnd = Arg + ArgList->NumTemplateArgs; - Arg != ArgEnd; ++Arg) { - if (VisitTemplateArgumentLoc(*Arg)) - return true; - } - } continue; } } |