summaryrefslogtreecommitdiffstats
path: root/include/clang/ASTMatchers/ASTMatchersMacros.h
diff options
context:
space:
mode:
Diffstat (limited to 'include/clang/ASTMatchers/ASTMatchersMacros.h')
-rw-r--r--include/clang/ASTMatchers/ASTMatchersMacros.h404
1 files changed, 0 insertions, 404 deletions
diff --git a/include/clang/ASTMatchers/ASTMatchersMacros.h b/include/clang/ASTMatchers/ASTMatchersMacros.h
deleted file mode 100644
index 8ad0c16..0000000
--- a/include/clang/ASTMatchers/ASTMatchersMacros.h
+++ /dev/null
@@ -1,404 +0,0 @@
-//===--- ASTMatchersMacros.h - Structural query framework -------*- C++ -*-===//
-//
-// The LLVM Compiler Infrastructure
-//
-// This file is distributed under the University of Illinois Open Source
-// License. See LICENSE.TXT for details.
-//
-//===----------------------------------------------------------------------===//
-//
-// Defines macros that enable us to define new matchers in a single place.
-// Since a matcher is a function which returns a Matcher<T> object, where
-// T is the type of the actual implementation of the matcher, the macros allow
-// us to write matchers like functions and take care of the definition of the
-// class boilerplate.
-//
-// Note that when you define a matcher with an AST_MATCHER* macro, only the
-// function which creates the matcher goes into the current namespace - the
-// class that implements the actual matcher, which gets returned by the
-// generator function, is put into the 'internal' namespace. This allows us
-// to only have the functions (which is all the user cares about) in the
-// 'ast_matchers' namespace and hide the boilerplate.
-//
-// To define a matcher in user code, put it into your own namespace. This would
-// help to prevent ODR violations in case a matcher with the same name is
-// defined in multiple translation units:
-//
-// namespace my_matchers {
-// AST_MATCHER_P(clang::MemberExpr, Member,
-// clang::ast_matchers::internal::Matcher<clang::ValueDecl>,
-// InnerMatcher) {
-// return InnerMatcher.matches(*Node.getMemberDecl(), Finder, Builder);
-// }
-// } // namespace my_matchers
-//
-// Alternatively, an unnamed namespace may be used:
-//
-// namespace clang {
-// namespace ast_matchers {
-// namespace {
-// AST_MATCHER_P(MemberExpr, Member,
-// internal::Matcher<ValueDecl>, InnerMatcher) {
-// return InnerMatcher.matches(*Node.getMemberDecl(), Finder, Builder);
-// }
-// } // namespace
-// } // namespace ast_matchers
-// } // namespace clang
-//
-//===----------------------------------------------------------------------===//
-
-#ifndef LLVM_CLANG_ASTMATCHERS_ASTMATCHERSMACROS_H
-#define LLVM_CLANG_ASTMATCHERS_ASTMATCHERSMACROS_H
-
-/// \brief AST_MATCHER_FUNCTION(ReturnType, DefineMatcher) { ... }
-/// defines a zero parameter function named DefineMatcher() that returns a
-/// ReturnType object.
-#define AST_MATCHER_FUNCTION(ReturnType, DefineMatcher) \
- inline ReturnType DefineMatcher##_getInstance(); \
- inline ReturnType DefineMatcher() { \
- return ::clang::ast_matchers::internal::MemoizedMatcher< \
- ReturnType, DefineMatcher##_getInstance>::getInstance(); \
- } \
- inline ReturnType DefineMatcher##_getInstance()
-
-/// \brief AST_MATCHER_FUNCTION_P(ReturnType, DefineMatcher, ParamType, Param) {
-/// ... }
-/// defines a single-parameter function named DefineMatcher() that returns a
-/// ReturnType object.
-///
-/// The code between the curly braces has access to the following variables:
-///
-/// Param: the parameter passed to the function; its type
-/// is ParamType.
-///
-/// The code should return an instance of ReturnType.
-#define AST_MATCHER_FUNCTION_P(ReturnType, DefineMatcher, ParamType, Param) \
- AST_MATCHER_FUNCTION_P_OVERLOAD(ReturnType, DefineMatcher, ParamType, Param, \
- 0)
-#define AST_MATCHER_FUNCTION_P_OVERLOAD(ReturnType, DefineMatcher, ParamType, \
- Param, OverloadId) \
- inline ReturnType DefineMatcher(ParamType const &Param); \
- typedef ReturnType (&DefineMatcher##_Type##OverloadId)(ParamType const &); \
- inline ReturnType DefineMatcher(ParamType const &Param)
-
-/// \brief AST_MATCHER(Type, DefineMatcher) { ... }
-/// defines a zero parameter function named DefineMatcher() that returns a
-/// Matcher<Type> object.
-///
-/// The code between the curly braces has access to the following variables:
-///
-/// Node: the AST node being matched; its type is Type.
-/// Finder: an ASTMatchFinder*.
-/// Builder: a BoundNodesTreeBuilder*.
-///
-/// The code should return true if 'Node' matches.
-#define AST_MATCHER(Type, DefineMatcher) \
- namespace internal { \
- class matcher_##DefineMatcher##Matcher \
- : public ::clang::ast_matchers::internal::MatcherInterface<Type> { \
- public: \
- explicit matcher_##DefineMatcher##Matcher() {} \
- bool matches(const Type &Node, \
- ::clang::ast_matchers::internal::ASTMatchFinder *Finder, \
- ::clang::ast_matchers::internal::BoundNodesTreeBuilder \
- *Builder) const override; \
- }; \
- } \
- inline ::clang::ast_matchers::internal::Matcher<Type> DefineMatcher() { \
- return ::clang::ast_matchers::internal::makeMatcher( \
- new internal::matcher_##DefineMatcher##Matcher()); \
- } \
- inline bool internal::matcher_##DefineMatcher##Matcher::matches( \
- const Type &Node, \
- ::clang::ast_matchers::internal::ASTMatchFinder *Finder, \
- ::clang::ast_matchers::internal::BoundNodesTreeBuilder *Builder) const
-
-/// \brief AST_MATCHER_P(Type, DefineMatcher, ParamType, Param) { ... }
-/// defines a single-parameter function named DefineMatcher() that returns a
-/// Matcher<Type> object.
-///
-/// The code between the curly braces has access to the following variables:
-///
-/// Node: the AST node being matched; its type is Type.
-/// Param: the parameter passed to the function; its type
-/// is ParamType.
-/// Finder: an ASTMatchFinder*.
-/// Builder: a BoundNodesTreeBuilder*.
-///
-/// The code should return true if 'Node' matches.
-#define AST_MATCHER_P(Type, DefineMatcher, ParamType, Param) \
- AST_MATCHER_P_OVERLOAD(Type, DefineMatcher, ParamType, Param, 0)
-
-#define AST_MATCHER_P_OVERLOAD(Type, DefineMatcher, ParamType, Param, \
- OverloadId) \
- namespace internal { \
- class matcher_##DefineMatcher##OverloadId##Matcher \
- : public ::clang::ast_matchers::internal::MatcherInterface<Type> { \
- public: \
- explicit matcher_##DefineMatcher##OverloadId##Matcher( \
- ParamType const &A##Param) \
- : Param(A##Param) {} \
- bool matches(const Type &Node, \
- ::clang::ast_matchers::internal::ASTMatchFinder *Finder, \
- ::clang::ast_matchers::internal::BoundNodesTreeBuilder \
- *Builder) const override; \
- \
- private: \
- ParamType const Param; \
- }; \
- } \
- inline ::clang::ast_matchers::internal::Matcher<Type> DefineMatcher( \
- ParamType const &Param) { \
- return ::clang::ast_matchers::internal::makeMatcher( \
- new internal::matcher_##DefineMatcher##OverloadId##Matcher(Param)); \
- } \
- typedef ::clang::ast_matchers::internal::Matcher<Type>( \
- &DefineMatcher##_Type##OverloadId)(ParamType const &Param); \
- inline bool internal::matcher_##DefineMatcher##OverloadId##Matcher::matches( \
- const Type &Node, \
- ::clang::ast_matchers::internal::ASTMatchFinder *Finder, \
- ::clang::ast_matchers::internal::BoundNodesTreeBuilder *Builder) const
-
-/// \brief AST_MATCHER_P2(
-/// Type, DefineMatcher, ParamType1, Param1, ParamType2, Param2) { ... }
-/// defines a two-parameter function named DefineMatcher() that returns a
-/// Matcher<Type> object.
-///
-/// The code between the curly braces has access to the following variables:
-///
-/// Node: the AST node being matched; its type is Type.
-/// Param1, Param2: the parameters passed to the function; their types
-/// are ParamType1 and ParamType2.
-/// Finder: an ASTMatchFinder*.
-/// Builder: a BoundNodesTreeBuilder*.
-///
-/// The code should return true if 'Node' matches.
-#define AST_MATCHER_P2(Type, DefineMatcher, ParamType1, Param1, ParamType2, \
- Param2) \
- AST_MATCHER_P2_OVERLOAD(Type, DefineMatcher, ParamType1, Param1, ParamType2, \
- Param2, 0)
-
-#define AST_MATCHER_P2_OVERLOAD(Type, DefineMatcher, ParamType1, Param1, \
- ParamType2, Param2, OverloadId) \
- namespace internal { \
- class matcher_##DefineMatcher##OverloadId##Matcher \
- : public ::clang::ast_matchers::internal::MatcherInterface<Type> { \
- public: \
- matcher_##DefineMatcher##OverloadId##Matcher(ParamType1 const &A##Param1, \
- ParamType2 const &A##Param2) \
- : Param1(A##Param1), Param2(A##Param2) {} \
- bool matches(const Type &Node, \
- ::clang::ast_matchers::internal::ASTMatchFinder *Finder, \
- ::clang::ast_matchers::internal::BoundNodesTreeBuilder \
- *Builder) const override; \
- \
- private: \
- ParamType1 const Param1; \
- ParamType2 const Param2; \
- }; \
- } \
- inline ::clang::ast_matchers::internal::Matcher<Type> DefineMatcher( \
- ParamType1 const &Param1, ParamType2 const &Param2) { \
- return ::clang::ast_matchers::internal::makeMatcher( \
- new internal::matcher_##DefineMatcher##OverloadId##Matcher(Param1, \
- Param2)); \
- } \
- typedef ::clang::ast_matchers::internal::Matcher<Type>( \
- &DefineMatcher##_Type##OverloadId)(ParamType1 const &Param1, \
- ParamType2 const &Param2); \
- inline bool internal::matcher_##DefineMatcher##OverloadId##Matcher::matches( \
- const Type &Node, \
- ::clang::ast_matchers::internal::ASTMatchFinder *Finder, \
- ::clang::ast_matchers::internal::BoundNodesTreeBuilder *Builder) const
-
-/// \brief Construct a type-list to be passed to the AST_POLYMORPHIC_MATCHER*
-/// macros.
-///
-/// You can't pass something like \c TypeList<Foo, Bar> to a macro, because it
-/// will look at that as two arguments. However, you can pass
-/// \c void(TypeList<Foo, Bar>), which works thanks to the parenthesis.
-/// The \c PolymorphicMatcherWithParam* classes will unpack the function type to
-/// extract the TypeList object.
-#define AST_POLYMORPHIC_SUPPORTED_TYPES(...) \
- void(::clang::ast_matchers::internal::TypeList<__VA_ARGS__>)
-
-/// \brief AST_POLYMORPHIC_MATCHER(DefineMatcher) { ... }
-/// defines a single-parameter function named DefineMatcher() that is
-/// polymorphic in the return type.
-///
-/// The variables are the same as for AST_MATCHER, but NodeType will be deduced
-/// from the calling context.
-#define AST_POLYMORPHIC_MATCHER(DefineMatcher, ReturnTypesF) \
- namespace internal { \
- template <typename NodeType> \
- class matcher_##DefineMatcher##Matcher \
- : public ::clang::ast_matchers::internal::MatcherInterface<NodeType> { \
- public: \
- bool matches(const NodeType &Node, \
- ::clang::ast_matchers::internal::ASTMatchFinder *Finder, \
- ::clang::ast_matchers::internal::BoundNodesTreeBuilder \
- *Builder) const override; \
- }; \
- } \
- inline ::clang::ast_matchers::internal::PolymorphicMatcherWithParam0< \
- internal::matcher_##DefineMatcher##Matcher, ReturnTypesF> \
- DefineMatcher() { \
- return ::clang::ast_matchers::internal::PolymorphicMatcherWithParam0< \
- internal::matcher_##DefineMatcher##Matcher, ReturnTypesF>(); \
- } \
- template <typename NodeType> \
- bool internal::matcher_##DefineMatcher##Matcher<NodeType>::matches( \
- const NodeType &Node, \
- ::clang::ast_matchers::internal::ASTMatchFinder *Finder, \
- ::clang::ast_matchers::internal::BoundNodesTreeBuilder *Builder) const
-
-/// \brief AST_POLYMORPHIC_MATCHER_P(DefineMatcher, ParamType, Param) { ... }
-/// defines a single-parameter function named DefineMatcher() that is
-/// polymorphic in the return type.
-///
-/// The variables are the same as for
-/// AST_MATCHER_P, with the addition of NodeType, which specifies the node type
-/// of the matcher Matcher<NodeType> returned by the function matcher().
-///
-/// FIXME: Pull out common code with above macro?
-#define AST_POLYMORPHIC_MATCHER_P(DefineMatcher, ReturnTypesF, ParamType, \
- Param) \
- AST_POLYMORPHIC_MATCHER_P_OVERLOAD(DefineMatcher, ReturnTypesF, ParamType, \
- Param, 0)
-
-#define AST_POLYMORPHIC_MATCHER_P_OVERLOAD(DefineMatcher, ReturnTypesF, \
- ParamType, Param, OverloadId) \
- namespace internal { \
- template <typename NodeType, typename ParamT> \
- class matcher_##DefineMatcher##OverloadId##Matcher \
- : public ::clang::ast_matchers::internal::MatcherInterface<NodeType> { \
- public: \
- explicit matcher_##DefineMatcher##OverloadId##Matcher( \
- ParamType const &A##Param) \
- : Param(A##Param) {} \
- bool matches(const NodeType &Node, \
- ::clang::ast_matchers::internal::ASTMatchFinder *Finder, \
- ::clang::ast_matchers::internal::BoundNodesTreeBuilder \
- *Builder) const override; \
- \
- private: \
- ParamType const Param; \
- }; \
- } \
- inline ::clang::ast_matchers::internal::PolymorphicMatcherWithParam1< \
- internal::matcher_##DefineMatcher##OverloadId##Matcher, ParamType, \
- ReturnTypesF> \
- DefineMatcher(ParamType const &Param) { \
- return ::clang::ast_matchers::internal::PolymorphicMatcherWithParam1< \
- internal::matcher_##DefineMatcher##OverloadId##Matcher, ParamType, \
- ReturnTypesF>(Param); \
- } \
- typedef ::clang::ast_matchers::internal::PolymorphicMatcherWithParam1< \
- internal::matcher_##DefineMatcher##OverloadId##Matcher, ParamType, \
- ReturnTypesF>(&DefineMatcher##_Type##OverloadId)( \
- ParamType const &Param); \
- template <typename NodeType, typename ParamT> \
- bool internal:: \
- matcher_##DefineMatcher##OverloadId##Matcher<NodeType, ParamT>::matches( \
- const NodeType &Node, \
- ::clang::ast_matchers::internal::ASTMatchFinder *Finder, \
- ::clang::ast_matchers::internal::BoundNodesTreeBuilder *Builder) \
- const
-
-/// \brief AST_POLYMORPHIC_MATCHER_P2(
-/// DefineMatcher, ParamType1, Param1, ParamType2, Param2) { ... }
-/// defines a two-parameter function named matcher() that is polymorphic in
-/// the return type.
-///
-/// The variables are the same as for AST_MATCHER_P2, with the
-/// addition of NodeType, which specifies the node type of the matcher
-/// Matcher<NodeType> returned by the function DefineMatcher().
-#define AST_POLYMORPHIC_MATCHER_P2(DefineMatcher, ReturnTypesF, ParamType1, \
- Param1, ParamType2, Param2) \
- AST_POLYMORPHIC_MATCHER_P2_OVERLOAD(DefineMatcher, ReturnTypesF, ParamType1, \
- Param1, ParamType2, Param2, 0)
-
-#define AST_POLYMORPHIC_MATCHER_P2_OVERLOAD(DefineMatcher, ReturnTypesF, \
- ParamType1, Param1, ParamType2, \
- Param2, OverloadId) \
- namespace internal { \
- template <typename NodeType, typename ParamT1, typename ParamT2> \
- class matcher_##DefineMatcher##OverloadId##Matcher \
- : public ::clang::ast_matchers::internal::MatcherInterface<NodeType> { \
- public: \
- matcher_##DefineMatcher##OverloadId##Matcher(ParamType1 const &A##Param1, \
- ParamType2 const &A##Param2) \
- : Param1(A##Param1), Param2(A##Param2) {} \
- bool matches(const NodeType &Node, \
- ::clang::ast_matchers::internal::ASTMatchFinder *Finder, \
- ::clang::ast_matchers::internal::BoundNodesTreeBuilder \
- *Builder) const override; \
- \
- private: \
- ParamType1 const Param1; \
- ParamType2 const Param2; \
- }; \
- } \
- inline ::clang::ast_matchers::internal::PolymorphicMatcherWithParam2< \
- internal::matcher_##DefineMatcher##OverloadId##Matcher, ParamType1, \
- ParamType2, ReturnTypesF> \
- DefineMatcher(ParamType1 const &Param1, ParamType2 const &Param2) { \
- return ::clang::ast_matchers::internal::PolymorphicMatcherWithParam2< \
- internal::matcher_##DefineMatcher##OverloadId##Matcher, ParamType1, \
- ParamType2, ReturnTypesF>(Param1, Param2); \
- } \
- typedef ::clang::ast_matchers::internal::PolymorphicMatcherWithParam2< \
- internal::matcher_##DefineMatcher##OverloadId##Matcher, ParamType1, \
- ParamType2, ReturnTypesF>(&DefineMatcher##_Type##OverloadId)( \
- ParamType1 const &Param1, ParamType2 const &Param2); \
- template <typename NodeType, typename ParamT1, typename ParamT2> \
- bool internal::matcher_##DefineMatcher##OverloadId##Matcher< \
- NodeType, ParamT1, ParamT2>:: \
- matches(const NodeType &Node, \
- ::clang::ast_matchers::internal::ASTMatchFinder *Finder, \
- ::clang::ast_matchers::internal::BoundNodesTreeBuilder *Builder) \
- const
-
-/// \brief Creates a variadic matcher for both a specific \c Type as well as
-/// the corresponding \c TypeLoc.
-#define AST_TYPE_MATCHER(NodeType, MatcherName) \
- const ::clang::ast_matchers::internal::VariadicDynCastAllOfMatcher< \
- Type, NodeType> MatcherName
-// FIXME: add a matcher for TypeLoc derived classes using its custom casting
-// API (no longer dyn_cast) if/when we need such matching
-
-/// \brief AST_TYPE_TRAVERSE_MATCHER(MatcherName, FunctionName) defines
-/// the matcher \c MatcherName that can be used to traverse from one \c Type
-/// to another.
-///
-/// For a specific \c SpecificType, the traversal is done using
-/// \c SpecificType::FunctionName. The existence of such a function determines
-/// whether a corresponding matcher can be used on \c SpecificType.
-#define AST_TYPE_TRAVERSE_MATCHER(MatcherName, FunctionName, ReturnTypesF) \
- namespace internal { \
- template <typename T> struct TypeMatcher##MatcherName##Getter { \
- static QualType (T::*value())() const { return &T::FunctionName; } \
- }; \
- } \
- const ::clang::ast_matchers::internal::TypeTraversePolymorphicMatcher< \
- QualType, \
- ::clang::ast_matchers::internal::TypeMatcher##MatcherName##Getter, \
- ::clang::ast_matchers::internal::TypeTraverseMatcher, \
- ReturnTypesF>::Func MatcherName
-
-/// \brief AST_TYPELOC_TRAVERSE_MATCHER(MatcherName, FunctionName) works
-/// identical to \c AST_TYPE_TRAVERSE_MATCHER but operates on \c TypeLocs.
-#define AST_TYPELOC_TRAVERSE_MATCHER(MatcherName, FunctionName, ReturnTypesF) \
- namespace internal { \
- template <typename T> struct TypeLocMatcher##MatcherName##Getter { \
- static TypeLoc (T::*value())() const { return &T::FunctionName##Loc; } \
- }; \
- } \
- const ::clang::ast_matchers::internal::TypeTraversePolymorphicMatcher< \
- TypeLoc, \
- ::clang::ast_matchers::internal::TypeLocMatcher##MatcherName##Getter, \
- ::clang::ast_matchers::internal::TypeLocTraverseMatcher, \
- ReturnTypesF>::Func MatcherName##Loc; \
- AST_TYPE_TRAVERSE_MATCHER(MatcherName, FunctionName##Type, ReturnTypesF)
-
-#endif
OpenPOWER on IntegriCloud