1 //===--- ASTMatchersInternal.h - Structural query framework -----*- C++ -*-===//
2 //
3 // The LLVM Compiler Infrastructure
4 //
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
7 //
8 //===----------------------------------------------------------------------===//
9 //
10 // Implements the base layer of the matcher framework.
11 //
12 // Matchers are methods that return a Matcher<T> which provides a method
13 // Matches(...) which is a predicate on an AST node. The Matches method's
14 // parameters define the context of the match, which allows matchers to recurse
15 // or store the current node as bound to a specific string, so that it can be
16 // retrieved later.
17 //
18 // In general, matchers have two parts:
19 // 1. A function Matcher<T> MatcherName(<arguments>) which returns a Matcher<T>
20 // based on the arguments and optionally on template type deduction based
21 // on the arguments. Matcher<T>s form an implicit reverse hierarchy
22 // to clang's AST class hierarchy, meaning that you can use a Matcher<Base>
23 // everywhere a Matcher<Derived> is required.
24 // 2. An implementation of a class derived from MatcherInterface<T>.
25 //
26 // The matcher functions are defined in ASTMatchers.h. To make it possible
27 // to implement both the matcher function and the implementation of the matcher
28 // interface in one place, ASTMatcherMacros.h defines macros that allow
29 // implementing a matcher in a single place.
30 //
31 // This file contains the base classes needed to construct the actual matchers.
32 //
33 //===----------------------------------------------------------------------===//
34
35 #ifndef LLVM_CLANG_AST_MATCHERS_AST_MATCHERS_INTERNAL_H
36 #define LLVM_CLANG_AST_MATCHERS_AST_MATCHERS_INTERNAL_H
37
38 #include "clang/AST/ASTTypeTraits.h"
39 #include "clang/AST/DeclCXX.h"
40 #include "clang/AST/Decl.h"
41 #include "clang/AST/ExprCXX.h"
42 #include "clang/AST/StmtCXX.h"
43 #include "clang/AST/Stmt.h"
44 #include "clang/AST/Type.h"
45 #include "llvm/ADT/VariadicFunction.h"
46 #include "llvm/Support/type_traits.h"
47 #include <map>
48 #include <string>
49 #include <vector>
50
51 namespace clang {
52 namespace ast_matchers {
53
54 /// FIXME: Move into the llvm support library.
55 template <bool> struct CompileAssert {};
56 #define TOOLING_COMPILE_ASSERT(Expr, Msg) \
57 typedef CompileAssert<(bool(Expr))> Msg[bool(Expr) ? 1 : -1]
58
59 class BoundNodes;
60
61 namespace internal {
62
63 /// \brief Internal version of BoundNodes. Holds all the bound nodes.
64 class BoundNodesMap {
65 public:
66 /// \brief Adds \c Node to the map with key \c ID.
67 ///
68 /// The node's base type should be in NodeBaseType or it will be unaccessible.
69 template <typename T>
addNode(StringRef ID,const T * Node)70 void addNode(StringRef ID, const T* Node) {
71 NodeMap[ID] = ast_type_traits::DynTypedNode::create(*Node);
72 }
73
74 /// \brief Returns the AST node bound to \c ID.
75 ///
76 /// Returns NULL if there was no node bound to \c ID or if there is a node but
77 /// it cannot be converted to the specified type.
78 template <typename T>
getNodeAs(StringRef ID)79 const T *getNodeAs(StringRef ID) const {
80 IDToNodeMap::const_iterator It = NodeMap.find(ID);
81 if (It == NodeMap.end()) {
82 return NULL;
83 }
84 return It->second.get<T>();
85 }
86
getNode(StringRef ID)87 ast_type_traits::DynTypedNode getNode(StringRef ID) const {
88 IDToNodeMap::const_iterator It = NodeMap.find(ID);
89 if (It == NodeMap.end()) {
90 return ast_type_traits::DynTypedNode();
91 }
92 return It->second;
93 }
94
95 /// \brief Imposes an order on BoundNodesMaps.
96 bool operator<(const BoundNodesMap &Other) const {
97 return NodeMap < Other.NodeMap;
98 }
99
100 private:
101 /// \brief A map from IDs to the bound nodes.
102 ///
103 /// Note that we're using std::map here, as for memoization:
104 /// - we need a comparison operator
105 /// - we need an assignment operator
106 typedef std::map<std::string, ast_type_traits::DynTypedNode> IDToNodeMap;
107
108 IDToNodeMap NodeMap;
109 };
110
111 /// \brief Creates BoundNodesTree objects.
112 ///
113 /// The tree builder is used during the matching process to insert the bound
114 /// nodes from the Id matcher.
115 class BoundNodesTreeBuilder {
116 public:
117 /// \brief A visitor interface to visit all BoundNodes results for a
118 /// BoundNodesTree.
119 class Visitor {
120 public:
~Visitor()121 virtual ~Visitor() {}
122
123 /// \brief Called multiple times during a single call to VisitMatches(...).
124 ///
125 /// 'BoundNodesView' contains the bound nodes for a single match.
126 virtual void visitMatch(const BoundNodes& BoundNodesView) = 0;
127 };
128
129 /// \brief Add a binding from an id to a node.
setBinding(const std::string & Id,const T * Node)130 template <typename T> void setBinding(const std::string &Id, const T *Node) {
131 if (Bindings.empty())
132 Bindings.push_back(BoundNodesMap());
133 for (unsigned i = 0, e = Bindings.size(); i != e; ++i)
134 Bindings[i].addNode(Id, Node);
135 }
136
137 /// \brief Adds a branch in the tree.
138 void addMatch(const BoundNodesTreeBuilder &Bindings);
139
140 /// \brief Visits all matches that this BoundNodesTree represents.
141 ///
142 /// The ownership of 'ResultVisitor' remains at the caller.
143 void visitMatches(Visitor* ResultVisitor);
144
145 template <typename ExcludePredicate>
removeBindings(const ExcludePredicate & Predicate)146 bool removeBindings(const ExcludePredicate &Predicate) {
147 Bindings.erase(std::remove_if(Bindings.begin(), Bindings.end(), Predicate),
148 Bindings.end());
149 return !Bindings.empty();
150 }
151
152 /// \brief Imposes an order on BoundNodesTreeBuilders.
153 bool operator<(const BoundNodesTreeBuilder &Other) const {
154 return Bindings < Other.Bindings;
155 }
156
157 private:
158 SmallVector<BoundNodesMap, 16> Bindings;
159 };
160
161 class ASTMatchFinder;
162
163 /// \brief Generic interface for matchers on an AST node of type T.
164 ///
165 /// Implement this if your matcher may need to inspect the children or
166 /// descendants of the node or bind matched nodes to names. If you are
167 /// writing a simple matcher that only inspects properties of the
168 /// current node and doesn't care about its children or descendants,
169 /// implement SingleNodeMatcherInterface instead.
170 template <typename T>
171 class MatcherInterface : public RefCountedBaseVPTR {
172 public:
~MatcherInterface()173 virtual ~MatcherInterface() {}
174
175 /// \brief Returns true if 'Node' can be matched.
176 ///
177 /// May bind 'Node' to an ID via 'Builder', or recurse into
178 /// the AST via 'Finder'.
179 virtual bool matches(const T &Node,
180 ASTMatchFinder *Finder,
181 BoundNodesTreeBuilder *Builder) const = 0;
182 };
183
184 /// \brief Interface for matchers that only evaluate properties on a single
185 /// node.
186 template <typename T>
187 class SingleNodeMatcherInterface : public MatcherInterface<T> {
188 public:
189 /// \brief Returns true if the matcher matches the provided node.
190 ///
191 /// A subclass must implement this instead of Matches().
192 virtual bool matchesNode(const T &Node) const = 0;
193
194 private:
195 /// Implements MatcherInterface::Matches.
matches(const T & Node,ASTMatchFinder *,BoundNodesTreeBuilder *)196 virtual bool matches(const T &Node,
197 ASTMatchFinder * /* Finder */,
198 BoundNodesTreeBuilder * /* Builder */) const {
199 return matchesNode(Node);
200 }
201 };
202
203 /// \brief Base class for all matchers that works on a \c DynTypedNode.
204 ///
205 /// Matcher implementations will check whether the \c DynTypedNode is
206 /// convertible into the respecitve types and then do the actual match
207 /// on the actual node, or return false if it is not convertible.
208 class DynTypedMatcher {
209 public:
210 virtual ~DynTypedMatcher();
211
212 /// \brief Returns true if the matcher matches the given \c DynNode.
213 virtual bool matches(const ast_type_traits::DynTypedNode DynNode,
214 ASTMatchFinder *Finder,
215 BoundNodesTreeBuilder *Builder) const = 0;
216
217 /// \brief Makes a copy of this matcher object.
218 virtual DynTypedMatcher *clone() const = 0;
219
220 /// \brief Returns a unique ID for the matcher.
221 virtual uint64_t getID() const = 0;
222
223 /// \brief Bind the specified \p ID to the matcher.
224 /// \return A new matcher with the \p ID bound to it if this matcher supports
225 /// binding. Otherwise, returns NULL. Returns NULL by default.
226 virtual DynTypedMatcher* tryBind(StringRef ID) const;
227
228 /// \brief Returns the type this matcher works on.
229 ///
230 /// \c matches() will always return false unless the node passed is of this
231 /// or a derived type.
232 virtual ast_type_traits::ASTNodeKind getSupportedKind() const = 0;
233 };
234
235 /// \brief Wrapper of a MatcherInterface<T> *that allows copying.
236 ///
237 /// A Matcher<Base> can be used anywhere a Matcher<Derived> is
238 /// required. This establishes an is-a relationship which is reverse
239 /// to the AST hierarchy. In other words, Matcher<T> is contravariant
240 /// with respect to T. The relationship is built via a type conversion
241 /// operator rather than a type hierarchy to be able to templatize the
242 /// type hierarchy instead of spelling it out.
243 template <typename T>
244 class Matcher : public DynTypedMatcher {
245 public:
246 /// \brief Takes ownership of the provided implementation pointer.
Matcher(MatcherInterface<T> * Implementation)247 explicit Matcher(MatcherInterface<T> *Implementation)
248 : Implementation(Implementation) {}
249
250 /// \brief Implicitly converts \c Other to a Matcher<T>.
251 ///
252 /// Requires \c T to be derived from \c From.
253 template <typename From>
254 Matcher(const Matcher<From> &Other,
255 typename llvm::enable_if_c<
256 llvm::is_base_of<From, T>::value &&
257 !llvm::is_same<From, T>::value >::type* = 0)
Implementation(new ImplicitCastMatcher<From> (Other))258 : Implementation(new ImplicitCastMatcher<From>(Other)) {}
259
260 /// \brief Implicitly converts \c Matcher<Type> to \c Matcher<QualType>.
261 ///
262 /// The resulting matcher is not strict, i.e. ignores qualifiers.
263 template <typename TypeT>
264 Matcher(const Matcher<TypeT> &Other,
265 typename llvm::enable_if_c<
266 llvm::is_same<T, QualType>::value &&
267 llvm::is_same<TypeT, Type>::value >::type* = 0)
Implementation(new TypeToQualType<TypeT> (Other))268 : Implementation(new TypeToQualType<TypeT>(Other)) {}
269
270 /// \brief Returns \c true if the passed DynTypedMatcher can be converted
271 /// to a \c Matcher<T>.
272 ///
273 /// This method verifies that the underlying matcher in \c Other can process
274 /// nodes of types T.
canConstructFrom(const DynTypedMatcher & Other)275 static bool canConstructFrom(const DynTypedMatcher &Other) {
276 return Other.getSupportedKind()
277 .isBaseOf(ast_type_traits::ASTNodeKind::getFromNodeKind<T>());
278 }
279
280 /// \brief Construct a Matcher<T> interface around the dynamic matcher
281 /// \c Other.
282 ///
283 /// This method asserts that canConstructFrom(Other) is \c true. Callers
284 /// should call canConstructFrom(Other) first to make sure that Other is
285 /// compatible with T.
constructFrom(const DynTypedMatcher & Other)286 static Matcher<T> constructFrom(const DynTypedMatcher &Other) {
287 assert(canConstructFrom(Other));
288 return Matcher<T>(new WrappedMatcher(Other));
289 }
290
291 /// \brief Forwards the call to the underlying MatcherInterface<T> pointer.
matches(const T & Node,ASTMatchFinder * Finder,BoundNodesTreeBuilder * Builder)292 bool matches(const T &Node,
293 ASTMatchFinder *Finder,
294 BoundNodesTreeBuilder *Builder) const {
295 if (Implementation->matches(Node, Finder, Builder))
296 return true;
297 // Delete all bindings when a matcher does not match.
298 // This prevents unexpected exposure of bound nodes in unmatches
299 // branches of the match tree.
300 *Builder = BoundNodesTreeBuilder();
301 return false;
302 }
303
304 /// \brief Returns an ID that uniquely identifies the matcher.
getID()305 uint64_t getID() const {
306 /// FIXME: Document the requirements this imposes on matcher
307 /// implementations (no new() implementation_ during a Matches()).
308 return reinterpret_cast<uint64_t>(Implementation.getPtr());
309 }
310
311 /// \brief Returns the type this matcher works on.
getSupportedKind()312 ast_type_traits::ASTNodeKind getSupportedKind() const {
313 return ast_type_traits::ASTNodeKind::getFromNodeKind<T>();
314 }
315
316 /// \brief Returns whether the matcher matches on the given \c DynNode.
matches(const ast_type_traits::DynTypedNode DynNode,ASTMatchFinder * Finder,BoundNodesTreeBuilder * Builder)317 virtual bool matches(const ast_type_traits::DynTypedNode DynNode,
318 ASTMatchFinder *Finder,
319 BoundNodesTreeBuilder *Builder) const {
320 const T *Node = DynNode.get<T>();
321 if (!Node) return false;
322 return matches(*Node, Finder, Builder);
323 }
324
325 /// \brief Makes a copy of this matcher object.
clone()326 virtual Matcher<T> *clone() const { return new Matcher<T>(*this); }
327
328 /// \brief Allows the conversion of a \c Matcher<Type> to a \c
329 /// Matcher<QualType>.
330 ///
331 /// Depending on the constructor argument, the matcher is either strict, i.e.
332 /// does only matches in the absence of qualifiers, or not, i.e. simply
333 /// ignores any qualifiers.
334 template <typename TypeT>
335 class TypeToQualType : public MatcherInterface<QualType> {
336 public:
TypeToQualType(const Matcher<TypeT> & InnerMatcher)337 TypeToQualType(const Matcher<TypeT> &InnerMatcher)
338 : InnerMatcher(InnerMatcher) {}
339
matches(const QualType & Node,ASTMatchFinder * Finder,BoundNodesTreeBuilder * Builder)340 virtual bool matches(const QualType &Node,
341 ASTMatchFinder *Finder,
342 BoundNodesTreeBuilder *Builder) const {
343 if (Node.isNull())
344 return false;
345 return InnerMatcher.matches(*Node, Finder, Builder);
346 }
347 private:
348 const Matcher<TypeT> InnerMatcher;
349 };
350
351 private:
352 /// \brief Allows conversion from Matcher<Base> to Matcher<T> if T
353 /// is derived from Base.
354 template <typename Base>
355 class ImplicitCastMatcher : public MatcherInterface<T> {
356 public:
ImplicitCastMatcher(const Matcher<Base> & From)357 explicit ImplicitCastMatcher(const Matcher<Base> &From)
358 : From(From) {}
359
matches(const T & Node,ASTMatchFinder * Finder,BoundNodesTreeBuilder * Builder)360 virtual bool matches(const T &Node,
361 ASTMatchFinder *Finder,
362 BoundNodesTreeBuilder *Builder) const {
363 return From.matches(Node, Finder, Builder);
364 }
365
366 private:
367 const Matcher<Base> From;
368 };
369
370 /// \brief Simple MatcherInterface<T> wrapper around a DynTypedMatcher.
371 class WrappedMatcher : public MatcherInterface<T> {
372 public:
WrappedMatcher(const DynTypedMatcher & Matcher)373 explicit WrappedMatcher(const DynTypedMatcher &Matcher)
374 : Inner(Matcher.clone()) {}
~WrappedMatcher()375 virtual ~WrappedMatcher() {}
376
matches(const T & Node,ASTMatchFinder * Finder,BoundNodesTreeBuilder * Builder)377 bool matches(const T &Node, ASTMatchFinder *Finder,
378 BoundNodesTreeBuilder *Builder) const {
379 return Inner->matches(ast_type_traits::DynTypedNode::create(Node), Finder,
380 Builder);
381 }
382
383 private:
384 const OwningPtr<DynTypedMatcher> Inner;
385 };
386
387 IntrusiveRefCntPtr< MatcherInterface<T> > Implementation;
388 }; // class Matcher
389
390 /// \brief A convenient helper for creating a Matcher<T> without specifying
391 /// the template type argument.
392 template <typename T>
makeMatcher(MatcherInterface<T> * Implementation)393 inline Matcher<T> makeMatcher(MatcherInterface<T> *Implementation) {
394 return Matcher<T>(Implementation);
395 }
396
397 /// \brief Specialization of the conversion functions for QualType.
398 ///
399 /// These specializations provide the Matcher<Type>->Matcher<QualType>
400 /// conversion that the static API does.
401 template <>
402 inline bool
canConstructFrom(const DynTypedMatcher & Other)403 Matcher<QualType>::canConstructFrom(const DynTypedMatcher &Other) {
404 ast_type_traits::ASTNodeKind SourceKind = Other.getSupportedKind();
405 // We support implicit conversion from Matcher<Type> to Matcher<QualType>
406 return SourceKind.isSame(
407 ast_type_traits::ASTNodeKind::getFromNodeKind<Type>()) ||
408 SourceKind.isSame(
409 ast_type_traits::ASTNodeKind::getFromNodeKind<QualType>());
410 }
411
412 template <>
413 inline Matcher<QualType>
constructFrom(const DynTypedMatcher & Other)414 Matcher<QualType>::constructFrom(const DynTypedMatcher &Other) {
415 assert(canConstructFrom(Other));
416 ast_type_traits::ASTNodeKind SourceKind = Other.getSupportedKind();
417 if (SourceKind.isSame(
418 ast_type_traits::ASTNodeKind::getFromNodeKind<Type>())) {
419 // We support implicit conversion from Matcher<Type> to Matcher<QualType>
420 return Matcher<Type>::constructFrom(Other);
421 }
422 return makeMatcher(new WrappedMatcher(Other));
423 }
424
425 /// \brief Finds the first node in a range that matches the given matcher.
426 template <typename MatcherT, typename IteratorT>
matchesFirstInRange(const MatcherT & Matcher,IteratorT Start,IteratorT End,ASTMatchFinder * Finder,BoundNodesTreeBuilder * Builder)427 bool matchesFirstInRange(const MatcherT &Matcher, IteratorT Start,
428 IteratorT End, ASTMatchFinder *Finder,
429 BoundNodesTreeBuilder *Builder) {
430 for (IteratorT I = Start; I != End; ++I) {
431 BoundNodesTreeBuilder Result(*Builder);
432 if (Matcher.matches(*I, Finder, &Result)) {
433 *Builder = Result;
434 return true;
435 }
436 }
437 return false;
438 }
439
440 /// \brief Finds the first node in a pointer range that matches the given
441 /// matcher.
442 template <typename MatcherT, typename IteratorT>
matchesFirstInPointerRange(const MatcherT & Matcher,IteratorT Start,IteratorT End,ASTMatchFinder * Finder,BoundNodesTreeBuilder * Builder)443 bool matchesFirstInPointerRange(const MatcherT &Matcher, IteratorT Start,
444 IteratorT End, ASTMatchFinder *Finder,
445 BoundNodesTreeBuilder *Builder) {
446 for (IteratorT I = Start; I != End; ++I) {
447 BoundNodesTreeBuilder Result(*Builder);
448 if (Matcher.matches(**I, Finder, &Result)) {
449 *Builder = Result;
450 return true;
451 }
452 }
453 return false;
454 }
455
456 /// \brief Metafunction to determine if type T has a member called getDecl.
457 template <typename T> struct has_getDecl {
458 struct Default { int getDecl; };
459 struct Derived : T, Default { };
460
461 template<typename C, C> struct CheckT;
462
463 // If T::getDecl exists, an ambiguity arises and CheckT will
464 // not be instantiable. This makes f(...) the only available
465 // overload.
466 template<typename C>
467 static char (&f(CheckT<int Default::*, &C::getDecl>*))[1];
468 template<typename C> static char (&f(...))[2];
469
470 static bool const value = sizeof(f<Derived>(0)) == 2;
471 };
472
473 /// \brief Matches overloaded operators with a specific name.
474 ///
475 /// The type argument ArgT is not used by this matcher but is used by
476 /// PolymorphicMatcherWithParam1 and should be StringRef.
477 template <typename T, typename ArgT>
478 class HasOverloadedOperatorNameMatcher : public SingleNodeMatcherInterface<T> {
479 TOOLING_COMPILE_ASSERT((llvm::is_same<T, CXXOperatorCallExpr>::value ||
480 llvm::is_same<T, CXXMethodDecl>::value),
481 unsupported_class_for_matcher);
482 TOOLING_COMPILE_ASSERT((llvm::is_same<ArgT, StringRef>::value),
483 argument_type_must_be_StringRef);
484 public:
HasOverloadedOperatorNameMatcher(const StringRef Name)485 explicit HasOverloadedOperatorNameMatcher(const StringRef Name)
486 : SingleNodeMatcherInterface<T>(), Name(Name) {}
487
matchesNode(const T & Node)488 virtual bool matchesNode(const T &Node) const LLVM_OVERRIDE {
489 return matchesSpecialized(Node);
490 }
491
492 private:
493
494 /// \brief CXXOperatorCallExpr exist only for calls to overloaded operators
495 /// so this function returns true if the call is to an operator of the given
496 /// name.
matchesSpecialized(const CXXOperatorCallExpr & Node)497 bool matchesSpecialized(const CXXOperatorCallExpr &Node) const {
498 return getOperatorSpelling(Node.getOperator()) == Name;
499 }
500
501 /// \brief Returns true only if CXXMethodDecl represents an overloaded
502 /// operator and has the given operator name.
matchesSpecialized(const CXXMethodDecl & Node)503 bool matchesSpecialized(const CXXMethodDecl &Node) const {
504 return Node.isOverloadedOperator() &&
505 getOperatorSpelling(Node.getOverloadedOperator()) == Name;
506 }
507
508 std::string Name;
509 };
510
511 /// \brief Matches declarations for QualType and CallExpr.
512 ///
513 /// Type argument DeclMatcherT is required by PolymorphicMatcherWithParam1 but
514 /// not actually used.
515 template <typename T, typename DeclMatcherT>
516 class HasDeclarationMatcher : public MatcherInterface<T> {
517 TOOLING_COMPILE_ASSERT((llvm::is_same< DeclMatcherT,
518 Matcher<Decl> >::value),
519 instantiated_with_wrong_types);
520 public:
HasDeclarationMatcher(const Matcher<Decl> & InnerMatcher)521 explicit HasDeclarationMatcher(const Matcher<Decl> &InnerMatcher)
522 : InnerMatcher(InnerMatcher) {}
523
matches(const T & Node,ASTMatchFinder * Finder,BoundNodesTreeBuilder * Builder)524 virtual bool matches(const T &Node,
525 ASTMatchFinder *Finder,
526 BoundNodesTreeBuilder *Builder) const {
527 return matchesSpecialized(Node, Finder, Builder);
528 }
529
530 private:
531 /// \brief If getDecl exists as a member of U, returns whether the inner
532 /// matcher matches Node.getDecl().
533 template <typename U>
534 bool matchesSpecialized(
535 const U &Node, ASTMatchFinder *Finder, BoundNodesTreeBuilder *Builder,
536 typename llvm::enable_if<has_getDecl<U>, int>::type = 0) const {
537 return matchesDecl(Node.getDecl(), Finder, Builder);
538 }
539
540 /// \brief Extracts the CXXRecordDecl or EnumDecl of a QualType and returns
541 /// whether the inner matcher matches on it.
matchesSpecialized(const QualType & Node,ASTMatchFinder * Finder,BoundNodesTreeBuilder * Builder)542 bool matchesSpecialized(const QualType &Node, ASTMatchFinder *Finder,
543 BoundNodesTreeBuilder *Builder) const {
544 /// FIXME: Add other ways to convert...
545 if (Node.isNull())
546 return false;
547 if (const EnumType *AsEnum = dyn_cast<EnumType>(Node.getTypePtr()))
548 return matchesDecl(AsEnum->getDecl(), Finder, Builder);
549 return matchesDecl(Node->getAsCXXRecordDecl(), Finder, Builder);
550 }
551
552 /// \brief Gets the TemplateDecl from a TemplateSpecializationType
553 /// and returns whether the inner matches on it.
matchesSpecialized(const TemplateSpecializationType & Node,ASTMatchFinder * Finder,BoundNodesTreeBuilder * Builder)554 bool matchesSpecialized(const TemplateSpecializationType &Node,
555 ASTMatchFinder *Finder,
556 BoundNodesTreeBuilder *Builder) const {
557 return matchesDecl(Node.getTemplateName().getAsTemplateDecl(),
558 Finder, Builder);
559 }
560
561 /// \brief Extracts the Decl of the callee of a CallExpr and returns whether
562 /// the inner matcher matches on it.
matchesSpecialized(const CallExpr & Node,ASTMatchFinder * Finder,BoundNodesTreeBuilder * Builder)563 bool matchesSpecialized(const CallExpr &Node, ASTMatchFinder *Finder,
564 BoundNodesTreeBuilder *Builder) const {
565 return matchesDecl(Node.getCalleeDecl(), Finder, Builder);
566 }
567
568 /// \brief Extracts the Decl of the constructor call and returns whether the
569 /// inner matcher matches on it.
matchesSpecialized(const CXXConstructExpr & Node,ASTMatchFinder * Finder,BoundNodesTreeBuilder * Builder)570 bool matchesSpecialized(const CXXConstructExpr &Node,
571 ASTMatchFinder *Finder,
572 BoundNodesTreeBuilder *Builder) const {
573 return matchesDecl(Node.getConstructor(), Finder, Builder);
574 }
575
576 /// \brief Extracts the \c ValueDecl a \c MemberExpr refers to and returns
577 /// whether the inner matcher matches on it.
matchesSpecialized(const MemberExpr & Node,ASTMatchFinder * Finder,BoundNodesTreeBuilder * Builder)578 bool matchesSpecialized(const MemberExpr &Node,
579 ASTMatchFinder *Finder,
580 BoundNodesTreeBuilder *Builder) const {
581 return matchesDecl(Node.getMemberDecl(), Finder, Builder);
582 }
583
584 /// \brief Returns whether the inner matcher \c Node. Returns false if \c Node
585 /// is \c NULL.
matchesDecl(const Decl * Node,ASTMatchFinder * Finder,BoundNodesTreeBuilder * Builder)586 bool matchesDecl(const Decl *Node,
587 ASTMatchFinder *Finder,
588 BoundNodesTreeBuilder *Builder) const {
589 return Node != NULL && InnerMatcher.matches(*Node, Finder, Builder);
590 }
591
592 const Matcher<Decl> InnerMatcher;
593 };
594
595 /// \brief IsBaseType<T>::value is true if T is a "base" type in the AST
596 /// node class hierarchies.
597 template <typename T>
598 struct IsBaseType {
599 static const bool value =
600 (llvm::is_same<T, Decl>::value ||
601 llvm::is_same<T, Stmt>::value ||
602 llvm::is_same<T, QualType>::value ||
603 llvm::is_same<T, Type>::value ||
604 llvm::is_same<T, TypeLoc>::value ||
605 llvm::is_same<T, NestedNameSpecifier>::value ||
606 llvm::is_same<T, NestedNameSpecifierLoc>::value ||
607 llvm::is_same<T, CXXCtorInitializer>::value);
608 };
609 template <typename T>
610 const bool IsBaseType<T>::value;
611
612 /// \brief Interface that allows matchers to traverse the AST.
613 /// FIXME: Find a better name.
614 ///
615 /// This provides three entry methods for each base node type in the AST:
616 /// - \c matchesChildOf:
617 /// Matches a matcher on every child node of the given node. Returns true
618 /// if at least one child node could be matched.
619 /// - \c matchesDescendantOf:
620 /// Matches a matcher on all descendant nodes of the given node. Returns true
621 /// if at least one descendant matched.
622 /// - \c matchesAncestorOf:
623 /// Matches a matcher on all ancestors of the given node. Returns true if
624 /// at least one ancestor matched.
625 ///
626 /// FIXME: Currently we only allow Stmt and Decl nodes to start a traversal.
627 /// In the future, we wan to implement this for all nodes for which it makes
628 /// sense. In the case of matchesAncestorOf, we'll want to implement it for
629 /// all nodes, as all nodes have ancestors.
630 class ASTMatchFinder {
631 public:
632 /// \brief Defines how we descend a level in the AST when we pass
633 /// through expressions.
634 enum TraversalKind {
635 /// Will traverse any child nodes.
636 TK_AsIs,
637 /// Will not traverse implicit casts and parentheses.
638 TK_IgnoreImplicitCastsAndParentheses
639 };
640
641 /// \brief Defines how bindings are processed on recursive matches.
642 enum BindKind {
643 /// Stop at the first match and only bind the first match.
644 BK_First,
645 /// Create results for all combinations of bindings that match.
646 BK_All
647 };
648
649 /// \brief Defines which ancestors are considered for a match.
650 enum AncestorMatchMode {
651 /// All ancestors.
652 AMM_All,
653 /// Direct parent only.
654 AMM_ParentOnly
655 };
656
~ASTMatchFinder()657 virtual ~ASTMatchFinder() {}
658
659 /// \brief Returns true if the given class is directly or indirectly derived
660 /// from a base type matching \c base.
661 ///
662 /// A class is considered to be also derived from itself.
663 virtual bool classIsDerivedFrom(const CXXRecordDecl *Declaration,
664 const Matcher<NamedDecl> &Base,
665 BoundNodesTreeBuilder *Builder) = 0;
666
667 template <typename T>
matchesChildOf(const T & Node,const DynTypedMatcher & Matcher,BoundNodesTreeBuilder * Builder,TraversalKind Traverse,BindKind Bind)668 bool matchesChildOf(const T &Node,
669 const DynTypedMatcher &Matcher,
670 BoundNodesTreeBuilder *Builder,
671 TraversalKind Traverse,
672 BindKind Bind) {
673 TOOLING_COMPILE_ASSERT(
674 (llvm::is_base_of<Decl, T>::value ||
675 llvm::is_base_of<Stmt, T>::value ||
676 llvm::is_base_of<NestedNameSpecifier, T>::value ||
677 llvm::is_base_of<NestedNameSpecifierLoc, T>::value ||
678 llvm::is_base_of<TypeLoc, T>::value ||
679 llvm::is_base_of<QualType, T>::value),
680 unsupported_type_for_recursive_matching);
681 return matchesChildOf(ast_type_traits::DynTypedNode::create(Node),
682 Matcher, Builder, Traverse, Bind);
683 }
684
685 template <typename T>
matchesDescendantOf(const T & Node,const DynTypedMatcher & Matcher,BoundNodesTreeBuilder * Builder,BindKind Bind)686 bool matchesDescendantOf(const T &Node,
687 const DynTypedMatcher &Matcher,
688 BoundNodesTreeBuilder *Builder,
689 BindKind Bind) {
690 TOOLING_COMPILE_ASSERT(
691 (llvm::is_base_of<Decl, T>::value ||
692 llvm::is_base_of<Stmt, T>::value ||
693 llvm::is_base_of<NestedNameSpecifier, T>::value ||
694 llvm::is_base_of<NestedNameSpecifierLoc, T>::value ||
695 llvm::is_base_of<TypeLoc, T>::value ||
696 llvm::is_base_of<QualType, T>::value),
697 unsupported_type_for_recursive_matching);
698 return matchesDescendantOf(ast_type_traits::DynTypedNode::create(Node),
699 Matcher, Builder, Bind);
700 }
701
702 // FIXME: Implement support for BindKind.
703 template <typename T>
matchesAncestorOf(const T & Node,const DynTypedMatcher & Matcher,BoundNodesTreeBuilder * Builder,AncestorMatchMode MatchMode)704 bool matchesAncestorOf(const T &Node,
705 const DynTypedMatcher &Matcher,
706 BoundNodesTreeBuilder *Builder,
707 AncestorMatchMode MatchMode) {
708 TOOLING_COMPILE_ASSERT((llvm::is_base_of<Decl, T>::value ||
709 llvm::is_base_of<Stmt, T>::value),
710 only_Decl_or_Stmt_allowed_for_recursive_matching);
711 return matchesAncestorOf(ast_type_traits::DynTypedNode::create(Node),
712 Matcher, Builder, MatchMode);
713 }
714
715 virtual ASTContext &getASTContext() const = 0;
716
717 protected:
718 virtual bool matchesChildOf(const ast_type_traits::DynTypedNode &Node,
719 const DynTypedMatcher &Matcher,
720 BoundNodesTreeBuilder *Builder,
721 TraversalKind Traverse,
722 BindKind Bind) = 0;
723
724 virtual bool matchesDescendantOf(const ast_type_traits::DynTypedNode &Node,
725 const DynTypedMatcher &Matcher,
726 BoundNodesTreeBuilder *Builder,
727 BindKind Bind) = 0;
728
729 virtual bool matchesAncestorOf(const ast_type_traits::DynTypedNode &Node,
730 const DynTypedMatcher &Matcher,
731 BoundNodesTreeBuilder *Builder,
732 AncestorMatchMode MatchMode) = 0;
733 };
734
735 /// \brief A simple type-list implementation.
736 ///
737 /// It is implemented as a flat struct with a maximum number of arguments to
738 /// simplify compiler error messages.
739 /// However, it is used as a "linked list" of types.
740 ///
741 /// Note: If you need to extend for more types, add them as template arguments
742 /// and to the "typedef TypeList<...> tail" below. Nothing else is needed.
743 template <typename T1 = void, typename T2 = void, typename T3 = void,
744 typename T4 = void, typename T5 = void, typename T6 = void,
745 typename T7 = void, typename T8 = void>
746 struct TypeList {
747 /// \brief The first type on the list.
748 typedef T1 head;
749
750 /// \brief A sub list with the tail. ie everything but the head.
751 ///
752 /// This type is used to do recursion. TypeList<>/EmptyTypeList indicates the
753 /// end of the list.
754 typedef TypeList<T2, T3, T4, T5, T6, T7, T8> tail;
755
756 /// \brief Helper meta-function to determine if some type \c T is present or
757 /// a parent type in the list.
758 template <typename T> struct ContainsSuperOf {
759 static const bool value = llvm::is_base_of<head, T>::value ||
760 tail::template ContainsSuperOf<T>::value;
761 };
762 };
763
764 /// \brief Specialization of ContainsSuperOf for the empty list.
765 template <> template <typename T> struct TypeList<>::ContainsSuperOf {
766 static const bool value = false;
767 };
768
769 /// \brief The empty type list.
770 typedef TypeList<> EmptyTypeList;
771
772 /// \brief A "type list" that contains all types.
773 ///
774 /// Useful for matchers like \c anything and \c unless.
775 typedef TypeList<Decl, Stmt, NestedNameSpecifier, NestedNameSpecifierLoc,
776 QualType, Type, TypeLoc, CXXCtorInitializer> AllNodeBaseTypes;
777
778 /// \brief Helper meta-function to extract the argument out of a function of
779 /// type void(Arg).
780 ///
781 /// See AST_POLYMORPHIC_SUPPORTED_TYPES_* for details.
782 template <class T> struct ExtractFunctionArgMeta;
783 template <class T> struct ExtractFunctionArgMeta<void(T)> {
784 typedef T type;
785 };
786
787 /// \brief Default type lists for ArgumentAdaptingMatcher matchers.
788 typedef AllNodeBaseTypes AdaptativeDefaultFromTypes;
789 typedef TypeList<Decl, Stmt, NestedNameSpecifier, NestedNameSpecifierLoc,
790 TypeLoc, QualType> AdaptativeDefaultToTypes;
791
792 /// \brief Converts a \c Matcher<T> to a matcher of desired type \c To by
793 /// "adapting" a \c To into a \c T.
794 ///
795 /// The \c ArgumentAdapterT argument specifies how the adaptation is done.
796 ///
797 /// For example:
798 /// \c ArgumentAdaptingMatcher<HasMatcher, T>(InnerMatcher);
799 /// Given that \c InnerMatcher is of type \c Matcher<T>, this returns a matcher
800 /// that is convertible into any matcher of type \c To by constructing
801 /// \c HasMatcher<To, T>(InnerMatcher).
802 ///
803 /// If a matcher does not need knowledge about the inner type, prefer to use
804 /// PolymorphicMatcherWithParam1.
805 template <template <typename ToArg, typename FromArg> class ArgumentAdapterT,
806 typename T, typename FromTypes = AdaptativeDefaultFromTypes,
807 typename ToTypes = AdaptativeDefaultToTypes>
808 class ArgumentAdaptingMatcher {
809 public:
810 explicit ArgumentAdaptingMatcher(const Matcher<T> &InnerMatcher)
811 : InnerMatcher(InnerMatcher) {}
812
813 typedef ToTypes ReturnTypes;
814
815 template <typename To>
816 operator Matcher<To>() const {
817 return Matcher<To>(new ArgumentAdapterT<To, T>(InnerMatcher));
818 }
819
820 private:
821 const Matcher<T> InnerMatcher;
822 };
823
824 /// \brief A PolymorphicMatcherWithParamN<MatcherT, P1, ..., PN> object can be
825 /// created from N parameters p1, ..., pN (of type P1, ..., PN) and
826 /// used as a Matcher<T> where a MatcherT<T, P1, ..., PN>(p1, ..., pN)
827 /// can be constructed.
828 ///
829 /// For example:
830 /// - PolymorphicMatcherWithParam0<IsDefinitionMatcher>()
831 /// creates an object that can be used as a Matcher<T> for any type T
832 /// where an IsDefinitionMatcher<T>() can be constructed.
833 /// - PolymorphicMatcherWithParam1<ValueEqualsMatcher, int>(42)
834 /// creates an object that can be used as a Matcher<T> for any type T
835 /// where a ValueEqualsMatcher<T, int>(42) can be constructed.
836 template <template <typename T> class MatcherT,
837 typename ReturnTypesF = void(AllNodeBaseTypes)>
838 class PolymorphicMatcherWithParam0 {
839 public:
840 typedef typename ExtractFunctionArgMeta<ReturnTypesF>::type ReturnTypes;
841 template <typename T>
842 operator Matcher<T>() const {
843 TOOLING_COMPILE_ASSERT(ReturnTypes::template ContainsSuperOf<T>::value,
844 right_polymorphic_conversion);
845 return Matcher<T>(new MatcherT<T>());
846 }
847 };
848
849 template <template <typename T, typename P1> class MatcherT,
850 typename P1,
851 typename ReturnTypesF = void(AllNodeBaseTypes)>
852 class PolymorphicMatcherWithParam1 {
853 public:
854 explicit PolymorphicMatcherWithParam1(const P1 &Param1)
855 : Param1(Param1) {}
856
857 typedef typename ExtractFunctionArgMeta<ReturnTypesF>::type ReturnTypes;
858
859 template <typename T>
860 operator Matcher<T>() const {
861 TOOLING_COMPILE_ASSERT(ReturnTypes::template ContainsSuperOf<T>::value,
862 right_polymorphic_conversion);
863 return Matcher<T>(new MatcherT<T, P1>(Param1));
864 }
865
866 private:
867 const P1 Param1;
868 };
869
870 template <template <typename T, typename P1, typename P2> class MatcherT,
871 typename P1, typename P2,
872 typename ReturnTypesF = void(AllNodeBaseTypes)>
873 class PolymorphicMatcherWithParam2 {
874 public:
875 PolymorphicMatcherWithParam2(const P1 &Param1, const P2 &Param2)
876 : Param1(Param1), Param2(Param2) {}
877
878 typedef typename ExtractFunctionArgMeta<ReturnTypesF>::type ReturnTypes;
879
880 template <typename T>
881 operator Matcher<T>() const {
882 TOOLING_COMPILE_ASSERT(ReturnTypes::template ContainsSuperOf<T>::value,
883 right_polymorphic_conversion);
884 return Matcher<T>(new MatcherT<T, P1, P2>(Param1, Param2));
885 }
886
887 private:
888 const P1 Param1;
889 const P2 Param2;
890 };
891
892 /// \brief Matches any instance of the given NodeType.
893 ///
894 /// This is useful when a matcher syntactically requires a child matcher,
895 /// but the context doesn't care. See for example: anything().
896 ///
897 /// FIXME: Alternatively we could also create a IsAMatcher or something
898 /// that checks that a dyn_cast is possible. This is purely needed for the
899 /// difference between calling for example:
900 /// record()
901 /// and
902 /// record(SomeMatcher)
903 /// In the second case we need the correct type we were dyn_cast'ed to in order
904 /// to get the right type for the inner matcher. In the first case we don't need
905 /// that, but we use the type conversion anyway and insert a TrueMatcher.
906 template <typename T>
907 class TrueMatcher : public SingleNodeMatcherInterface<T> {
908 public:
909 virtual bool matchesNode(const T &Node) const {
910 return true;
911 }
912 };
913
914 /// \brief Provides a MatcherInterface<T> for a Matcher<To> that matches if T is
915 /// dyn_cast'able into To and the given Matcher<To> matches on the dyn_cast'ed
916 /// node.
917 template <typename T, typename To>
918 class DynCastMatcher : public MatcherInterface<T> {
919 public:
920 explicit DynCastMatcher(const Matcher<To> &InnerMatcher)
921 : InnerMatcher(InnerMatcher) {}
922
923 virtual bool matches(const T &Node,
924 ASTMatchFinder *Finder,
925 BoundNodesTreeBuilder *Builder) const {
926 const To *InnerMatchValue = dyn_cast<To>(&Node);
927 return InnerMatchValue != NULL &&
928 InnerMatcher.matches(*InnerMatchValue, Finder, Builder);
929 }
930
931 private:
932 const Matcher<To> InnerMatcher;
933 };
934
935 /// \brief Matcher<T> that wraps an inner Matcher<T> and binds the matched node
936 /// to an ID if the inner matcher matches on the node.
937 template <typename T>
938 class IdMatcher : public MatcherInterface<T> {
939 public:
940 /// \brief Creates an IdMatcher that binds to 'ID' if 'InnerMatcher' matches
941 /// the node.
942 IdMatcher(StringRef ID, const Matcher<T> &InnerMatcher)
943 : ID(ID), InnerMatcher(InnerMatcher) {}
944
945 virtual bool matches(const T &Node,
946 ASTMatchFinder *Finder,
947 BoundNodesTreeBuilder *Builder) const {
948 bool Result = InnerMatcher.matches(Node, Finder, Builder);
949 if (Result) {
950 Builder->setBinding(ID, &Node);
951 }
952 return Result;
953 }
954
955 private:
956 const std::string ID;
957 const Matcher<T> InnerMatcher;
958 };
959
960 /// \brief A Matcher that allows binding the node it matches to an id.
961 ///
962 /// BindableMatcher provides a \a bind() method that allows binding the
963 /// matched node to an id if the match was successful.
964 template <typename T>
965 class BindableMatcher : public Matcher<T> {
966 public:
967 BindableMatcher(MatcherInterface<T> *Implementation)
968 : Matcher<T>(Implementation) {}
969
970 /// \brief Returns a matcher that will bind the matched node on a match.
971 ///
972 /// The returned matcher is equivalent to this matcher, but will
973 /// bind the matched node on a match.
974 Matcher<T> bind(StringRef ID) const {
975 return Matcher<T>(new IdMatcher<T>(ID, *this));
976 }
977
978 /// \brief Makes a copy of this matcher object.
979 virtual BindableMatcher<T>* clone() const {
980 return new BindableMatcher<T>(*this);
981 }
982
983 /// \brief Bind the specified \c ID to the matcher.
984 virtual Matcher<T>* tryBind(StringRef ID) const {
985 return new Matcher<T>(bind(ID));
986 }
987 };
988
989 /// \brief Matches nodes of type T that have child nodes of type ChildT for
990 /// which a specified child matcher matches.
991 ///
992 /// ChildT must be an AST base type.
993 template <typename T, typename ChildT>
994 class HasMatcher : public MatcherInterface<T> {
995 TOOLING_COMPILE_ASSERT(IsBaseType<ChildT>::value,
996 has_only_accepts_base_type_matcher);
997 public:
998 explicit HasMatcher(const Matcher<ChildT> &ChildMatcher)
999 : ChildMatcher(ChildMatcher) {}
1000
1001 virtual bool matches(const T &Node,
1002 ASTMatchFinder *Finder,
1003 BoundNodesTreeBuilder *Builder) const {
1004 return Finder->matchesChildOf(
1005 Node, ChildMatcher, Builder,
1006 ASTMatchFinder::TK_IgnoreImplicitCastsAndParentheses,
1007 ASTMatchFinder::BK_First);
1008 }
1009
1010 private:
1011 const Matcher<ChildT> ChildMatcher;
1012 };
1013
1014 /// \brief Matches nodes of type T that have child nodes of type ChildT for
1015 /// which a specified child matcher matches. ChildT must be an AST base
1016 /// type.
1017 /// As opposed to the HasMatcher, the ForEachMatcher will produce a match
1018 /// for each child that matches.
1019 template <typename T, typename ChildT>
1020 class ForEachMatcher : public MatcherInterface<T> {
1021 TOOLING_COMPILE_ASSERT(IsBaseType<ChildT>::value,
1022 for_each_only_accepts_base_type_matcher);
1023 public:
1024 explicit ForEachMatcher(const Matcher<ChildT> &ChildMatcher)
1025 : ChildMatcher(ChildMatcher) {}
1026
1027 virtual bool matches(const T& Node,
1028 ASTMatchFinder* Finder,
1029 BoundNodesTreeBuilder* Builder) const {
1030 return Finder->matchesChildOf(
1031 Node, ChildMatcher, Builder,
1032 ASTMatchFinder::TK_IgnoreImplicitCastsAndParentheses,
1033 ASTMatchFinder::BK_All);
1034 }
1035
1036 private:
1037 const Matcher<ChildT> ChildMatcher;
1038 };
1039
1040 /// \brief Matches nodes of type T if the given Matcher<T> does not match.
1041 ///
1042 /// Type argument MatcherT is required by PolymorphicMatcherWithParam1
1043 /// but not actually used. It will always be instantiated with a type
1044 /// convertible to Matcher<T>.
1045 template <typename T, typename MatcherT>
1046 class NotMatcher : public MatcherInterface<T> {
1047 public:
1048 explicit NotMatcher(const Matcher<T> &InnerMatcher)
1049 : InnerMatcher(InnerMatcher) {}
1050
1051 virtual bool matches(const T &Node,
1052 ASTMatchFinder *Finder,
1053 BoundNodesTreeBuilder *Builder) const {
1054 // The 'unless' matcher will always discard the result:
1055 // If the inner matcher doesn't match, unless returns true,
1056 // but the inner matcher cannot have bound anything.
1057 // If the inner matcher matches, the result is false, and
1058 // any possible binding will be discarded.
1059 // We still need to hand in all the bound nodes up to this
1060 // point so the inner matcher can depend on bound nodes,
1061 // and we need to actively discard the bound nodes, otherwise
1062 // the inner matcher will reset the bound nodes if it doesn't
1063 // match, but this would be inversed by 'unless'.
1064 BoundNodesTreeBuilder Discard(*Builder);
1065 return !InnerMatcher.matches(Node, Finder, &Discard);
1066 }
1067
1068 private:
1069 const Matcher<T> InnerMatcher;
1070 };
1071
1072 /// \brief Matches nodes of type T for which both provided matchers match.
1073 ///
1074 /// Type arguments MatcherT1 and MatcherT2 are required by
1075 /// PolymorphicMatcherWithParam2 but not actually used. They will
1076 /// always be instantiated with types convertible to Matcher<T>.
1077 template <typename T, typename MatcherT1, typename MatcherT2>
1078 class AllOfMatcher : public MatcherInterface<T> {
1079 public:
1080 AllOfMatcher(const Matcher<T> &InnerMatcher1, const Matcher<T> &InnerMatcher2)
1081 : InnerMatcher1(InnerMatcher1), InnerMatcher2(InnerMatcher2) {}
1082
1083 virtual bool matches(const T &Node,
1084 ASTMatchFinder *Finder,
1085 BoundNodesTreeBuilder *Builder) const {
1086 // allOf leads to one matcher for each alternative in the first
1087 // matcher combined with each alternative in the second matcher.
1088 // Thus, we can reuse the same Builder.
1089 return InnerMatcher1.matches(Node, Finder, Builder) &&
1090 InnerMatcher2.matches(Node, Finder, Builder);
1091 }
1092
1093 private:
1094 const Matcher<T> InnerMatcher1;
1095 const Matcher<T> InnerMatcher2;
1096 };
1097
1098 /// \brief Matches nodes of type T for which at least one of the two provided
1099 /// matchers matches.
1100 ///
1101 /// Type arguments MatcherT1 and MatcherT2 are
1102 /// required by PolymorphicMatcherWithParam2 but not actually
1103 /// used. They will always be instantiated with types convertible to
1104 /// Matcher<T>.
1105 template <typename T, typename MatcherT1, typename MatcherT2>
1106 class EachOfMatcher : public MatcherInterface<T> {
1107 public:
1108 EachOfMatcher(const Matcher<T> &InnerMatcher1,
1109 const Matcher<T> &InnerMatcher2)
1110 : InnerMatcher1(InnerMatcher1), InnerMatcher2(InnerMatcher2) {
1111 }
1112
1113 virtual bool matches(const T &Node, ASTMatchFinder *Finder,
1114 BoundNodesTreeBuilder *Builder) const {
1115 BoundNodesTreeBuilder Result;
1116 BoundNodesTreeBuilder Builder1(*Builder);
1117 bool Matched1 = InnerMatcher1.matches(Node, Finder, &Builder1);
1118 if (Matched1)
1119 Result.addMatch(Builder1);
1120
1121 BoundNodesTreeBuilder Builder2(*Builder);
1122 bool Matched2 = InnerMatcher2.matches(Node, Finder, &Builder2);
1123 if (Matched2)
1124 Result.addMatch(Builder2);
1125
1126 *Builder = Result;
1127 return Matched1 || Matched2;
1128 }
1129
1130 private:
1131 const Matcher<T> InnerMatcher1;
1132 const Matcher<T> InnerMatcher2;
1133 };
1134
1135 /// \brief Matches nodes of type T for which at least one of the two provided
1136 /// matchers matches.
1137 ///
1138 /// Type arguments MatcherT1 and MatcherT2 are
1139 /// required by PolymorphicMatcherWithParam2 but not actually
1140 /// used. They will always be instantiated with types convertible to
1141 /// Matcher<T>.
1142 template <typename T, typename MatcherT1, typename MatcherT2>
1143 class AnyOfMatcher : public MatcherInterface<T> {
1144 public:
1145 AnyOfMatcher(const Matcher<T> &InnerMatcher1, const Matcher<T> &InnerMatcher2)
1146 : InnerMatcher1(InnerMatcher1), InnerMatcher2(InnerMatcher2) {}
1147
1148 virtual bool matches(const T &Node,
1149 ASTMatchFinder *Finder,
1150 BoundNodesTreeBuilder *Builder) const {
1151 BoundNodesTreeBuilder Result = *Builder;
1152 if (InnerMatcher1.matches(Node, Finder, &Result)) {
1153 *Builder = Result;
1154 return true;
1155 }
1156 Result = *Builder;
1157 if (InnerMatcher2.matches(Node, Finder, &Result)) {
1158 *Builder = Result;
1159 return true;
1160 }
1161 return false;
1162 }
1163
1164 private:
1165 const Matcher<T> InnerMatcher1;
1166 const Matcher<T> InnerMatcher2;
1167 };
1168
1169 /// \brief Creates a Matcher<T> that matches if all inner matchers match.
1170 template<typename T>
1171 BindableMatcher<T> makeAllOfComposite(
1172 ArrayRef<const Matcher<T> *> InnerMatchers) {
1173 if (InnerMatchers.empty())
1174 return BindableMatcher<T>(new TrueMatcher<T>);
1175 MatcherInterface<T> *InnerMatcher = new TrueMatcher<T>;
1176 for (int i = InnerMatchers.size() - 1; i >= 0; --i) {
1177 InnerMatcher = new AllOfMatcher<T, Matcher<T>, Matcher<T> >(
1178 *InnerMatchers[i], makeMatcher(InnerMatcher));
1179 }
1180 return BindableMatcher<T>(InnerMatcher);
1181 }
1182
1183 /// \brief Creates a Matcher<T> that matches if
1184 /// T is dyn_cast'able into InnerT and all inner matchers match.
1185 ///
1186 /// Returns BindableMatcher, as matchers that use dyn_cast have
1187 /// the same object both to match on and to run submatchers on,
1188 /// so there is no ambiguity with what gets bound.
1189 template<typename T, typename InnerT>
1190 BindableMatcher<T> makeDynCastAllOfComposite(
1191 ArrayRef<const Matcher<InnerT> *> InnerMatchers) {
1192 return BindableMatcher<T>(new DynCastMatcher<T, InnerT>(
1193 makeAllOfComposite(InnerMatchers)));
1194 }
1195
1196 /// \brief Matches nodes of type T that have at least one descendant node of
1197 /// type DescendantT for which the given inner matcher matches.
1198 ///
1199 /// DescendantT must be an AST base type.
1200 template <typename T, typename DescendantT>
1201 class HasDescendantMatcher : public MatcherInterface<T> {
1202 TOOLING_COMPILE_ASSERT(IsBaseType<DescendantT>::value,
1203 has_descendant_only_accepts_base_type_matcher);
1204 public:
1205 explicit HasDescendantMatcher(const Matcher<DescendantT> &DescendantMatcher)
1206 : DescendantMatcher(DescendantMatcher) {}
1207
1208 virtual bool matches(const T &Node,
1209 ASTMatchFinder *Finder,
1210 BoundNodesTreeBuilder *Builder) const {
1211 return Finder->matchesDescendantOf(
1212 Node, DescendantMatcher, Builder, ASTMatchFinder::BK_First);
1213 }
1214
1215 private:
1216 const Matcher<DescendantT> DescendantMatcher;
1217 };
1218
1219 /// \brief Matches nodes of type \c T that have a parent node of type \c ParentT
1220 /// for which the given inner matcher matches.
1221 ///
1222 /// \c ParentT must be an AST base type.
1223 template <typename T, typename ParentT>
1224 class HasParentMatcher : public MatcherInterface<T> {
1225 TOOLING_COMPILE_ASSERT(IsBaseType<ParentT>::value,
1226 has_parent_only_accepts_base_type_matcher);
1227 public:
1228 explicit HasParentMatcher(const Matcher<ParentT> &ParentMatcher)
1229 : ParentMatcher(ParentMatcher) {}
1230
1231 virtual bool matches(const T &Node,
1232 ASTMatchFinder *Finder,
1233 BoundNodesTreeBuilder *Builder) const {
1234 return Finder->matchesAncestorOf(
1235 Node, ParentMatcher, Builder, ASTMatchFinder::AMM_ParentOnly);
1236 }
1237
1238 private:
1239 const Matcher<ParentT> ParentMatcher;
1240 };
1241
1242 /// \brief Matches nodes of type \c T that have at least one ancestor node of
1243 /// type \c AncestorT for which the given inner matcher matches.
1244 ///
1245 /// \c AncestorT must be an AST base type.
1246 template <typename T, typename AncestorT>
1247 class HasAncestorMatcher : public MatcherInterface<T> {
1248 TOOLING_COMPILE_ASSERT(IsBaseType<AncestorT>::value,
1249 has_ancestor_only_accepts_base_type_matcher);
1250 public:
1251 explicit HasAncestorMatcher(const Matcher<AncestorT> &AncestorMatcher)
1252 : AncestorMatcher(AncestorMatcher) {}
1253
1254 virtual bool matches(const T &Node,
1255 ASTMatchFinder *Finder,
1256 BoundNodesTreeBuilder *Builder) const {
1257 return Finder->matchesAncestorOf(
1258 Node, AncestorMatcher, Builder, ASTMatchFinder::AMM_All);
1259 }
1260
1261 private:
1262 const Matcher<AncestorT> AncestorMatcher;
1263 };
1264
1265 /// \brief Matches nodes of type T that have at least one descendant node of
1266 /// type DescendantT for which the given inner matcher matches.
1267 ///
1268 /// DescendantT must be an AST base type.
1269 /// As opposed to HasDescendantMatcher, ForEachDescendantMatcher will match
1270 /// for each descendant node that matches instead of only for the first.
1271 template <typename T, typename DescendantT>
1272 class ForEachDescendantMatcher : public MatcherInterface<T> {
1273 TOOLING_COMPILE_ASSERT(IsBaseType<DescendantT>::value,
1274 for_each_descendant_only_accepts_base_type_matcher);
1275 public:
1276 explicit ForEachDescendantMatcher(
1277 const Matcher<DescendantT>& DescendantMatcher)
1278 : DescendantMatcher(DescendantMatcher) {}
1279
1280 virtual bool matches(const T& Node,
1281 ASTMatchFinder* Finder,
1282 BoundNodesTreeBuilder* Builder) const {
1283 return Finder->matchesDescendantOf(Node, DescendantMatcher, Builder,
1284 ASTMatchFinder::BK_All);
1285 }
1286
1287 private:
1288 const Matcher<DescendantT> DescendantMatcher;
1289 };
1290
1291 /// \brief Matches on nodes that have a getValue() method if getValue() equals
1292 /// the value the ValueEqualsMatcher was constructed with.
1293 template <typename T, typename ValueT>
1294 class ValueEqualsMatcher : public SingleNodeMatcherInterface<T> {
1295 TOOLING_COMPILE_ASSERT((llvm::is_base_of<CharacterLiteral, T>::value ||
1296 llvm::is_base_of<CXXBoolLiteralExpr,
1297 T>::value ||
1298 llvm::is_base_of<FloatingLiteral, T>::value ||
1299 llvm::is_base_of<IntegerLiteral, T>::value),
1300 the_node_must_have_a_getValue_method);
1301 public:
1302 explicit ValueEqualsMatcher(const ValueT &ExpectedValue)
1303 : ExpectedValue(ExpectedValue) {}
1304
1305 virtual bool matchesNode(const T &Node) const {
1306 return Node.getValue() == ExpectedValue;
1307 }
1308
1309 private:
1310 const ValueT ExpectedValue;
1311 };
1312
1313 /// \brief A VariadicDynCastAllOfMatcher<SourceT, TargetT> object is a
1314 /// variadic functor that takes a number of Matcher<TargetT> and returns a
1315 /// Matcher<SourceT> that matches TargetT nodes that are matched by all of the
1316 /// given matchers, if SourceT can be dynamically casted into TargetT.
1317 ///
1318 /// For example:
1319 /// const VariadicDynCastAllOfMatcher<
1320 /// Decl, CXXRecordDecl> record;
1321 /// Creates a functor record(...) that creates a Matcher<Decl> given
1322 /// a variable number of arguments of type Matcher<CXXRecordDecl>.
1323 /// The returned matcher matches if the given Decl can by dynamically
1324 /// casted to CXXRecordDecl and all given matchers match.
1325 template <typename SourceT, typename TargetT>
1326 class VariadicDynCastAllOfMatcher
1327 : public llvm::VariadicFunction<
1328 BindableMatcher<SourceT>, Matcher<TargetT>,
1329 makeDynCastAllOfComposite<SourceT, TargetT> > {
1330 public:
1331 VariadicDynCastAllOfMatcher() {}
1332 };
1333
1334 /// \brief A \c VariadicAllOfMatcher<T> object is a variadic functor that takes
1335 /// a number of \c Matcher<T> and returns a \c Matcher<T> that matches \c T
1336 /// nodes that are matched by all of the given matchers.
1337 ///
1338 /// For example:
1339 /// const VariadicAllOfMatcher<NestedNameSpecifier> nestedNameSpecifier;
1340 /// Creates a functor nestedNameSpecifier(...) that creates a
1341 /// \c Matcher<NestedNameSpecifier> given a variable number of arguments of type
1342 /// \c Matcher<NestedNameSpecifier>.
1343 /// The returned matcher matches if all given matchers match.
1344 template <typename T>
1345 class VariadicAllOfMatcher : public llvm::VariadicFunction<
1346 BindableMatcher<T>, Matcher<T>,
1347 makeAllOfComposite<T> > {
1348 public:
1349 VariadicAllOfMatcher() {}
1350 };
1351
1352 /// \brief Matches nodes of type \c TLoc for which the inner
1353 /// \c Matcher<T> matches.
1354 template <typename TLoc, typename T>
1355 class LocMatcher : public MatcherInterface<TLoc> {
1356 public:
1357 explicit LocMatcher(const Matcher<T> &InnerMatcher)
1358 : InnerMatcher(InnerMatcher) {}
1359
1360 virtual bool matches(const TLoc &Node,
1361 ASTMatchFinder *Finder,
1362 BoundNodesTreeBuilder *Builder) const {
1363 if (!Node)
1364 return false;
1365 return InnerMatcher.matches(*extract(Node), Finder, Builder);
1366 }
1367
1368 private:
1369 const NestedNameSpecifier *extract(const NestedNameSpecifierLoc &Loc) const {
1370 return Loc.getNestedNameSpecifier();
1371 }
1372
1373 const Matcher<T> InnerMatcher;
1374 };
1375
1376 /// \brief Matches \c TypeLocs based on an inner matcher matching a certain
1377 /// \c QualType.
1378 ///
1379 /// Used to implement the \c loc() matcher.
1380 class TypeLocTypeMatcher : public MatcherInterface<TypeLoc> {
1381 public:
1382 explicit TypeLocTypeMatcher(const Matcher<QualType> &InnerMatcher)
1383 : InnerMatcher(InnerMatcher) {}
1384
1385 virtual bool matches(const TypeLoc &Node,
1386 ASTMatchFinder *Finder,
1387 BoundNodesTreeBuilder *Builder) const {
1388 if (!Node)
1389 return false;
1390 return InnerMatcher.matches(Node.getType(), Finder, Builder);
1391 }
1392
1393 private:
1394 const Matcher<QualType> InnerMatcher;
1395 };
1396
1397 /// \brief Matches nodes of type \c T for which the inner matcher matches on a
1398 /// another node of type \c T that can be reached using a given traverse
1399 /// function.
1400 template <typename T>
1401 class TypeTraverseMatcher : public MatcherInterface<T> {
1402 public:
1403 explicit TypeTraverseMatcher(const Matcher<QualType> &InnerMatcher,
1404 QualType (T::*TraverseFunction)() const)
1405 : InnerMatcher(InnerMatcher), TraverseFunction(TraverseFunction) {}
1406
1407 virtual bool matches(const T &Node,
1408 ASTMatchFinder *Finder,
1409 BoundNodesTreeBuilder *Builder) const {
1410 QualType NextNode = (Node.*TraverseFunction)();
1411 if (NextNode.isNull())
1412 return false;
1413 return InnerMatcher.matches(NextNode, Finder, Builder);
1414 }
1415
1416 private:
1417 const Matcher<QualType> InnerMatcher;
1418 QualType (T::*TraverseFunction)() const;
1419 };
1420
1421 /// \brief Matches nodes of type \c T in a ..Loc hierarchy, for which the inner
1422 /// matcher matches on a another node of type \c T that can be reached using a
1423 /// given traverse function.
1424 template <typename T>
1425 class TypeLocTraverseMatcher : public MatcherInterface<T> {
1426 public:
1427 explicit TypeLocTraverseMatcher(const Matcher<TypeLoc> &InnerMatcher,
1428 TypeLoc (T::*TraverseFunction)() const)
1429 : InnerMatcher(InnerMatcher), TraverseFunction(TraverseFunction) {}
1430
1431 virtual bool matches(const T &Node,
1432 ASTMatchFinder *Finder,
1433 BoundNodesTreeBuilder *Builder) const {
1434 TypeLoc NextNode = (Node.*TraverseFunction)();
1435 if (!NextNode)
1436 return false;
1437 return InnerMatcher.matches(NextNode, Finder, Builder);
1438 }
1439
1440 private:
1441 const Matcher<TypeLoc> InnerMatcher;
1442 TypeLoc (T::*TraverseFunction)() const;
1443 };
1444
1445 /// \brief Converts a \c Matcher<InnerT> to a \c Matcher<OuterT>, where
1446 /// \c OuterT is any type that is supported by \c Getter.
1447 ///
1448 /// \code Getter<OuterT>::value() \endcode returns a
1449 /// \code InnerTBase (OuterT::*)() \endcode, which is used to adapt a \c OuterT
1450 /// object into a \c InnerT
1451 template <typename InnerTBase,
1452 template <typename OuterT> class Getter,
1453 template <typename OuterT> class MatcherImpl,
1454 typename ReturnTypesF>
1455 class TypeTraversePolymorphicMatcher {
1456 private:
1457 typedef TypeTraversePolymorphicMatcher<InnerTBase, Getter, MatcherImpl,
1458 ReturnTypesF> Self;
1459 static Self create(ArrayRef<const Matcher<InnerTBase> *> InnerMatchers);
1460
1461 public:
1462 typedef typename ExtractFunctionArgMeta<ReturnTypesF>::type ReturnTypes;
1463
1464 explicit TypeTraversePolymorphicMatcher(
1465 ArrayRef<const Matcher<InnerTBase> *> InnerMatchers)
1466 : InnerMatcher(makeAllOfComposite(InnerMatchers)) {}
1467
1468 template <typename OuterT> operator Matcher<OuterT>() const {
1469 return Matcher<OuterT>(
1470 new MatcherImpl<OuterT>(InnerMatcher, Getter<OuterT>::value()));
1471 }
1472
1473 struct Func : public llvm::VariadicFunction<Self, Matcher<InnerTBase>,
1474 &Self::create> {
1475 Func() {}
1476 };
1477
1478 private:
1479 const Matcher<InnerTBase> InnerMatcher;
1480 };
1481
1482 // Define the create() method out of line to silence a GCC warning about
1483 // the struct "Func" having greater visibility than its base, which comes from
1484 // using the flag -fvisibility-inlines-hidden.
1485 template <typename InnerTBase, template <typename OuterT> class Getter,
1486 template <typename OuterT> class MatcherImpl, typename ReturnTypesF>
1487 TypeTraversePolymorphicMatcher<InnerTBase, Getter, MatcherImpl, ReturnTypesF>
1488 TypeTraversePolymorphicMatcher<
1489 InnerTBase, Getter, MatcherImpl,
1490 ReturnTypesF>::create(ArrayRef<const Matcher<InnerTBase> *> InnerMatchers) {
1491 return Self(InnerMatchers);
1492 }
1493
1494 } // end namespace internal
1495 } // end namespace ast_matchers
1496 } // end namespace clang
1497
1498 #endif // LLVM_CLANG_AST_MATCHERS_AST_MATCHERS_INTERNAL_H
1499