Author: akirtzidis Date: Mon Oct 31 23:29:39 2016 New Revision: 285666 URL: http://llvm.org/viewvc/llvm-project?rev=285666&view=rev Log: [index] Avoid using a RecursiveASTVisitor for SyntacticFormIndexer and iterate the DesignatedInitExprs of the InitListExpr directly.
This is more efficient, as per feedback by Richard. Modified: cfe/trunk/lib/Index/IndexBody.cpp Modified: cfe/trunk/lib/Index/IndexBody.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Index/IndexBody.cpp?rev=285666&r1=285665&r2=285666&view=diff ============================================================================== --- cfe/trunk/lib/Index/IndexBody.cpp (original) +++ cfe/trunk/lib/Index/IndexBody.cpp Mon Oct 31 23:29:39 2016 @@ -294,48 +294,6 @@ public: // Also visit things that are in the syntactic form but not the semantic one, // for example the indices in DesignatedInitExprs. bool TraverseInitListExpr(InitListExpr *S, DataRecursionQueue *Q = nullptr) { - - class SyntacticFormIndexer : - public RecursiveASTVisitor<SyntacticFormIndexer> { - IndexingContext &IndexCtx; - const NamedDecl *Parent; - const DeclContext *ParentDC; - bool Visited = false; - - public: - SyntacticFormIndexer(IndexingContext &indexCtx, - const NamedDecl *Parent, const DeclContext *DC) - : IndexCtx(indexCtx), Parent(Parent), ParentDC(DC) { } - - bool shouldWalkTypesOfTypeLocs() const { return false; } - - bool TraverseInitListExpr(InitListExpr *S, DataRecursionQueue *Q = nullptr) { - // Don't visit nested InitListExprs, this visitor will be called again - // later on for the nested ones. - if (Visited) - return true; - Visited = true; - InitListExpr *SyntaxForm = S->isSemanticForm() ? S->getSyntacticForm() : S; - if (SyntaxForm) { - for (Stmt *SubStmt : SyntaxForm->children()) { - if (!TraverseStmt(SubStmt, Q)) - return false; - } - } - return true; - } - - bool VisitDesignatedInitExpr(DesignatedInitExpr *E) { - for (DesignatedInitExpr::Designator &D : llvm::reverse(E->designators())) { - if (D.isFieldDesignator()) - return IndexCtx.handleReference(D.getField(), D.getFieldLoc(), - Parent, ParentDC, SymbolRoleSet(), - {}, E); - } - return true; - } - }; - auto visitForm = [&](InitListExpr *Form) { for (Stmt *SubStmt : Form->children()) { if (!TraverseStmt(SubStmt, Q)) @@ -344,13 +302,26 @@ public: return true; }; + auto visitSyntacticDesignatedInitExpr = [&](DesignatedInitExpr *E) -> bool { + for (DesignatedInitExpr::Designator &D : llvm::reverse(E->designators())) { + if (D.isFieldDesignator()) + return IndexCtx.handleReference(D.getField(), D.getFieldLoc(), + Parent, ParentDC, SymbolRoleSet(), + {}, E); + } + return true; + }; + InitListExpr *SemaForm = S->isSemanticForm() ? S : S->getSemanticForm(); InitListExpr *SyntaxForm = S->isSemanticForm() ? S->getSyntacticForm() : S; if (SemaForm) { // Visit things present in syntactic form but not the semantic form. if (SyntaxForm) { - SyntacticFormIndexer(IndexCtx, Parent, ParentDC).TraverseStmt(SyntaxForm); + for (Expr *init : SyntaxForm->inits()) { + if (auto *DIE = dyn_cast<DesignatedInitExpr>(init)) + visitSyntacticDesignatedInitExpr(DIE); + } } return visitForm(SemaForm); } _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits