From: Ted Kremenek Date: Sat, 13 Nov 2010 00:58:18 +0000 (+0000) Subject: CursorVisitor: Migrate DeclRefExpr over to data-recursion algorithm. X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=e4979ccb5960608edce73f3b274eb7c2de15dac5;p=clang CursorVisitor: Migrate DeclRefExpr over to data-recursion algorithm. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@118961 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/tools/libclang/CIndex.cpp b/tools/libclang/CIndex.cpp index 9e6a439fdb..b903832c37 100644 --- a/tools/libclang/CIndex.cpp +++ b/tools/libclang/CIndex.cpp @@ -127,7 +127,8 @@ namespace { class VisitorJob { public: enum Kind { DeclVisitKind, StmtVisitKind, MemberExprPartsKind, - TypeLocVisitKind, OverloadExprPartsKind }; + TypeLocVisitKind, OverloadExprPartsKind, + DeclRefExprPartsKind }; protected: void *dataA; void *dataB; @@ -311,7 +312,6 @@ public: bool VisitStmt(Stmt *S); // Expression visitors - bool VisitDeclRefExpr(DeclRefExpr *E); bool VisitBlockExpr(BlockExpr *B); bool VisitObjCEncodeExpr(ObjCEncodeExpr *E); bool VisitOffsetOfExpr(OffsetOfExpr *E); @@ -338,6 +338,7 @@ bool Visit##NAME(NAME *S) { return VisitDataRecursive(S); } DATA_RECURSIVE_VISIT(CompoundLiteralExpr) DATA_RECURSIVE_VISIT(CXXMemberCallExpr) DATA_RECURSIVE_VISIT(CXXOperatorCallExpr) + DATA_RECURSIVE_VISIT(DeclRefExpr) DATA_RECURSIVE_VISIT(DeclStmt) DATA_RECURSIVE_VISIT(ExplicitCastExpr) DATA_RECURSIVE_VISIT(DoStmt) @@ -1438,29 +1439,6 @@ bool CursorVisitor::VisitStmt(Stmt *S) { return false; } -bool CursorVisitor::VisitDeclRefExpr(DeclRefExpr *E) { - // Visit nested-name-specifier, if present. - if (NestedNameSpecifier *Qualifier = E->getQualifier()) - if (VisitNestedNameSpecifier(Qualifier, E->getQualifierRange())) - return true; - - // Visit declaration name. - if (VisitDeclarationNameInfo(E->getNameInfo())) - return true; - - // Visit explicitly-specified template arguments. - if (E->hasExplicitTemplateArgs()) { - ExplicitTemplateArgumentList &Args = E->getExplicitTemplateArgs(); - for (TemplateArgumentLoc *Arg = Args.getTemplateArgs(), - *ArgEnd = Arg + Args.NumTemplateArgs; - Arg != ArgEnd; ++Arg) - if (VisitTemplateArgumentLoc(*Arg)) - return true; - } - - return false; -} - bool CursorVisitor::VisitCXXRecordDecl(CXXRecordDecl *D) { if (D->isDefinition()) { for (CXXRecordDecl::base_class_iterator I = D->bases_begin(), @@ -1748,6 +1726,7 @@ public:\ DEF_JOB(StmtVisit, Stmt, StmtVisitKind) DEF_JOB(MemberExprParts, MemberExpr, MemberExprPartsKind) +DEF_JOB(DeclRefExprParts, DeclRefExpr, DeclRefExprPartsKind) DEF_JOB(OverloadExprParts, OverloadExpr, OverloadExprPartsKind) #undef DEF_JOB @@ -1788,6 +1767,7 @@ public: void VisitCompoundLiteralExpr(CompoundLiteralExpr *E); void VisitCXXOperatorCallExpr(CXXOperatorCallExpr *E); + void VisitDeclRefExpr(DeclRefExpr *D); void VisitDeclStmt(DeclStmt *S); void VisitExplicitCastExpr(ExplicitCastExpr *E); void VisitForStmt(ForStmt *FS); @@ -1846,6 +1826,9 @@ void EnqueueVisitor::VisitCXXOperatorCallExpr(CXXOperatorCallExpr *CE) { AddStmt(CE->getCallee()); AddStmt(CE->getArg(0)); } +void EnqueueVisitor::VisitDeclRefExpr(DeclRefExpr *DR) { + WL.push_back(DeclRefExprParts(DR, Parent)); +} void EnqueueVisitor::VisitDeclStmt(DeclStmt *S) { unsigned size = WL.size(); bool isFirst = true; @@ -2041,6 +2024,26 @@ bool CursorVisitor::RunVisitorWorkList(VisitorWorkList &WL) { } continue; } + case VisitorJob::DeclRefExprPartsKind: { + DeclRefExpr *DR = cast(LI).get(); + // Visit nested-name-specifier, if present. + if (NestedNameSpecifier *Qualifier = DR->getQualifier()) + if (VisitNestedNameSpecifier(Qualifier, DR->getQualifierRange())) + return true; + // 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: { OverloadExpr *O = cast(LI).get(); // Visit the nested-name-specifier.