From 6fc3433b155f127c43f089f22b44461f91cb444a Mon Sep 17 00:00:00 2001 From: Daniel Jasper Date: Tue, 30 Oct 2012 15:42:00 +0000 Subject: Implement descendant matchers for NestedNamespecifiers This implements has(), hasDescendant(), forEach() and forEachDescendant() for NestedNameSpecifier and NestedNameSpecifierLoc matchers. Review: http://llvm-reviews.chandlerc.com/D86 llvm-svn: 167017 --- clang/lib/ASTMatchers/ASTMatchFinder.cpp | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) (limited to 'clang/lib/ASTMatchers/ASTMatchFinder.cpp') diff --git a/clang/lib/ASTMatchers/ASTMatchFinder.cpp b/clang/lib/ASTMatchers/ASTMatchFinder.cpp index 38df2a199bd..b081f5426ea 100644 --- a/clang/lib/ASTMatchers/ASTMatchFinder.cpp +++ b/clang/lib/ASTMatchers/ASTMatchFinder.cpp @@ -147,6 +147,12 @@ public: traverse(*D); else if (const Stmt *S = DynNode.get()) traverse(*S); + else if (const NestedNameSpecifier *NNS = + DynNode.get()) + traverse(*NNS); + else if (const NestedNameSpecifierLoc *NNSLoc = + DynNode.get()) + traverse(*NNSLoc); else if (const QualType *Q = DynNode.get()) traverse(*Q); else if (const TypeLoc *T = DynNode.get()) @@ -197,6 +203,16 @@ public: // The TypeLoc is matched inside traverse. return traverse(TypeLocNode); } + bool TraverseNestedNameSpecifier(NestedNameSpecifier *NNS) { + ScopedIncrement ScopedDepth(&CurrentDepth); + return (NNS == NULL) || traverse(*NNS); + } + bool TraverseNestedNameSpecifierLoc(NestedNameSpecifierLoc NNS) { + ScopedIncrement ScopedDepth(&CurrentDepth); + if (!match(*NNS.getNestedNameSpecifier())) + return false; + return !NNS || traverse(NNS); + } bool shouldVisitTemplateInstantiations() const { return true; } bool shouldVisitImplicitCode() const { return true; } @@ -231,6 +247,13 @@ private: bool baseTraverse(TypeLoc TypeLocNode) { return VisitorBase::TraverseTypeLoc(TypeLocNode); } + bool baseTraverse(const NestedNameSpecifier &NNS) { + return VisitorBase::TraverseNestedNameSpecifier( + const_cast(&NNS)); + } + bool baseTraverse(NestedNameSpecifierLoc NNS) { + return VisitorBase::TraverseNestedNameSpecifierLoc(NNS); + } // Sets 'Matched' to true if 'Matcher' matches 'Node' and: // 0 < CurrentDepth <= MaxDepth. -- cgit v1.2.3