From: Ted Kremenek Date: Wed, 17 Nov 2010 00:50:47 +0000 (+0000) Subject: CursorVisitor: refactor visitation of X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=60608ec12d17168a3d1f415409a6a6eaf6d94508;p=clang CursorVisitor: refactor visitation of explicit template args within data-recursion algorithm. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@119442 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/tools/libclang/CIndex.cpp b/tools/libclang/CIndex.cpp index 23d2597613..3b17414052 100644 --- a/tools/libclang/CIndex.cpp +++ b/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(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(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(&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(&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; } }