diff options
Diffstat (limited to 'clang/lib/ASTMatchers/ASTMatchersInternal.cpp')
-rw-r--r-- | clang/lib/ASTMatchers/ASTMatchersInternal.cpp | 25 |
1 files changed, 25 insertions, 0 deletions
diff --git a/clang/lib/ASTMatchers/ASTMatchersInternal.cpp b/clang/lib/ASTMatchers/ASTMatchersInternal.cpp index ec60f0d9498..f6fd5ba2a3f 100644 --- a/clang/lib/ASTMatchers/ASTMatchersInternal.cpp +++ b/clang/lib/ASTMatchers/ASTMatchersInternal.cpp @@ -13,6 +13,7 @@ #include "clang/ASTMatchers/ASTMatchers.h" #include "clang/ASTMatchers/ASTMatchersInternal.h" +#include "llvm/Support/ManagedStatic.h" namespace clang { namespace ast_matchers { @@ -64,6 +65,25 @@ class IdDynMatcher : public DynMatcherInterface { const IntrusiveRefCntPtr<DynMatcherInterface> InnerMatcher; }; +/// \brief A matcher that always returns true. +/// +/// We only ever need one instance of this matcher, so we create a global one +/// and reuse it to reduce the overhead of the matcher and increase the chance +/// of cache hits. +struct TrueMatcherImpl { + TrueMatcherImpl() : Instance(new Impl) {} + const IntrusiveRefCntPtr<DynMatcherInterface> Instance; + + class Impl : public DynMatcherInterface { + public: + bool dynMatches(const ast_type_traits::DynTypedNode &, ASTMatchFinder *, + BoundNodesTreeBuilder *) const override { + return true; + } + }; +}; +static llvm::ManagedStatic<TrueMatcherImpl> TrueMatcherInstance; + } // namespace DynTypedMatcher DynTypedMatcher::constructVariadic( @@ -83,6 +103,11 @@ DynTypedMatcher DynTypedMatcher::constructVariadic( return Result; } +DynTypedMatcher DynTypedMatcher::trueMatcher( + ast_type_traits::ASTNodeKind NodeKind) { + return DynTypedMatcher(NodeKind, NodeKind, TrueMatcherInstance->Instance); +} + DynTypedMatcher DynTypedMatcher::dynCastTo( const ast_type_traits::ASTNodeKind Kind) const { auto Copy = *this; |