clang 23.0.0git
ASTMatchersInternal.cpp
Go to the documentation of this file.
1//===- ASTMatchersInternal.cpp - Structural query framework ---------------===//
2//
3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6//
7//===----------------------------------------------------------------------===//
8//
9// Implements the base layer of the matcher framework.
10//
11//===----------------------------------------------------------------------===//
12
16#include "clang/AST/Decl.h"
22#include "clang/Basic/LLVM.h"
23#include "clang/Lex/Lexer.h"
24#include "llvm/ADT/ArrayRef.h"
25#include "llvm/ADT/DenseSet.h"
26#include "llvm/ADT/IntrusiveRefCntPtr.h"
27#include "llvm/ADT/SmallString.h"
28#include "llvm/ADT/SmallVector.h"
29#include "llvm/ADT/StringRef.h"
30#include "llvm/Support/ErrorHandling.h"
31#include "llvm/Support/Regex.h"
32#include "llvm/Support/WithColor.h"
33#include "llvm/Support/raw_ostream.h"
34#include <cassert>
35#include <cstddef>
36#include <optional>
37#include <string>
38#include <utility>
39#include <vector>
40
41namespace clang {
42namespace ast_matchers {
43
44AST_MATCHER_P(ObjCMessageExpr, hasAnySelectorMatcher, std::vector<std::string>,
45 Matches) {
46 return llvm::is_contained(Matches, Node.getSelector().getAsString());
47}
48
49namespace internal {
50
51static bool notUnaryOperator(const DynTypedNode &DynNode,
52 ASTMatchFinder *Finder,
53 BoundNodesTreeBuilder *Builder,
54 ArrayRef<DynTypedMatcher> InnerMatchers);
55
56static bool allOfVariadicOperator(const DynTypedNode &DynNode,
57 ASTMatchFinder *Finder,
58 BoundNodesTreeBuilder *Builder,
59 ArrayRef<DynTypedMatcher> InnerMatchers);
60
61static bool eachOfVariadicOperator(const DynTypedNode &DynNode,
62 ASTMatchFinder *Finder,
63 BoundNodesTreeBuilder *Builder,
64 ArrayRef<DynTypedMatcher> InnerMatchers);
65
66static bool anyOfVariadicOperator(const DynTypedNode &DynNode,
67 ASTMatchFinder *Finder,
68 BoundNodesTreeBuilder *Builder,
69 ArrayRef<DynTypedMatcher> InnerMatchers);
70
71static bool optionallyVariadicOperator(const DynTypedNode &DynNode,
72 ASTMatchFinder *Finder,
73 BoundNodesTreeBuilder *Builder,
74 ArrayRef<DynTypedMatcher> InnerMatchers);
75
77 const Matcher<CXXBaseSpecifier> &BaseSpecMatcher,
78 ASTMatchFinder *Finder, BoundNodesTreeBuilder *Builder) {
79 if (!Node.hasDefinition())
80 return false;
81
82 CXXBasePaths Paths;
83 Paths.setOrigin(&Node);
84
85 const auto basePredicate =
86 [Finder, Builder, &BaseSpecMatcher](const CXXBaseSpecifier *BaseSpec,
87 CXXBasePath &IgnoredParam) {
88 BoundNodesTreeBuilder Result(*Builder);
89 if (BaseSpecMatcher.matches(*BaseSpec, Finder, &Result)) {
90 *Builder = std::move(Result);
91 return true;
92 }
93 return false;
94 };
95
96 return Node.lookupInBases(basePredicate, Paths,
97 /*LookupInDependent =*/true);
98}
99
100void BoundNodesTreeBuilder::visitMatches(Visitor *ResultVisitor) {
101 if (Bindings.empty())
102 Bindings.push_back(BoundNodesMap());
103 for (BoundNodesMap &Binding : Bindings) {
104 ResultVisitor->visitMatch(BoundNodes(Binding));
105 }
106}
107
108namespace {
109
110using VariadicOperatorFunction = bool (*)(
111 const DynTypedNode &DynNode, ASTMatchFinder *Finder,
112 BoundNodesTreeBuilder *Builder, ArrayRef<DynTypedMatcher> InnerMatchers);
113
114template <VariadicOperatorFunction Func>
115class VariadicMatcher : public DynMatcherInterface {
116public:
117 VariadicMatcher(std::vector<DynTypedMatcher> InnerMatchers)
118 : InnerMatchers(std::move(InnerMatchers)) {}
119
120 bool dynMatches(const DynTypedNode &DynNode, ASTMatchFinder *Finder,
121 BoundNodesTreeBuilder *Builder) const override {
122 return Func(DynNode, Finder, Builder, InnerMatchers);
123 }
124
125private:
126 std::vector<DynTypedMatcher> InnerMatchers;
127};
128
129class IdDynMatcher : public DynMatcherInterface {
130public:
131 IdDynMatcher(StringRef ID,
132 IntrusiveRefCntPtr<DynMatcherInterface> InnerMatcher)
133 : ID(ID), InnerMatcher(std::move(InnerMatcher)) {}
134
135 bool dynMatches(const DynTypedNode &DynNode, ASTMatchFinder *Finder,
136 BoundNodesTreeBuilder *Builder) const override {
137 bool Result = InnerMatcher->dynMatches(DynNode, Finder, Builder);
138 if (Result) Builder->setBinding(ID, DynNode);
139 return Result;
140 }
141
142 std::optional<clang::TraversalKind> TraversalKind() const override {
143 return InnerMatcher->TraversalKind();
144 }
145
146private:
147 const std::string ID;
148 const IntrusiveRefCntPtr<DynMatcherInterface> InnerMatcher;
149};
150
151/// A matcher that always returns true.
152class TrueMatcherImpl : public DynMatcherInterface {
153public:
154 TrueMatcherImpl() = default;
155
156 bool dynMatches(const DynTypedNode &, ASTMatchFinder *,
157 BoundNodesTreeBuilder *) const override {
158 return true;
159 }
160};
161
162/// A matcher that specifies a particular \c TraversalKind.
163///
164/// The kind provided to the constructor overrides any kind that may be
165/// specified by the `InnerMatcher`.
166class DynTraversalMatcherImpl : public DynMatcherInterface {
167public:
168 explicit DynTraversalMatcherImpl(
170 IntrusiveRefCntPtr<DynMatcherInterface> InnerMatcher)
171 : TK(TK), InnerMatcher(std::move(InnerMatcher)) {}
172
173 bool dynMatches(const DynTypedNode &DynNode, ASTMatchFinder *Finder,
174 BoundNodesTreeBuilder *Builder) const override {
175 return this->InnerMatcher->dynMatches(DynNode, Finder, Builder);
176 }
177
178 std::optional<clang::TraversalKind> TraversalKind() const override {
179 return TK;
180 }
181
182private:
184 IntrusiveRefCntPtr<DynMatcherInterface> InnerMatcher;
185};
186
187} // namespace
188
189bool ASTMatchFinder::isTraversalIgnoringImplicitNodes() const {
190 return getASTContext().getParentMapContext().getTraversalKind() ==
192}
193
194DynTypedMatcher
195DynTypedMatcher::constructVariadic(DynTypedMatcher::VariadicOperator Op,
196 ASTNodeKind SupportedKind,
197 std::vector<DynTypedMatcher> InnerMatchers) {
198 assert(!InnerMatchers.empty() && "Array must not be empty.");
199 assert(llvm::all_of(InnerMatchers,
200 [SupportedKind](const DynTypedMatcher &M) {
201 return M.canConvertTo(SupportedKind);
202 }) &&
203 "InnerMatchers must be convertible to SupportedKind!");
204
205 // We must relax the restrict kind here.
206 // The different operators might deal differently with a mismatch.
207 // Make it the same as SupportedKind, since that is the broadest type we are
208 // allowed to accept.
209 auto RestrictKind = SupportedKind;
210
211 switch (Op) {
212 case VO_AllOf:
213 // In the case of allOf() we must pass all the checks, so making
214 // RestrictKind the most restrictive can save us time. This way we reject
215 // invalid types earlier and we can elide the kind checks inside the
216 // matcher.
217 for (auto &IM : InnerMatchers) {
218 RestrictKind =
219 ASTNodeKind::getMostDerivedType(RestrictKind, IM.RestrictKind);
220 }
221 return DynTypedMatcher(
222 SupportedKind, RestrictKind,
223 new VariadicMatcher<allOfVariadicOperator>(std::move(InnerMatchers)));
224
225 case VO_AnyOf:
226 return DynTypedMatcher(
227 SupportedKind, RestrictKind,
228 new VariadicMatcher<anyOfVariadicOperator>(std::move(InnerMatchers)));
229
230 case VO_EachOf:
231 return DynTypedMatcher(
232 SupportedKind, RestrictKind,
233 new VariadicMatcher<eachOfVariadicOperator>(std::move(InnerMatchers)));
234
235 case VO_Optionally:
236 return DynTypedMatcher(SupportedKind, RestrictKind,
237 new VariadicMatcher<optionallyVariadicOperator>(
238 std::move(InnerMatchers)));
239
240 case VO_UnaryNot:
241 // FIXME: Implement the Not operator to take a single matcher instead of a
242 // vector.
243 return DynTypedMatcher(
244 SupportedKind, RestrictKind,
245 new VariadicMatcher<notUnaryOperator>(std::move(InnerMatchers)));
246 }
247 llvm_unreachable("Invalid Op value.");
248}
249
250DynTypedMatcher
251DynTypedMatcher::constructRestrictedWrapper(const DynTypedMatcher &InnerMatcher,
252 ASTNodeKind RestrictKind) {
253 DynTypedMatcher Copy = InnerMatcher;
254 Copy.RestrictKind = RestrictKind;
255 return Copy;
256}
257
258DynTypedMatcher DynTypedMatcher::withTraversalKind(TraversalKind TK) {
259 auto Copy = *this;
260 Copy.Implementation =
261 new DynTraversalMatcherImpl(TK, std::move(Copy.Implementation));
262 return Copy;
263}
264
265DynTypedMatcher DynTypedMatcher::trueMatcher(ASTNodeKind NodeKind) {
266 // We only ever need one instance of TrueMatcherImpl, so we create a static
267 // instance and reuse it to reduce the overhead of the matcher and increase
268 // the chance of cache hits.
269 static const llvm::IntrusiveRefCntPtr<TrueMatcherImpl> Instance =
270 new TrueMatcherImpl();
271 return DynTypedMatcher(NodeKind, NodeKind, Instance);
272}
273
274bool DynTypedMatcher::canMatchNodesOfKind(ASTNodeKind Kind) const {
275 return RestrictKind.isBaseOf(Kind);
276}
277
278DynTypedMatcher DynTypedMatcher::dynCastTo(const ASTNodeKind Kind) const {
279 auto Copy = *this;
280 Copy.SupportedKind = Kind;
281 Copy.RestrictKind = ASTNodeKind::getMostDerivedType(Kind, RestrictKind);
282 return Copy;
283}
284
285bool DynTypedMatcher::matches(const DynTypedNode &DynNode,
286 ASTMatchFinder *Finder,
287 BoundNodesTreeBuilder *Builder) const {
288 TraversalKindScope RAII(Finder->getASTContext(),
289 Implementation->TraversalKind());
290
291 if (Finder->isTraversalIgnoringImplicitNodes() &&
292 Finder->IsMatchingInASTNodeNotSpelledInSource())
293 return false;
294
295 if (!Finder->isTraversalIgnoringImplicitNodes() &&
296 Finder->IsMatchingInASTNodeNotAsIs())
297 return false;
298
299 auto N =
300 Finder->getASTContext().getParentMapContext().traverseIgnored(DynNode);
301
302 if (RestrictKind.isBaseOf(N.getNodeKind()) &&
303 Implementation->dynMatches(N, Finder, Builder)) {
304 return true;
305 }
306 // Delete all bindings when a matcher does not match.
307 // This prevents unexpected exposure of bound nodes in unmatches
308 // branches of the match tree.
309 Builder->removeBindings([](const BoundNodesMap &) { return true; });
310 return false;
311}
312
313bool DynTypedMatcher::matchesNoKindCheck(const DynTypedNode &DynNode,
314 ASTMatchFinder *Finder,
315 BoundNodesTreeBuilder *Builder) const {
316 TraversalKindScope raii(Finder->getASTContext(),
317 Implementation->TraversalKind());
318
319 if (Finder->isTraversalIgnoringImplicitNodes() &&
320 Finder->IsMatchingInASTNodeNotSpelledInSource())
321 return false;
322
323 if (!Finder->isTraversalIgnoringImplicitNodes() &&
324 Finder->IsMatchingInASTNodeNotAsIs())
325 return false;
326
327 auto N =
328 Finder->getASTContext().getParentMapContext().traverseIgnored(DynNode);
329
330 assert(RestrictKind.isBaseOf(N.getNodeKind()));
331 if (Implementation->dynMatches(N, Finder, Builder)) {
332 return true;
333 }
334 // Delete all bindings when a matcher does not match.
335 // This prevents unexpected exposure of bound nodes in unmatches
336 // branches of the match tree.
337 Builder->removeBindings([](const BoundNodesMap &) { return true; });
338 return false;
339}
340
341std::optional<DynTypedMatcher> DynTypedMatcher::tryBind(StringRef ID) const {
342 if (!AllowBind)
343 return std::nullopt;
344 auto Result = *this;
345 Result.Implementation =
346 new IdDynMatcher(ID, std::move(Result.Implementation));
347 return std::move(Result);
348}
349
350bool DynTypedMatcher::canConvertTo(ASTNodeKind To) const {
351 const auto From = getSupportedKind();
353 auto TypeKind = ASTNodeKind::getFromNodeKind<Type>();
354 /// Mimic the implicit conversions of Matcher<>.
355 /// - From Matcher<Type> to Matcher<QualType>
356 if (From.isSame(TypeKind) && To.isSame(QualKind)) return true;
357 /// - From Matcher<Base> to Matcher<Derived>
358 return From.isBaseOf(To);
359}
360
361void BoundNodesTreeBuilder::addMatch(const BoundNodesTreeBuilder &Other) {
362 Bindings.append(Other.Bindings.begin(), Other.Bindings.end());
363}
364
365static bool notUnaryOperator(const DynTypedNode &DynNode,
366 ASTMatchFinder *Finder,
367 BoundNodesTreeBuilder *Builder,
368 ArrayRef<DynTypedMatcher> InnerMatchers) {
369 if (InnerMatchers.size() != 1)
370 return false;
371
372 // The 'unless' matcher will always discard the result:
373 // If the inner matcher doesn't match, unless returns true,
374 // but the inner matcher cannot have bound anything.
375 // If the inner matcher matches, the result is false, and
376 // any possible binding will be discarded.
377 // We still need to hand in all the bound nodes up to this
378 // point so the inner matcher can depend on bound nodes,
379 // and we need to actively discard the bound nodes, otherwise
380 // the inner matcher will reset the bound nodes if it doesn't
381 // match, but this would be inversed by 'unless'.
382 BoundNodesTreeBuilder Discard(*Builder);
383 return !InnerMatchers[0].matches(DynNode, Finder, &Discard);
384}
385
386static bool allOfVariadicOperator(const DynTypedNode &DynNode,
387 ASTMatchFinder *Finder,
388 BoundNodesTreeBuilder *Builder,
389 ArrayRef<DynTypedMatcher> InnerMatchers) {
390 // allOf leads to one matcher for each alternative in the first
391 // matcher combined with each alternative in the second matcher.
392 // Thus, we can reuse the same Builder.
393 return llvm::all_of(InnerMatchers, [&](const DynTypedMatcher &InnerMatcher) {
394 return InnerMatcher.matchesNoKindCheck(DynNode, Finder, Builder);
395 });
396}
397
398static bool eachOfVariadicOperator(const DynTypedNode &DynNode,
399 ASTMatchFinder *Finder,
400 BoundNodesTreeBuilder *Builder,
401 ArrayRef<DynTypedMatcher> InnerMatchers) {
402 BoundNodesTreeBuilder Result;
403 bool Matched = false;
404 for (const DynTypedMatcher &InnerMatcher : InnerMatchers) {
405 BoundNodesTreeBuilder BuilderInner(*Builder);
406 if (InnerMatcher.matches(DynNode, Finder, &BuilderInner)) {
407 Matched = true;
408 Result.addMatch(BuilderInner);
409 }
410 }
411 *Builder = std::move(Result);
412 return Matched;
413}
414
415static bool anyOfVariadicOperator(const DynTypedNode &DynNode,
416 ASTMatchFinder *Finder,
417 BoundNodesTreeBuilder *Builder,
418 ArrayRef<DynTypedMatcher> InnerMatchers) {
419 for (const DynTypedMatcher &InnerMatcher : InnerMatchers) {
420 BoundNodesTreeBuilder Result = *Builder;
421 if (InnerMatcher.matches(DynNode, Finder, &Result)) {
422 *Builder = std::move(Result);
423 return true;
424 }
425 }
426 return false;
427}
428
429static bool
430optionallyVariadicOperator(const DynTypedNode &DynNode, ASTMatchFinder *Finder,
431 BoundNodesTreeBuilder *Builder,
432 ArrayRef<DynTypedMatcher> InnerMatchers) {
433 if (InnerMatchers.size() != 1)
434 return false;
435
436 BoundNodesTreeBuilder Result(*Builder);
437 if (InnerMatchers[0].matches(DynNode, Finder, &Result))
438 *Builder = std::move(Result);
439 return true;
440}
441
442inline static
443std::vector<std::string> vectorFromRefs(ArrayRef<const StringRef *> NameRefs) {
444 std::vector<std::string> Names;
445 Names.reserve(NameRefs.size());
446 for (auto *Name : NameRefs)
447 Names.emplace_back(*Name);
448 return Names;
449}
450
451Matcher<NamedDecl> hasAnyNameFunc(ArrayRef<const StringRef *> NameRefs) {
452 return internal::Matcher<NamedDecl>(
453 new internal::HasNameMatcher(vectorFromRefs(NameRefs)));
454}
455
456Matcher<ObjCMessageExpr> hasAnySelectorFunc(
458 return hasAnySelectorMatcher(vectorFromRefs(NameRefs));
459}
460
462 return HasOpNameMatcher(vectorFromRefs(NameRefs));
463}
464
465HasOverloadOpNameMatcher
467 return HasOverloadOpNameMatcher(vectorFromRefs(NameRefs));
468}
469
470HasNameMatcher::HasNameMatcher(std::vector<std::string> N)
471 : UseUnqualifiedMatch(
472 llvm::all_of(N, [](StringRef Name) { return !Name.contains("::"); })),
473 Names(std::move(N)) {
474#ifndef NDEBUG
475 for (StringRef Name : Names)
476 assert(!Name.empty());
477#endif
478}
479
480static bool consumeNameSuffix(StringRef &FullName, StringRef Suffix) {
481 StringRef Name = FullName;
482 if (!Name.ends_with(Suffix))
483 return false;
484 Name = Name.drop_back(Suffix.size());
485 if (!Name.empty()) {
486 if (!Name.ends_with("::"))
487 return false;
488 Name = Name.drop_back(2);
489 }
490 FullName = Name;
491 return true;
492}
493
494static StringRef getNodeName(const NamedDecl &Node,
495 llvm::SmallString<128> &Scratch) {
496 // Simple name.
497 if (Node.getIdentifier())
498 return Node.getName();
499
500 if (Node.getDeclName()) {
501 // Name needs to be constructed.
502 Scratch.clear();
503 llvm::raw_svector_ostream OS(Scratch);
504 Node.printName(OS);
505 return OS.str();
506 }
507
508 return "(anonymous)";
509}
510
511static StringRef getNodeName(const RecordDecl &Node,
512 llvm::SmallString<128> &Scratch) {
513 if (Node.getIdentifier()) {
514 return Node.getName();
515 }
516 Scratch.clear();
517
518 llvm::raw_svector_ostream OS(Scratch);
519
521 Copy.AnonymousTagNameStyle =
522 llvm::to_underlying(PrintingPolicy::AnonymousTagMode::Plain);
523 Node.printName(OS, Copy);
524
525 return OS.str();
526}
527
528static StringRef getNodeName(const NamespaceDecl &Node,
529 llvm::SmallString<128> &Scratch) {
530 return Node.isAnonymousNamespace() ? "(anonymous namespace)" : Node.getName();
531}
532
533namespace {
534
535class PatternSet {
536public:
537 PatternSet(ArrayRef<std::string> Names) {
538 Patterns.reserve(Names.size());
539 for (StringRef Name : Names)
540 Patterns.push_back({Name, Name.starts_with("::")});
541 }
542
543 /// Consumes the name suffix from each pattern in the set and removes the ones
544 /// that didn't match.
545 /// Return true if there are still any patterns left.
546 bool consumeNameSuffix(StringRef NodeName, bool CanSkip) {
547 if (CanSkip) {
548 // If we can skip the node, then we need to handle the case where a
549 // skipped node has the same name as its parent.
550 // namespace a { inline namespace a { class A; } }
551 // cxxRecordDecl(hasName("::a::A"))
552 // To do this, any patterns that match should be duplicated in our set,
553 // one of them with the tail removed.
554 for (size_t I = 0, E = Patterns.size(); I != E; ++I) {
555 StringRef Pattern = Patterns[I].P;
556 if (ast_matchers::internal::consumeNameSuffix(Patterns[I].P, NodeName))
557 Patterns.push_back({Pattern, Patterns[I].IsFullyQualified});
558 }
559 } else {
560 llvm::erase_if(Patterns, [&NodeName](auto &Pattern) {
562 NodeName);
563 });
564 }
565 return !Patterns.empty();
566 }
567
568 /// Check if any of the patterns are a match.
569 /// A match will be a pattern that was fully consumed, that also matches the
570 /// 'fully qualified' requirement.
571 bool foundMatch(bool AllowFullyQualified) const {
572 return llvm::any_of(Patterns, [&](const Pattern &Pattern) {
573 return Pattern.P.empty() &&
574 (AllowFullyQualified || !Pattern.IsFullyQualified);
575 });
576 }
577
578private:
579 struct Pattern {
580 StringRef P;
581 bool IsFullyQualified;
582 };
583
584 llvm::SmallVector<Pattern, 8> Patterns;
585};
586
587} // namespace
588
589bool HasNameMatcher::matchesNodeUnqualified(const NamedDecl &Node) const {
590 assert(UseUnqualifiedMatch);
591 llvm::SmallString<128> Scratch;
592 StringRef NodeName = getNodeName(Node, Scratch);
593 return llvm::any_of(Names, [&](StringRef Name) {
594 return consumeNameSuffix(Name, NodeName) && Name.empty();
595 });
596}
597
598bool HasNameMatcher::matchesNodeFullFast(const NamedDecl &Node) const {
599 PatternSet Patterns(Names);
600 llvm::SmallString<128> Scratch;
601
602 // This function is copied and adapted from NamedDecl::printQualifiedName()
603 // By matching each part individually we optimize in a couple of ways:
604 // - We can exit early on the first failure.
605 // - We can skip inline/anonymous namespaces without another pass.
606 // - We print one name at a time, reducing the chance of overflowing the
607 // inlined space of the SmallString.
608
609 // First, match the name.
610 if (!Patterns.consumeNameSuffix(getNodeName(Node, Scratch),
611 /*CanSkip=*/false))
612 return false;
613
614 // Try to match each declaration context.
615 // We are allowed to skip anonymous and inline namespaces if they don't match.
616 const DeclContext *Ctx = Node.getDeclContext();
617
618 if (Ctx->isFunctionOrMethod())
619 return Patterns.foundMatch(/*AllowFullyQualified=*/false);
620
621 for (; Ctx; Ctx = Ctx->getParent()) {
622 // Linkage Spec can just be ignored
623 // FIXME: Any other DeclContext kinds that can be safely disregarded
624 if (isa<LinkageSpecDecl>(Ctx))
625 continue;
626 if (!isa<NamedDecl>(Ctx))
627 break;
628 if (Patterns.foundMatch(/*AllowFullyQualified=*/false))
629 return true;
630
631 if (const auto *ND = dyn_cast<NamespaceDecl>(Ctx)) {
632 // If it matches (or we can skip it), continue.
633 if (Patterns.consumeNameSuffix(getNodeName(*ND, Scratch),
634 /*CanSkip=*/ND->isAnonymousNamespace() ||
635 ND->isInline()))
636 continue;
637 return false;
638 }
639 if (const auto *RD = dyn_cast<RecordDecl>(Ctx)) {
641 if (Patterns.consumeNameSuffix(getNodeName(*RD, Scratch),
642 /*CanSkip=*/false))
643 continue;
644
645 return false;
646 }
647 }
648
649 // We don't know how to deal with this DeclContext.
650 // Fallback to the slow version of the code.
651 return matchesNodeFullSlow(Node);
652 }
653
654 return Patterns.foundMatch(/*AllowFullyQualified=*/true);
655}
656
657bool HasNameMatcher::matchesNodeFullSlow(const NamedDecl &Node) const {
658 const bool SkipUnwrittenCases[] = {false, true};
659 for (bool SkipUnwritten : SkipUnwrittenCases) {
660 llvm::SmallString<128> NodeName = StringRef("::");
661 llvm::raw_svector_ostream OS(NodeName);
662
663 PrintingPolicy Policy = Node.getASTContext().getPrintingPolicy();
664 Policy.SuppressUnwrittenScope = SkipUnwritten;
665 Policy.SuppressInlineNamespace = llvm::to_underlying(
668 Node.printQualifiedName(OS, Policy);
669
670 const StringRef FullName = OS.str();
671
672 for (const StringRef Pattern : Names) {
673 if (Pattern.starts_with("::")) {
674 if (FullName == Pattern)
675 return true;
676 } else if (FullName.ends_with(Pattern) &&
677 FullName.drop_back(Pattern.size()).ends_with("::")) {
678 return true;
679 }
680 }
681 }
682
683 return false;
684}
685
686bool HasNameMatcher::matchesNode(const NamedDecl &Node) const {
687 assert(matchesNodeFullFast(Node) == matchesNodeFullSlow(Node));
688 if (UseUnqualifiedMatch) {
689 assert(matchesNodeUnqualified(Node) == matchesNodeFullFast(Node));
690 return matchesNodeUnqualified(Node);
691 }
692 return matchesNodeFullFast(Node);
693}
694
695// Checks whether \p Loc points to a token with source text of \p TokenText.
696static bool isTokenAtLoc(const SourceManager &SM, const LangOptions &LangOpts,
697 StringRef Text, SourceLocation Loc) {
699 bool Invalid = false;
700 // Since `Loc` may point into an expansion buffer, which has no corresponding
701 // source, we need to look at the spelling location to read the actual source.
702 StringRef TokenText = Lexer::getSpelling(SM.getSpellingLoc(Loc), Buffer, SM,
703 LangOpts, &Invalid);
704 return !Invalid && Text == TokenText;
705}
706
707static std::optional<SourceLocation> getExpansionLocOfMacroRecursive(
708 StringRef MacroName, SourceLocation Loc, const ASTContext &Context,
709 llvm::DenseSet<SourceLocation> &CheckedLocations) {
710 auto &SM = Context.getSourceManager();
711 const LangOptions &LangOpts = Context.getLangOpts();
712 while (Loc.isMacroID()) {
713 if (CheckedLocations.count(Loc))
714 return std::nullopt;
715 CheckedLocations.insert(Loc);
716 SrcMgr::ExpansionInfo Expansion =
717 SM.getSLocEntry(SM.getFileID(Loc)).getExpansion();
718 if (Expansion.isMacroArgExpansion()) {
719 // Check macro argument for an expansion of the given macro. For example,
720 // `F(G(3))`, where `MacroName` is `G`.
721 if (std::optional<SourceLocation> ArgLoc =
723 Expansion.getSpellingLoc(),
724 Context, CheckedLocations)) {
725 return ArgLoc;
726 }
727 }
728 Loc = Expansion.getExpansionLocStart();
729 if (isTokenAtLoc(SM, LangOpts, MacroName, Loc))
730 return Loc;
731 }
732 return std::nullopt;
733}
734
735std::optional<SourceLocation>
736getExpansionLocOfMacro(StringRef MacroName, SourceLocation Loc,
737 const ASTContext &Context) {
738 llvm::DenseSet<SourceLocation> CheckedLocations;
739 return getExpansionLocOfMacroRecursive(MacroName, Loc, Context,
740 CheckedLocations);
741}
742
743std::shared_ptr<llvm::Regex> createAndVerifyRegex(StringRef Regex,
744 llvm::Regex::RegexFlags Flags,
745 StringRef MatcherID) {
746 assert(!Regex.empty() && "Empty regex string");
747 auto SharedRegex = std::make_shared<llvm::Regex>(Regex, Flags);
748 std::string Error;
749 if (!SharedRegex->isValid(Error)) {
750 llvm::WithColor::error()
751 << "building matcher '" << MatcherID << "': " << Error << "\n";
752 llvm::WithColor::note() << " input was '" << Regex << "'\n";
753 }
754 return SharedRegex;
755}
756} // end namespace internal
757
758const internal::VariadicDynCastAllOfMatcher<Stmt, ObjCAutoreleasePoolStmt>
760const internal::VariadicDynCastAllOfMatcher<Decl, TranslationUnitDecl>
762const internal::VariadicDynCastAllOfMatcher<Decl, TypedefDecl> typedefDecl;
763const internal::VariadicDynCastAllOfMatcher<Decl, TypedefNameDecl>
765const internal::VariadicDynCastAllOfMatcher<Decl, TypeAliasDecl> typeAliasDecl;
766const internal::VariadicDynCastAllOfMatcher<Decl, UsingShadowDecl>
768const internal::VariadicDynCastAllOfMatcher<Decl, TypeAliasTemplateDecl>
770const internal::VariadicAllOfMatcher<Decl> decl;
771const internal::VariadicDynCastAllOfMatcher<Decl, DecompositionDecl> decompositionDecl;
772const internal::VariadicDynCastAllOfMatcher<Decl, BindingDecl> bindingDecl;
773const internal::VariadicDynCastAllOfMatcher<Decl, LinkageSpecDecl>
775const internal::VariadicDynCastAllOfMatcher<Decl, NamedDecl> namedDecl;
776const internal::VariadicDynCastAllOfMatcher<Decl, LabelDecl> labelDecl;
777const internal::VariadicDynCastAllOfMatcher<Decl, NamespaceDecl> namespaceDecl;
778const internal::VariadicDynCastAllOfMatcher<Decl, NamespaceAliasDecl>
780const internal::VariadicDynCastAllOfMatcher<Decl, RecordDecl> recordDecl;
781const internal::VariadicDynCastAllOfMatcher<Decl, CXXRecordDecl> cxxRecordDecl;
782const internal::VariadicDynCastAllOfMatcher<Decl, ClassTemplateDecl>
784const internal::VariadicDynCastAllOfMatcher<Decl,
787const internal::VariadicDynCastAllOfMatcher<
790const internal::VariadicDynCastAllOfMatcher<Decl, DeclaratorDecl>
792const internal::VariadicDynCastAllOfMatcher<Decl, ParmVarDecl> parmVarDecl;
793const internal::VariadicDynCastAllOfMatcher<Decl, AccessSpecDecl>
795const internal::VariadicAllOfMatcher<CXXBaseSpecifier> cxxBaseSpecifier;
796const internal::VariadicAllOfMatcher<CXXCtorInitializer> cxxCtorInitializer;
797const internal::VariadicAllOfMatcher<TemplateArgument> templateArgument;
798const internal::VariadicAllOfMatcher<TemplateArgumentLoc> templateArgumentLoc;
799const internal::VariadicAllOfMatcher<TemplateName> templateName;
800const internal::VariadicDynCastAllOfMatcher<Decl, NonTypeTemplateParmDecl>
802const internal::VariadicDynCastAllOfMatcher<Decl, TemplateTypeParmDecl>
804const internal::VariadicDynCastAllOfMatcher<Decl, TemplateTemplateParmDecl>
806
807const internal::VariadicAllOfMatcher<LambdaCapture> lambdaCapture;
808const internal::VariadicAllOfMatcher<QualType> qualType;
809const internal::VariadicAllOfMatcher<Type> type;
810const internal::VariadicAllOfMatcher<TypeLoc> typeLoc;
811
812const internal::VariadicDynCastAllOfMatcher<TypeLoc, QualifiedTypeLoc>
814const internal::VariadicDynCastAllOfMatcher<TypeLoc, PointerTypeLoc>
816const internal::VariadicDynCastAllOfMatcher<TypeLoc, ReferenceTypeLoc>
818const internal::VariadicDynCastAllOfMatcher<TypeLoc, ArrayTypeLoc> arrayTypeLoc;
819const internal::VariadicDynCastAllOfMatcher<TypeLoc, FunctionTypeLoc>
821const internal::VariadicDynCastAllOfMatcher<TypeLoc,
824
825const internal::VariadicDynCastAllOfMatcher<Stmt, UnaryExprOrTypeTraitExpr>
827const internal::VariadicDynCastAllOfMatcher<Decl, ExportDecl> exportDecl;
828const internal::VariadicDynCastAllOfMatcher<Decl, ValueDecl> valueDecl;
829const internal::VariadicDynCastAllOfMatcher<Decl, CXXConstructorDecl>
831const internal::VariadicDynCastAllOfMatcher<Decl, CXXDestructorDecl>
833const internal::VariadicDynCastAllOfMatcher<Decl, EnumDecl> enumDecl;
834const internal::VariadicDynCastAllOfMatcher<Decl, EnumConstantDecl>
836const internal::VariadicDynCastAllOfMatcher<Decl, TagDecl> tagDecl;
837const internal::VariadicDynCastAllOfMatcher<Decl, CXXMethodDecl> cxxMethodDecl;
838const internal::VariadicDynCastAllOfMatcher<Decl, CXXConversionDecl>
840const internal::VariadicDynCastAllOfMatcher<Decl, ConceptDecl> conceptDecl;
841const internal::VariadicDynCastAllOfMatcher<Expr, RequiresExpr> requiresExpr;
842const internal::VariadicDynCastAllOfMatcher<Decl, RequiresExprBodyDecl>
844const internal::VariadicDynCastAllOfMatcher<Decl, VarDecl> varDecl;
845const internal::VariadicDynCastAllOfMatcher<Decl, FieldDecl> fieldDecl;
846const internal::VariadicDynCastAllOfMatcher<Decl, IndirectFieldDecl>
848const internal::VariadicDynCastAllOfMatcher<Decl, FunctionDecl> functionDecl;
849const internal::VariadicDynCastAllOfMatcher<Decl, FunctionTemplateDecl>
851const internal::VariadicDynCastAllOfMatcher<Decl, FriendDecl> friendDecl;
852const internal::VariadicAllOfMatcher<Stmt> stmt;
853const internal::VariadicDynCastAllOfMatcher<Stmt, DeclStmt> declStmt;
854const internal::VariadicDynCastAllOfMatcher<Stmt, MemberExpr> memberExpr;
855const internal::VariadicDynCastAllOfMatcher<Stmt, UnresolvedMemberExpr>
857const internal::VariadicDynCastAllOfMatcher<Stmt, CXXDependentScopeMemberExpr>
859const internal::VariadicDynCastAllOfMatcher<Stmt, CallExpr> callExpr;
860const internal::VariadicDynCastAllOfMatcher<Stmt, LambdaExpr> lambdaExpr;
861const internal::VariadicDynCastAllOfMatcher<Stmt, CXXMemberCallExpr>
863const internal::VariadicDynCastAllOfMatcher<Stmt, ObjCMessageExpr>
865const internal::VariadicDynCastAllOfMatcher<Decl, ObjCInterfaceDecl>
867const internal::VariadicDynCastAllOfMatcher<Decl, ObjCImplementationDecl>
869const internal::VariadicDynCastAllOfMatcher<Decl, ObjCProtocolDecl>
871const internal::VariadicDynCastAllOfMatcher<Decl, ObjCCategoryDecl>
873const internal::VariadicDynCastAllOfMatcher<Decl, ObjCCategoryImplDecl>
875const internal::VariadicDynCastAllOfMatcher<Decl, ObjCMethodDecl>
877const internal::VariadicDynCastAllOfMatcher<Decl, BlockDecl>
879const internal::VariadicDynCastAllOfMatcher<Decl, ObjCIvarDecl> objcIvarDecl;
880const internal::VariadicDynCastAllOfMatcher<Decl, ObjCPropertyDecl>
882const internal::VariadicDynCastAllOfMatcher<Stmt, ObjCAtThrowStmt>
884const internal::VariadicDynCastAllOfMatcher<Stmt, ObjCAtTryStmt> objcTryStmt;
885const internal::VariadicDynCastAllOfMatcher<Stmt, ObjCAtCatchStmt>
887const internal::VariadicDynCastAllOfMatcher<Stmt, ObjCAtFinallyStmt>
889const internal::VariadicDynCastAllOfMatcher<Stmt, ExprWithCleanups>
891const internal::VariadicDynCastAllOfMatcher<Stmt, InitListExpr> initListExpr;
892const internal::VariadicDynCastAllOfMatcher<Stmt, CXXStdInitializerListExpr>
894const internal::VariadicDynCastAllOfMatcher<Stmt, ImplicitValueInitExpr>
896const internal::VariadicDynCastAllOfMatcher<Stmt, ParenListExpr> parenListExpr;
897const internal::VariadicDynCastAllOfMatcher<Stmt, SubstNonTypeTemplateParmExpr>
899const internal::VariadicDynCastAllOfMatcher<Decl, UsingDecl> usingDecl;
900const internal::VariadicDynCastAllOfMatcher<Decl, UsingEnumDecl> usingEnumDecl;
901const internal::VariadicDynCastAllOfMatcher<Decl, UsingDirectiveDecl>
903const internal::VariadicDynCastAllOfMatcher<Stmt, UnresolvedLookupExpr>
905const internal::VariadicDynCastAllOfMatcher<Decl, UnresolvedUsingValueDecl>
907const internal::VariadicDynCastAllOfMatcher<Decl, UnresolvedUsingTypenameDecl>
909const internal::VariadicDynCastAllOfMatcher<Stmt, ConstantExpr> constantExpr;
910const internal::VariadicDynCastAllOfMatcher<Stmt, ParenExpr> parenExpr;
911const internal::VariadicDynCastAllOfMatcher<Stmt, CXXConstructExpr>
913const internal::VariadicDynCastAllOfMatcher<Stmt, CXXUnresolvedConstructExpr>
915const internal::VariadicDynCastAllOfMatcher<Stmt, CXXThisExpr> cxxThisExpr;
916const internal::VariadicDynCastAllOfMatcher<Stmt, CXXBindTemporaryExpr>
918const internal::VariadicDynCastAllOfMatcher<Stmt, MaterializeTemporaryExpr>
920const internal::VariadicDynCastAllOfMatcher<Stmt, CXXNewExpr> cxxNewExpr;
921const internal::VariadicDynCastAllOfMatcher<Stmt, CXXDeleteExpr> cxxDeleteExpr;
922const internal::VariadicDynCastAllOfMatcher<Stmt, CXXNoexceptExpr>
924const internal::VariadicDynCastAllOfMatcher<Stmt, ArraySubscriptExpr>
926const internal::VariadicDynCastAllOfMatcher<Stmt, ArrayInitIndexExpr>
928const internal::VariadicDynCastAllOfMatcher<Stmt, ArrayInitLoopExpr>
930const internal::VariadicDynCastAllOfMatcher<Stmt, CXXDefaultArgExpr>
932const internal::VariadicDynCastAllOfMatcher<Stmt, CXXOperatorCallExpr>
934const internal::VariadicDynCastAllOfMatcher<Stmt, CXXRewrittenBinaryOperator>
936const internal::VariadicDynCastAllOfMatcher<Stmt, CXXFoldExpr> cxxFoldExpr;
937const internal::VariadicDynCastAllOfMatcher<Stmt, Expr> expr;
938const internal::VariadicDynCastAllOfMatcher<Stmt, DeclRefExpr> declRefExpr;
939const internal::VariadicDynCastAllOfMatcher<Stmt, DependentScopeDeclRefExpr>
941const internal::VariadicDynCastAllOfMatcher<Stmt, ObjCIvarRefExpr> objcIvarRefExpr;
942const internal::VariadicDynCastAllOfMatcher<Stmt, BlockExpr> blockExpr;
943const internal::VariadicDynCastAllOfMatcher<Stmt, IfStmt> ifStmt;
944const internal::VariadicDynCastAllOfMatcher<Stmt, ForStmt> forStmt;
945const internal::VariadicDynCastAllOfMatcher<Stmt, CXXForRangeStmt>
947const internal::VariadicDynCastAllOfMatcher<Stmt, WhileStmt> whileStmt;
948const internal::VariadicDynCastAllOfMatcher<Stmt, DoStmt> doStmt;
949const internal::VariadicDynCastAllOfMatcher<Stmt, BreakStmt> breakStmt;
950const internal::VariadicDynCastAllOfMatcher<Stmt, ContinueStmt> continueStmt;
951const internal::VariadicDynCastAllOfMatcher<Stmt, CoreturnStmt> coreturnStmt;
952const internal::VariadicDynCastAllOfMatcher<Stmt, ReturnStmt> returnStmt;
953const internal::VariadicDynCastAllOfMatcher<Stmt, GotoStmt> gotoStmt;
954const internal::VariadicDynCastAllOfMatcher<Stmt, LabelStmt> labelStmt;
955const internal::VariadicDynCastAllOfMatcher<Stmt, AddrLabelExpr> addrLabelExpr;
956const internal::VariadicDynCastAllOfMatcher<Stmt, SwitchStmt> switchStmt;
957const internal::VariadicDynCastAllOfMatcher<Stmt, SwitchCase> switchCase;
958const internal::VariadicDynCastAllOfMatcher<Stmt, CaseStmt> caseStmt;
959const internal::VariadicDynCastAllOfMatcher<Stmt, DefaultStmt> defaultStmt;
960const internal::VariadicDynCastAllOfMatcher<Stmt, CompoundStmt> compoundStmt;
961const internal::VariadicDynCastAllOfMatcher<Stmt, CoroutineBodyStmt>
963const internal::VariadicDynCastAllOfMatcher<Stmt, CXXCatchStmt> cxxCatchStmt;
964const internal::VariadicDynCastAllOfMatcher<Stmt, CXXTryStmt> cxxTryStmt;
965const internal::VariadicDynCastAllOfMatcher<Stmt, CXXThrowExpr> cxxThrowExpr;
966const internal::VariadicDynCastAllOfMatcher<Stmt, NullStmt> nullStmt;
967const internal::VariadicDynCastAllOfMatcher<Stmt, AsmStmt> asmStmt;
968const internal::VariadicDynCastAllOfMatcher<Decl, FileScopeAsmDecl>
970const internal::VariadicDynCastAllOfMatcher<Stmt, CXXBoolLiteralExpr>
972const internal::VariadicDynCastAllOfMatcher<Stmt, StringLiteral> stringLiteral;
973const internal::VariadicDynCastAllOfMatcher<Stmt, ObjCStringLiteral> objcStringLiteral;
974const internal::VariadicDynCastAllOfMatcher<Stmt, CharacterLiteral>
976const internal::VariadicDynCastAllOfMatcher<Stmt, IntegerLiteral>
978const internal::VariadicDynCastAllOfMatcher<Stmt, FloatingLiteral> floatLiteral;
979const internal::VariadicDynCastAllOfMatcher<Stmt, ImaginaryLiteral> imaginaryLiteral;
980const internal::VariadicDynCastAllOfMatcher<Stmt, FixedPointLiteral>
982const internal::VariadicDynCastAllOfMatcher<Stmt, UserDefinedLiteral>
984const internal::VariadicDynCastAllOfMatcher<Stmt, CompoundLiteralExpr>
986const internal::VariadicDynCastAllOfMatcher<Stmt, CXXNullPtrLiteralExpr>
988const internal::VariadicDynCastAllOfMatcher<Stmt, ChooseExpr> chooseExpr;
989const internal::VariadicDynCastAllOfMatcher<Stmt, ConvertVectorExpr>
991const internal::VariadicDynCastAllOfMatcher<Stmt, CoawaitExpr>
993const internal::VariadicDynCastAllOfMatcher<Stmt, DependentCoawaitExpr>
995const internal::VariadicDynCastAllOfMatcher<Stmt, CoyieldExpr>
997const internal::VariadicDynCastAllOfMatcher<Stmt, GNUNullExpr> gnuNullExpr;
998const internal::VariadicDynCastAllOfMatcher<Stmt, GenericSelectionExpr>
1000const internal::VariadicDynCastAllOfMatcher<Stmt, AtomicExpr> atomicExpr;
1001const internal::VariadicDynCastAllOfMatcher<Stmt, StmtExpr> stmtExpr;
1002const internal::VariadicDynCastAllOfMatcher<Stmt, BinaryOperator>
1004const internal::MapAnyOfMatcher<BinaryOperator, CXXOperatorCallExpr,
1007const internal::MapAnyOfMatcher<CallExpr, CXXConstructExpr> invocation;
1008const internal::VariadicDynCastAllOfMatcher<Stmt, UnaryOperator> unaryOperator;
1009const internal::VariadicDynCastAllOfMatcher<Stmt, ConditionalOperator>
1011const internal::VariadicDynCastAllOfMatcher<Stmt, BinaryConditionalOperator>
1013const internal::VariadicDynCastAllOfMatcher<Stmt, OpaqueValueExpr>
1015const internal::VariadicDynCastAllOfMatcher<Decl, StaticAssertDecl>
1017const internal::VariadicDynCastAllOfMatcher<Stmt, CXXReinterpretCastExpr>
1019const internal::VariadicDynCastAllOfMatcher<Stmt, CXXStaticCastExpr>
1021const internal::VariadicDynCastAllOfMatcher<Stmt, CXXDynamicCastExpr>
1023const internal::VariadicDynCastAllOfMatcher<Stmt, CXXConstCastExpr>
1025const internal::VariadicDynCastAllOfMatcher<Stmt, CXXNamedCastExpr>
1027const internal::VariadicDynCastAllOfMatcher<Stmt, CStyleCastExpr>
1029const internal::VariadicDynCastAllOfMatcher<Stmt, ExplicitCastExpr>
1031const internal::VariadicDynCastAllOfMatcher<Stmt, ImplicitCastExpr>
1033const internal::VariadicDynCastAllOfMatcher<Stmt, CastExpr> castExpr;
1034const internal::VariadicDynCastAllOfMatcher<Stmt, CXXFunctionalCastExpr>
1036const internal::VariadicDynCastAllOfMatcher<Stmt, CXXTemporaryObjectExpr>
1038const internal::VariadicDynCastAllOfMatcher<Stmt, PredefinedExpr>
1040const internal::VariadicDynCastAllOfMatcher<Stmt, DesignatedInitExpr>
1042const internal::VariadicOperatorMatcherFunc<
1043 2, std::numeric_limits<unsigned>::max()>
1044 eachOf = {internal::DynTypedMatcher::VO_EachOf};
1045const internal::VariadicOperatorMatcherFunc<
1046 2, std::numeric_limits<unsigned>::max()>
1047 anyOf = {internal::DynTypedMatcher::VO_AnyOf};
1048const internal::VariadicOperatorMatcherFunc<
1049 2, std::numeric_limits<unsigned>::max()>
1050 allOf = {internal::DynTypedMatcher::VO_AllOf};
1051const internal::VariadicOperatorMatcherFunc<1, 1> optionally = {
1052 internal::DynTypedMatcher::VO_Optionally};
1053const internal::VariadicFunction<internal::Matcher<NamedDecl>, StringRef,
1054 internal::hasAnyNameFunc>
1056
1057const internal::VariadicFunction<internal::HasOpNameMatcher, StringRef,
1058 internal::hasAnyOperatorNameFunc>
1060const internal::VariadicFunction<internal::HasOverloadOpNameMatcher, StringRef,
1061 internal::hasAnyOverloadedOperatorNameFunc>
1063const internal::VariadicFunction<internal::Matcher<ObjCMessageExpr>, StringRef,
1064 internal::hasAnySelectorFunc>
1066const internal::ArgumentAdaptingMatcherFunc<internal::HasMatcher> has = {};
1067const internal::ArgumentAdaptingMatcherFunc<internal::HasDescendantMatcher>
1069const internal::ArgumentAdaptingMatcherFunc<internal::ForEachMatcher> forEach =
1070 {};
1071const internal::ArgumentAdaptingMatcherFunc<internal::ForEachDescendantMatcher>
1073const internal::ArgumentAdaptingMatcherFunc<
1074 internal::HasParentMatcher,
1075 internal::TypeList<Decl, NestedNameSpecifierLoc, Stmt, TypeLoc, Attr>,
1076 internal::TypeList<Decl, NestedNameSpecifierLoc, Stmt, TypeLoc, Attr>>
1078const internal::ArgumentAdaptingMatcherFunc<
1079 internal::HasAncestorMatcher,
1080 internal::TypeList<Decl, NestedNameSpecifierLoc, Stmt, TypeLoc, Attr>,
1081 internal::TypeList<Decl, NestedNameSpecifierLoc, Stmt, TypeLoc, Attr>>
1083const internal::VariadicOperatorMatcherFunc<1, 1> unless = {
1084 internal::DynTypedMatcher::VO_UnaryNot};
1085const internal::VariadicAllOfMatcher<NestedNameSpecifier> nestedNameSpecifier;
1086const internal::VariadicAllOfMatcher<NestedNameSpecifierLoc>
1088const internal::VariadicAllOfMatcher<Attr> attr;
1089const internal::VariadicDynCastAllOfMatcher<Stmt, CUDAKernelCallExpr>
1091const AstTypeMatcher<BuiltinType> builtinType;
1092const AstTypeMatcher<ArrayType> arrayType;
1093const AstTypeMatcher<ComplexType> complexType;
1094const AstTypeMatcher<ConstantArrayType> constantArrayType;
1095const AstTypeMatcher<DeducedTemplateSpecializationType>
1097const AstTypeMatcher<DependentSizedArrayType> dependentSizedArrayType;
1098const AstTypeMatcher<DependentSizedExtVectorType> dependentSizedExtVectorType;
1099const AstTypeMatcher<IncompleteArrayType> incompleteArrayType;
1100const AstTypeMatcher<VariableArrayType> variableArrayType;
1101const AstTypeMatcher<AtomicType> atomicType;
1102const AstTypeMatcher<AutoType> autoType;
1103const AstTypeMatcher<DecltypeType> decltypeType;
1104const AstTypeMatcher<FunctionType> functionType;
1105const AstTypeMatcher<FunctionProtoType> functionProtoType;
1106const AstTypeMatcher<ParenType> parenType;
1107const AstTypeMatcher<BlockPointerType> blockPointerType;
1108const AstTypeMatcher<MacroQualifiedType> macroQualifiedType;
1109const AstTypeMatcher<MemberPointerType> memberPointerType;
1110const AstTypeMatcher<PointerType> pointerType;
1111const AstTypeMatcher<ObjCObjectPointerType> objcObjectPointerType;
1112const AstTypeMatcher<ReferenceType> referenceType;
1113const AstTypeMatcher<LValueReferenceType> lValueReferenceType;
1114const AstTypeMatcher<RValueReferenceType> rValueReferenceType;
1115const AstTypeMatcher<TypedefType> typedefType;
1116const AstTypeMatcher<EnumType> enumType;
1117const AstTypeMatcher<TemplateSpecializationType> templateSpecializationType;
1118const AstTypeMatcher<UnaryTransformType> unaryTransformType;
1119const AstTypeMatcher<RecordType> recordType;
1120const AstTypeMatcher<TagType> tagType;
1121const AstTypeMatcher<UsingType> usingType;
1122const AstTypeMatcher<SubstTemplateTypeParmType> substTemplateTypeParmType;
1123const AstTypeMatcher<TemplateTypeParmType> templateTypeParmType;
1124const AstTypeMatcher<InjectedClassNameType> injectedClassNameType;
1125const AstTypeMatcher<DecayedType> decayedType;
1126const AstTypeMatcher<DependentNameType> dependentNameType;
1129 ComplexType));
1133 pointee,
1137
1138const internal::VariadicDynCastAllOfMatcher<Stmt, OMPExecutableDirective>
1140const internal::VariadicDynCastAllOfMatcher<Stmt, OMPTargetUpdateDirective>
1142const internal::VariadicDynCastAllOfMatcher<OMPClause, OMPDefaultClause>
1144const internal::VariadicDynCastAllOfMatcher<OMPClause, OMPFromClause>
1146const internal::VariadicDynCastAllOfMatcher<OMPClause, OMPToClause> ompToClause;
1147const internal::VariadicDynCastAllOfMatcher<Decl, CXXDeductionGuideDecl>
1149
1150} // end namespace ast_matchers
1151} // end namespace clang
Defines the clang::ASTContext interface.
#define AST_POLYMORPHIC_SUPPORTED_TYPES(...)
Construct a type-list to be passed to the AST_POLYMORPHIC_MATCHER* macros.
#define AST_TYPELOC_TRAVERSE_MATCHER_DEF(MatcherName, ReturnTypesF)
#define AST_MATCHER_P(Type, DefineMatcher, ParamType, Param)
AST_MATCHER_P(Type, DefineMatcher, ParamType, Param) { ... } defines a single-parameter function name...
Defines the C++ template declaration subclasses.
Defines Expressions and AST nodes for C++2a concepts.
StringRef TokenText
The raw text of the token.
Forward-declares and imports various common LLVM datatypes that clang wants to use unqualified.
#define SM(sm)
llvm::SmallVector< std::pair< const MemRegion *, SVal >, 4 > Bindings
Holds long-lived AST nodes (such as types and decls) that can be referred to throughout the semantic ...
Definition ASTContext.h:226
const clang::PrintingPolicy & getPrintingPolicy() const
Definition ASTContext.h:850
static ASTNodeKind getMostDerivedType(ASTNodeKind Kind1, ASTNodeKind Kind2)
Return the most derived type between Kind1 and Kind2.
static constexpr ASTNodeKind getFromNodeKind()
Construct an identifier for T.
Represents an array type, per C99 6.7.5.2 - Array Declarators.
Definition TypeBase.h:3730
A builtin binary operation expression such as "x + y" or "x <= y".
Definition Expr.h:4041
Pointer to a block type.
Definition TypeBase.h:3550
Represents a path from a specific derived class (which is not represented as part of the path) to a p...
BasePaths - Represents the set of paths from a derived class to one of its (direct or indirect) bases...
void setOrigin(const CXXRecordDecl *Rec)
Represents a base class of a C++ class.
Definition DeclCXX.h:146
A call to an overloaded operator written using operator syntax.
Definition ExprCXX.h:85
Represents a C++ struct/union/class.
Definition DeclCXX.h:258
bool lookupInBases(BaseMatchesCallback BaseMatches, CXXBasePaths &Paths, bool LookupInDependent=false) const
Look for entities within the base classes of this C++ class, transitively searching all base class su...
bool hasDefinition() const
Definition DeclCXX.h:561
A rewritten comparison expression that was originally written using operator syntax.
Definition ExprCXX.h:287
Represents a class template specialization, which refers to a class template with a given set of temp...
Complex values, per C99 6.2.5p11.
Definition TypeBase.h:3283
Decl - This represents one declaration (or definition), e.g.
Definition DeclBase.h:86
ASTContext & getASTContext() const LLVM_READONLY
Definition DeclBase.cpp:546
A dynamically typed AST node container.
Keeps track of the various options that can be enabled, which controls the dialect of C or C++ that i...
static unsigned getSpelling(const Token &Tok, const char *&Buffer, const SourceManager &SourceMgr, const LangOptions &LangOpts, bool *Invalid=nullptr)
getSpelling - This method is used to get the spelling of a token into a preallocated buffer,...
Definition Lexer.cpp:461
A pointer to member type per C++ 8.3.3 - Pointers to members.
Definition TypeBase.h:3661
This represents a decl that may have a name.
Definition Decl.h:274
IdentifierInfo * getIdentifier() const
Get the identifier that names this declaration, if there is one.
Definition Decl.h:295
StringRef getName() const
Get the name of identifier for this declaration as a StringRef.
Definition Decl.h:301
DeclarationName getDeclName() const
Get the actual, stored name of the declaration, which may be a special name.
Definition Decl.h:340
virtual void printName(raw_ostream &OS, const PrintingPolicy &Policy) const
Pretty-print the unqualified name of this declaration.
Definition Decl.cpp:1672
Represent a C++ namespace.
Definition Decl.h:592
bool isAnonymousNamespace() const
Returns true if this is an anonymous namespace declaration.
Definition Decl.h:643
An expression that sends a message to the given Objective-C object or class.
Definition ExprObjC.h:937
Represents a pointer to an Objective C object.
Definition TypeBase.h:7967
PointerType - C99 6.7.5.1 - Pointer Declarators.
Definition TypeBase.h:3336
Represents a struct/union/class.
Definition Decl.h:4327
Base for LValueReferenceType and RValueReferenceType.
Definition TypeBase.h:3581
Encodes a location in the source.
This class handles loading and caching of source files into memory.
Each ExpansionInfo encodes the expansion location - where the token was ultimately expanded,...
SourceLocation getExpansionLocStart() const
SourceLocation getSpellingLoc() const
void printName(raw_ostream &OS, const PrintingPolicy &Policy) const override
Pretty-print the unqualified name of this declaration.
Definition Decl.cpp:5029
Base wrapper for a particular "section" of type source info.
Definition TypeLoc.h:59
Maps string IDs to AST nodes matched by parts of a matcher.
#define bool
Definition gpuintrin.h:32
HasOverloadOpNameMatcher hasAnyOverloadedOperatorNameFunc(ArrayRef< const StringRef * > NameRefs)
static std::vector< std::string > vectorFromRefs(ArrayRef< const StringRef * > NameRefs)
std::shared_ptr< llvm::Regex > createAndVerifyRegex(StringRef Regex, llvm::Regex::RegexFlags Flags, StringRef MatcherID)
Matcher< ObjCMessageExpr > hasAnySelectorFunc(ArrayRef< const StringRef * > NameRefs)
static bool eachOfVariadicOperator(const DynTypedNode &DynNode, ASTMatchFinder *Finder, BoundNodesTreeBuilder *Builder, ArrayRef< DynTypedMatcher > InnerMatchers)
static bool isTokenAtLoc(const SourceManager &SM, const LangOptions &LangOpts, StringRef Text, SourceLocation Loc)
static StringRef getNodeName(const NamedDecl &Node, llvm::SmallString< 128 > &Scratch)
static bool anyOfVariadicOperator(const DynTypedNode &DynNode, ASTMatchFinder *Finder, BoundNodesTreeBuilder *Builder, ArrayRef< DynTypedMatcher > InnerMatchers)
static bool optionallyVariadicOperator(const DynTypedNode &DynNode, ASTMatchFinder *Finder, BoundNodesTreeBuilder *Builder, ArrayRef< DynTypedMatcher > InnerMatchers)
Matcher< NamedDecl > hasAnyNameFunc(ArrayRef< const StringRef * > NameRefs)
HasOpNameMatcher hasAnyOperatorNameFunc(ArrayRef< const StringRef * > NameRefs)
static bool notUnaryOperator(const DynTypedNode &DynNode, ASTMatchFinder *Finder, BoundNodesTreeBuilder *Builder, ArrayRef< DynTypedMatcher > InnerMatchers)
std::optional< SourceLocation > getExpansionLocOfMacro(StringRef MacroName, SourceLocation Loc, const ASTContext &Context)
static bool consumeNameSuffix(StringRef &FullName, StringRef Suffix)
bool matchesAnyBase(const CXXRecordDecl &Node, const Matcher< CXXBaseSpecifier > &BaseSpecMatcher, ASTMatchFinder *Finder, BoundNodesTreeBuilder *Builder)
static std::optional< SourceLocation > getExpansionLocOfMacroRecursive(StringRef MacroName, SourceLocation Loc, const ASTContext &Context, llvm::DenseSet< SourceLocation > &CheckedLocations)
static bool allOfVariadicOperator(const DynTypedNode &DynNode, ASTMatchFinder *Finder, BoundNodesTreeBuilder *Builder, ArrayRef< DynTypedMatcher > InnerMatchers)
const internal::VariadicDynCastAllOfMatcher< Stmt, FixedPointLiteral > fixedPointLiteral
Matches fixed-point literals eg.
const internal::VariadicDynCastAllOfMatcher< Stmt, CStyleCastExpr > cStyleCastExpr
Matches a C-style cast expression.
const internal::VariadicDynCastAllOfMatcher< Decl, TagDecl > tagDecl
Matches tag declarations.
const internal::VariadicDynCastAllOfMatcher< Stmt, CXXReinterpretCastExpr > cxxReinterpretCastExpr
Matches a reinterpret_cast expression.
const internal::VariadicDynCastAllOfMatcher< Decl, VarDecl > varDecl
Matches variable declarations.
const internal::VariadicDynCastAllOfMatcher< Stmt, StmtExpr > stmtExpr
Matches statement expression (GNU extension).
const internal::VariadicDynCastAllOfMatcher< Stmt, ExprWithCleanups > exprWithCleanups
Matches expressions that introduce cleanups to be run at the end of the sub-expression's evaluation.
const internal::VariadicDynCastAllOfMatcher< Stmt, DeclRefExpr > declRefExpr
Matches expressions that refer to declarations.
const AstTypeMatcher< RValueReferenceType > rValueReferenceType
const internal::VariadicDynCastAllOfMatcher< TypeLoc, ReferenceTypeLoc > referenceTypeLoc
const internal::VariadicDynCastAllOfMatcher< TypeLoc, PointerTypeLoc > pointerTypeLoc
const internal::VariadicDynCastAllOfMatcher< Decl, TypedefNameDecl > typedefNameDecl
Matches typedef name declarations.
const internal::VariadicDynCastAllOfMatcher< Decl, ObjCIvarDecl > objcIvarDecl
Matches Objective-C instance variable declarations.
const internal::VariadicDynCastAllOfMatcher< Decl, TypeAliasDecl > typeAliasDecl
Matches type alias declarations.
const internal::VariadicDynCastAllOfMatcher< Decl, UsingEnumDecl > usingEnumDecl
Matches using-enum declarations.
const internal::VariadicDynCastAllOfMatcher< Stmt, ConstantExpr > constantExpr
Matches a constant expression wrapper.
const internal::VariadicDynCastAllOfMatcher< Stmt, ArrayInitLoopExpr > arrayInitLoopExpr
Matches a loop initializing the elements of an array in a number of contexts:
const internal::VariadicDynCastAllOfMatcher< Stmt, ObjCIvarRefExpr > objcIvarRefExpr
Matches a reference to an ObjCIvar.
const internal::VariadicOperatorMatcherFunc< 1, 1 > unless
Matches if the provided matcher does not match.
const internal::VariadicDynCastAllOfMatcher< Decl, ConceptDecl > conceptDecl
Matches concept declarations.
const internal::VariadicDynCastAllOfMatcher< Stmt, CoyieldExpr > coyieldExpr
Matches co_yield expressions.
const AstTypeMatcher< ObjCObjectPointerType > objcObjectPointerType
const AstTypeMatcher< DependentSizedArrayType > dependentSizedArrayType
const internal::VariadicDynCastAllOfMatcher< Stmt, CXXDeleteExpr > cxxDeleteExpr
Matches delete expressions.
const AstTypeMatcher< SubstTemplateTypeParmType > substTemplateTypeParmType
const internal::VariadicAllOfMatcher< TemplateName > templateName
Matches template name.
const internal::VariadicDynCastAllOfMatcher< Decl, ObjCProtocolDecl > objcProtocolDecl
Matches Objective-C protocol declarations.
const internal::VariadicDynCastAllOfMatcher< Stmt, ImplicitCastExpr > implicitCastExpr
Matches the implicit cast nodes of Clang's AST.
const internal::VariadicOperatorMatcherFunc< 1, 1 > optionally
Matches any node regardless of the submatcher.
const internal::VariadicDynCastAllOfMatcher< Decl, FileScopeAsmDecl > fileScopeAsmDecl
Matches top level asm declarations.
const internal::VariadicDynCastAllOfMatcher< Decl, UsingDecl > usingDecl
Matches using declarations.
const internal::ArgumentAdaptingMatcherFunc< internal::HasDescendantMatcher > hasDescendant
Matches AST nodes that have descendant AST nodes that match the provided matcher.
const AstTypeMatcher< BuiltinType > builtinType
const internal::VariadicDynCastAllOfMatcher< Decl, ObjCPropertyDecl > objcPropertyDecl
Matches Objective-C property declarations.
const internal::VariadicDynCastAllOfMatcher< Stmt, StringLiteral > stringLiteral
Matches string literals (also matches wide string literals).
const internal::VariadicAllOfMatcher< CXXCtorInitializer > cxxCtorInitializer
Matches constructor initializers.
const internal::VariadicDynCastAllOfMatcher< Stmt, ObjCAtFinallyStmt > objcFinallyStmt
Matches Objective-C @finally statements.
const internal::VariadicDynCastAllOfMatcher< Stmt, AtomicExpr > atomicExpr
Matches atomic builtins.
const internal::VariadicDynCastAllOfMatcher< Stmt, CoawaitExpr > coawaitExpr
Matches co_await expressions.
const internal::VariadicDynCastAllOfMatcher< Decl, EnumDecl > enumDecl
Matches enum declarations.
const internal::VariadicDynCastAllOfMatcher< Stmt, ConvertVectorExpr > convertVectorExpr
Matches builtin function __builtin_convertvector.
const internal::VariadicDynCastAllOfMatcher< Stmt, AddrLabelExpr > addrLabelExpr
Matches address of label statements (GNU extension).
const internal::VariadicDynCastAllOfMatcher< Stmt, CXXDependentScopeMemberExpr > cxxDependentScopeMemberExpr
Matches member expressions where the actual member referenced could not be resolved because the base ...
const internal::VariadicDynCastAllOfMatcher< Stmt, PredefinedExpr > predefinedExpr
Matches predefined identifier expressions [C99 6.4.2.2].
const internal::VariadicDynCastAllOfMatcher< Stmt, DependentCoawaitExpr > dependentCoawaitExpr
Matches co_await expressions where the type of the promise is dependent.
const internal::VariadicDynCastAllOfMatcher< Stmt, BreakStmt > breakStmt
Matches break statements.
const internal::VariadicDynCastAllOfMatcher< Decl, BindingDecl > bindingDecl
Matches binding declarations Example matches foo and bar (matcher = bindingDecl()
const internal::VariadicDynCastAllOfMatcher< Stmt, UnresolvedLookupExpr > unresolvedLookupExpr
Matches reference to a name that can be looked up during parsing but could not be resolved to a speci...
const internal::VariadicDynCastAllOfMatcher< OMPClause, OMPDefaultClause > ompDefaultClause
const AstTypeMatcher< DecayedType > decayedType
const internal::VariadicDynCastAllOfMatcher< Stmt, ObjCStringLiteral > objcStringLiteral
Matches ObjectiveC String literal expressions.
const internal::VariadicDynCastAllOfMatcher< Decl, ObjCMethodDecl > objcMethodDecl
Matches Objective-C method declarations.
const internal::VariadicDynCastAllOfMatcher< Decl, ParmVarDecl > parmVarDecl
Matches parameter variable declarations.
const internal::VariadicDynCastAllOfMatcher< Stmt, CXXRewrittenBinaryOperator > cxxRewrittenBinaryOperator
Matches rewritten binary operators.
const AstTypeMatcher< VariableArrayType > variableArrayType
const internal::VariadicDynCastAllOfMatcher< Decl, TypedefDecl > typedefDecl
Matches typedef declarations.
const internal::VariadicDynCastAllOfMatcher< Stmt, GenericSelectionExpr > genericSelectionExpr
Matches C11 _Generic expression.
const internal::VariadicDynCastAllOfMatcher< TypeLoc, ArrayTypeLoc > arrayTypeLoc
const internal::VariadicDynCastAllOfMatcher< OMPClause, OMPToClause > ompToClause
/ Matches each case or default statement belonging to the given switch / statement.
const internal::VariadicDynCastAllOfMatcher< Decl, CXXDeductionGuideDecl > cxxDeductionGuideDecl
Matches user-defined and implicitly generated deduction guide.
const internal::VariadicDynCastAllOfMatcher< Stmt, CXXBoolLiteralExpr > cxxBoolLiteral
Matches bool literals.
const internal::VariadicAllOfMatcher< NestedNameSpecifier > nestedNameSpecifier
const internal::VariadicDynCastAllOfMatcher< Stmt, ReturnStmt > returnStmt
Matches return statements.
const internal::VariadicDynCastAllOfMatcher< Stmt, AsmStmt > asmStmt
Matches asm statements.
const internal::VariadicDynCastAllOfMatcher< Stmt, CXXDynamicCastExpr > cxxDynamicCastExpr
Matches a dynamic_cast expression.
const internal::VariadicDynCastAllOfMatcher< Stmt, CoreturnStmt > coreturnStmt
Matches co_return statements.
const internal::VariadicDynCastAllOfMatcher< Stmt, CallExpr > callExpr
Matches call expressions.
const AstTypeMatcher< TagType > tagType
const internal::VariadicDynCastAllOfMatcher< Stmt, CXXNamedCastExpr > cxxNamedCastExpr
Matches any named cast expression.
const internal::VariadicDynCastAllOfMatcher< Stmt, LambdaExpr > lambdaExpr
Matches lambda expressions.
const AstTypeMatcher< IncompleteArrayType > incompleteArrayType
const internal::VariadicDynCastAllOfMatcher< Stmt, CompoundStmt > compoundStmt
Matches compound statements.
const internal::VariadicDynCastAllOfMatcher< Stmt, FloatingLiteral > floatLiteral
Matches float literals of all sizes / encodings, e.g.
const internal::VariadicDynCastAllOfMatcher< Stmt, ObjCAutoreleasePoolStmt > autoreleasePoolStmt
Matches an Objective-C autorelease pool statement.
const internal::VariadicFunction< internal::PolymorphicMatcher< internal::HasOverloadedOperatorNameMatcher, AST_POLYMORPHIC_SUPPORTED_TYPES(CXXOperatorCallExpr, FunctionDecl), std::vector< std::string > >, StringRef, internal::hasAnyOverloadedOperatorNameFunc > hasAnyOverloadedOperatorName
Matches overloaded operator names.
const internal::VariadicDynCastAllOfMatcher< Decl, NonTypeTemplateParmDecl > nonTypeTemplateParmDecl
Matches non-type template parameter declarations.
const AstTypeMatcher< BlockPointerType > blockPointerType
const internal::VariadicDynCastAllOfMatcher< Stmt, UnaryExprOrTypeTraitExpr > unaryExprOrTypeTraitExpr
Matches sizeof (C99), alignof (C++11) and vec_step (OpenCL)
const internal::VariadicDynCastAllOfMatcher< Stmt, NullStmt > nullStmt
Matches null statements.
const AstTypeMatcher< DependentNameType > dependentNameType
const internal::VariadicAllOfMatcher< Attr > attr
const internal::ArgumentAdaptingMatcherFunc< internal::ForEachDescendantMatcher > forEachDescendant
Matches AST nodes that have descendant AST nodes that match the provided matcher.
const internal::VariadicAllOfMatcher< CXXBaseSpecifier > cxxBaseSpecifier
Matches class bases.
const internal::VariadicDynCastAllOfMatcher< Stmt, CXXDefaultArgExpr > cxxDefaultArgExpr
Matches the value of a default argument at the call site.
const internal::VariadicAllOfMatcher< TemplateArgument > templateArgument
Matches template arguments.
const internal::ArgumentAdaptingMatcherFunc< internal::ForEachMatcher > forEach
Matches AST nodes that have child AST nodes that match the provided matcher.
const internal::VariadicDynCastAllOfMatcher< Stmt, CaseStmt > caseStmt
Matches case statements inside switch statements.
const internal::VariadicDynCastAllOfMatcher< Decl, NamedDecl > namedDecl
Matches a declaration of anything that could have a name.
const internal::VariadicFunction< internal::HasOpNameMatcher, StringRef, internal::hasAnyOperatorNameFunc > hasAnyOperatorName
const internal::VariadicDynCastAllOfMatcher< Decl, UnresolvedUsingTypenameDecl > unresolvedUsingTypenameDecl
Matches unresolved using value declarations that involve the typename.
const internal::VariadicAllOfMatcher< Type > type
Matches Types in the clang AST.
const internal::VariadicAllOfMatcher< TypeLoc > typeLoc
Matches TypeLocs in the clang AST.
const internal::VariadicDynCastAllOfMatcher< Stmt, ParenListExpr > parenListExpr
Matches paren list expressions.
const internal::VariadicDynCastAllOfMatcher< Decl, ClassTemplatePartialSpecializationDecl > classTemplatePartialSpecializationDecl
Matches C++ class template partial specializations.
const internal::VariadicDynCastAllOfMatcher< Stmt, WhileStmt > whileStmt
Matches while statements.
const internal::VariadicDynCastAllOfMatcher< Decl, ObjCCategoryDecl > objcCategoryDecl
Matches Objective-C category declarations.
const internal::VariadicFunction< internal::Matcher< ObjCMessageExpr >, StringRef, internal::hasAnySelectorFunc > hasAnySelector
Matches when at least one of the supplied string equals to the Selector.getAsString()
const internal::VariadicDynCastAllOfMatcher< Decl, CXXConversionDecl > cxxConversionDecl
Matches conversion operator declarations.
const AstTypeMatcher< UsingType > usingType
const AstTypeMatcher< MacroQualifiedType > macroQualifiedType
const AstTypeMatcher< ParenType > parenType
const internal::VariadicDynCastAllOfMatcher< Decl, LabelDecl > labelDecl
Matches a declaration of label.
const internal::VariadicDynCastAllOfMatcher< TypeLoc, QualifiedTypeLoc > qualifiedTypeLoc
const internal::VariadicDynCastAllOfMatcher< Stmt, CXXFunctionalCastExpr > cxxFunctionalCastExpr
Matches functional cast expressions.
const internal::VariadicDynCastAllOfMatcher< Stmt, CXXConstCastExpr > cxxConstCastExpr
Matches a const_cast expression.
const internal::VariadicDynCastAllOfMatcher< Stmt, CXXTemporaryObjectExpr > cxxTemporaryObjectExpr
Matches functional cast expressions having N != 1 arguments.
const AstTypeMatcher< ArrayType > arrayType
const internal::VariadicDynCastAllOfMatcher< Stmt, UnaryOperator > unaryOperator
Matches unary operator expressions.
const internal::VariadicFunction< internal::Matcher< NamedDecl >, StringRef, internal::hasAnyNameFunc > hasAnyName
Matches NamedDecl nodes that have any of the specified names.
const AstTypeMatcher< FunctionType > functionType
const internal::VariadicDynCastAllOfMatcher< Stmt, ObjCMessageExpr > objcMessageExpr
Matches ObjectiveC Message invocation expressions.
const internal::MapAnyOfMatcher< BinaryOperator, CXXOperatorCallExpr, CXXRewrittenBinaryOperator > binaryOperation
Matches nodes which can be used with binary operators.
const internal::VariadicDynCastAllOfMatcher< Stmt, ArraySubscriptExpr > arraySubscriptExpr
Matches array subscript expressions.
const internal::VariadicDynCastAllOfMatcher< Decl, AccessSpecDecl > accessSpecDecl
Matches C++ access specifier declarations.
const AstTypeMatcher< ComplexType > complexType
const AstTypeMatcher< LValueReferenceType > lValueReferenceType
const internal::VariadicDynCastAllOfMatcher< Decl, LinkageSpecDecl > linkageSpecDecl
Matches a declaration of a linkage specification.
const internal::VariadicDynCastAllOfMatcher< Stmt, GNUNullExpr > gnuNullExpr
Matches GNU __null expression.
const internal::VariadicDynCastAllOfMatcher< Stmt, CXXForRangeStmt > cxxForRangeStmt
Matches range-based for statements.
const internal::VariadicDynCastAllOfMatcher< Stmt, CXXMemberCallExpr > cxxMemberCallExpr
Matches member call expressions.
const internal::VariadicDynCastAllOfMatcher< Decl, CXXConstructorDecl > cxxConstructorDecl
Matches C++ constructor declarations.
const internal::VariadicDynCastAllOfMatcher< Stmt, DependentScopeDeclRefExpr > dependentScopeDeclRefExpr
Matches expressions that refer to dependent scope declarations.
const internal::VariadicDynCastAllOfMatcher< Stmt, InitListExpr > initListExpr
Matches init list expressions.
const internal::VariadicDynCastAllOfMatcher< Decl, TypeAliasTemplateDecl > typeAliasTemplateDecl
Matches type alias template declarations.
const internal::VariadicDynCastAllOfMatcher< Stmt, CXXNoexceptExpr > cxxNoexceptExpr
Matches noexcept expressions.
const internal::VariadicDynCastAllOfMatcher< Stmt, ArrayInitIndexExpr > arrayInitIndexExpr
The arrayInitIndexExpr consists of two subexpressions: a common expression (the source array) that is...
const internal::VariadicDynCastAllOfMatcher< Stmt, OMPTargetUpdateDirective > ompTargetUpdateDirective
const internal::VariadicDynCastAllOfMatcher< Stmt, CXXNewExpr > cxxNewExpr
Matches new expressions.
const internal::VariadicDynCastAllOfMatcher< Decl, EnumConstantDecl > enumConstantDecl
Matches enum constants.
const internal::VariadicDynCastAllOfMatcher< Stmt, ForStmt > forStmt
Matches for statements.
const internal::VariadicDynCastAllOfMatcher< Stmt, GotoStmt > gotoStmt
Matches goto statements.
const AstTypeMatcher< AutoType > autoType
const AstTypeMatcher< MemberPointerType > memberPointerType
const internal::VariadicDynCastAllOfMatcher< Decl, DeclaratorDecl > declaratorDecl
Matches declarator declarations (field, variable, function and non-type template parameter declaratio...
const internal::VariadicDynCastAllOfMatcher< Stmt, ObjCAtCatchStmt > objcCatchStmt
Matches Objective-C @catch statements.
const AstTypeMatcher< FunctionProtoType > functionProtoType
const internal::VariadicDynCastAllOfMatcher< Stmt, BinaryOperator > binaryOperator
Matches binary operator expressions.
const AstTypeMatcher< TemplateTypeParmType > templateTypeParmType
const internal::VariadicDynCastAllOfMatcher< Decl, TemplateTypeParmDecl > templateTypeParmDecl
Matches template type parameter declarations.
const internal::VariadicDynCastAllOfMatcher< OMPClause, OMPFromClause > ompFromClause
const internal::VariadicDynCastAllOfMatcher< Stmt, BlockExpr > blockExpr
Matches a reference to a block.
const internal::VariadicDynCastAllOfMatcher< Decl, FunctionTemplateDecl > functionTemplateDecl
Matches C++ function template declarations.
const internal::VariadicDynCastAllOfMatcher< Stmt, ParenExpr > parenExpr
Matches parentheses used in expressions.
const internal::VariadicDynCastAllOfMatcher< Decl, StaticAssertDecl > staticAssertDecl
Matches a C++ static_assert declaration.
const internal::ArgumentAdaptingMatcherFunc< internal::HasMatcher > has
Matches AST nodes that have child AST nodes that match the provided matcher.
const internal::VariadicDynCastAllOfMatcher< Stmt, CoroutineBodyStmt > coroutineBodyStmt
Matches coroutine body statements.
const internal::VariadicDynCastAllOfMatcher< Decl, ObjCCategoryImplDecl > objcCategoryImplDecl
Matches Objective-C category definitions.
const internal::VariadicDynCastAllOfMatcher< Stmt, MaterializeTemporaryExpr > materializeTemporaryExpr
Matches nodes where temporaries are materialized.
const internal::VariadicDynCastAllOfMatcher< TypeLoc, FunctionTypeLoc > functionTypeLoc
const internal::VariadicDynCastAllOfMatcher< Stmt, BinaryConditionalOperator > binaryConditionalOperator
Matches binary conditional operator expressions (GNU extension).
const internal::VariadicDynCastAllOfMatcher< Stmt, OMPExecutableDirective > ompExecutableDirective
const internal::VariadicDynCastAllOfMatcher< Stmt, ObjCAtTryStmt > objcTryStmt
Matches Objective-C @try statements.
const internal::VariadicDynCastAllOfMatcher< Decl, UsingShadowDecl > usingShadowDecl
Matches shadow declarations introduced into a scope by a (resolved) using declaration.
const internal::VariadicDynCastAllOfMatcher< Stmt, ExplicitCastExpr > explicitCastExpr
Matches explicit cast expressions.
const AstTypeMatcher< ConstantArrayType > constantArrayType
const internal::VariadicDynCastAllOfMatcher< Stmt, CXXStaticCastExpr > cxxStaticCastExpr
Matches a C++ static_cast expression.
const internal::VariadicDynCastAllOfMatcher< Decl, ValueDecl > valueDecl
Matches any value declaration.
const internal::VariadicDynCastAllOfMatcher< Decl, TranslationUnitDecl > translationUnitDecl
Matches the top declaration context.
const internal::VariadicAllOfMatcher< LambdaCapture > lambdaCapture
Matches lambda captures.
const internal::VariadicOperatorMatcherFunc< 2, std::numeric_limits< unsigned >::max()> eachOf
Matches if any of the given matchers matches.
const internal::VariadicDynCastAllOfMatcher< Stmt, CXXConstructExpr > cxxConstructExpr
Matches constructor call expressions (including implicit ones).
const internal::VariadicDynCastAllOfMatcher< Decl, ObjCInterfaceDecl > objcInterfaceDecl
Matches Objective-C interface declarations.
const internal::VariadicDynCastAllOfMatcher< Decl, TemplateTemplateParmDecl > templateTemplateParmDecl
Matches template template parameter declarations.
const internal::VariadicDynCastAllOfMatcher< TypeLoc, TemplateSpecializationTypeLoc > templateSpecializationTypeLoc
const internal::VariadicDynCastAllOfMatcher< Decl, FieldDecl > fieldDecl
Matches field declarations.
const internal::VariadicDynCastAllOfMatcher< Stmt, UserDefinedLiteral > userDefinedLiteral
Matches user defined literal operator call.
const internal::VariadicDynCastAllOfMatcher< Stmt, CUDAKernelCallExpr > cudaKernelCallExpr
const internal::VariadicDynCastAllOfMatcher< Stmt, ChooseExpr > chooseExpr
Matches GNU __builtin_choose_expr.
const internal::VariadicDynCastAllOfMatcher< Stmt, CXXOperatorCallExpr > cxxOperatorCallExpr
Matches overloaded operator calls.
const internal::VariadicDynCastAllOfMatcher< Decl, RequiresExprBodyDecl > requiresExprBodyDecl
Matches concept requirement body declaration.
const AstTypeMatcher< PointerType > pointerType
const internal::VariadicDynCastAllOfMatcher< Decl, NamespaceAliasDecl > namespaceAliasDecl
Matches a declaration of a namespace alias.
const internal::VariadicDynCastAllOfMatcher< Stmt, CXXBindTemporaryExpr > cxxBindTemporaryExpr
Matches nodes where temporaries are created.
const internal::VariadicDynCastAllOfMatcher< Stmt, SwitchCase > switchCase
Matches case and default statements inside switch statements.
const internal::VariadicDynCastAllOfMatcher< Stmt, DefaultStmt > defaultStmt
Matches default statements inside switch statements.
const internal::VariadicOperatorMatcherFunc< 2, std::numeric_limits< unsigned >::max()> allOf
Matches if all given matchers match.
const internal::VariadicDynCastAllOfMatcher< Decl, ClassTemplateSpecializationDecl > classTemplateSpecializationDecl
Matches C++ class template specializations.
const internal::VariadicDynCastAllOfMatcher< Decl, DecompositionDecl > decompositionDecl
Matches decomposition-declarations.
const internal::VariadicDynCastAllOfMatcher< Decl, FunctionDecl > functionDecl
Matches function declarations.
const internal::VariadicDynCastAllOfMatcher< Stmt, UnresolvedMemberExpr > unresolvedMemberExpr
Matches unresolved member expressions.
const AstTypeMatcher< RecordType > recordType
const AstTypeMatcher< DeducedTemplateSpecializationType > deducedTemplateSpecializationType
const internal::VariadicDynCastAllOfMatcher< Stmt, ObjCAtThrowStmt > objcThrowStmt
Matches Objective-C @throw statements.
const internal::MapAnyOfMatcher< CallExpr, CXXConstructExpr > invocation
Matches function calls and constructor calls.
const internal::VariadicDynCastAllOfMatcher< Stmt, CXXThrowExpr > cxxThrowExpr
Matches throw expressions.
const internal::VariadicDynCastAllOfMatcher< Stmt, SwitchStmt > switchStmt
Matches switch statements.
const internal::VariadicDynCastAllOfMatcher< Stmt, MemberExpr > memberExpr
Matches member expressions.
const internal::VariadicDynCastAllOfMatcher< Decl, CXXRecordDecl > cxxRecordDecl
Matches C++ class declarations.
const internal::VariadicAllOfMatcher< TemplateArgumentLoc > templateArgumentLoc
Matches template arguments (with location info).
const AstTypeMatcher< UnaryTransformType > unaryTransformType
const internal::VariadicDynCastAllOfMatcher< Stmt, DesignatedInitExpr > designatedInitExpr
Matches C99 designated initializer expressions [C99 6.7.8].
const internal::VariadicAllOfMatcher< Decl > decl
Matches declarations.
const internal::VariadicDynCastAllOfMatcher< Decl, CXXDestructorDecl > cxxDestructorDecl
Matches explicit C++ destructor declarations.
const AstTypeMatcher< DecltypeType > decltypeType
const AstTypeMatcher< AtomicType > atomicType
const internal::VariadicDynCastAllOfMatcher< Stmt, CXXUnresolvedConstructExpr > cxxUnresolvedConstructExpr
Matches unresolved constructor call expressions.
const internal::VariadicDynCastAllOfMatcher< Decl, ObjCImplementationDecl > objcImplementationDecl
Matches Objective-C implementation declarations.
const internal::VariadicDynCastAllOfMatcher< Decl, RecordDecl > recordDecl
Matches class, struct, and union declarations.
const internal::VariadicDynCastAllOfMatcher< Stmt, IntegerLiteral > integerLiteral
Matches integer literals of all sizes / encodings, e.g.
const internal::VariadicDynCastAllOfMatcher< Decl, ExportDecl > exportDecl
Matches any export declaration.
const internal::VariadicDynCastAllOfMatcher< Stmt, ImplicitValueInitExpr > implicitValueInitExpr
Matches implicit initializers of init list expressions.
const internal::VariadicDynCastAllOfMatcher< Stmt, DoStmt > doStmt
Matches do statements.
const internal::VariadicDynCastAllOfMatcher< Decl, NamespaceDecl > namespaceDecl
Matches a declaration of a namespace.
const AstTypeMatcher< DependentSizedExtVectorType > dependentSizedExtVectorType
const internal::VariadicDynCastAllOfMatcher< Stmt, CXXNullPtrLiteralExpr > cxxNullPtrLiteralExpr
Matches nullptr literal.
const AstTypeMatcher< TypedefType > typedefType
const internal::VariadicDynCastAllOfMatcher< Stmt, DeclStmt > declStmt
Matches declaration statements.
const internal::VariadicDynCastAllOfMatcher< Stmt, CompoundLiteralExpr > compoundLiteralExpr
Matches compound (i.e.
const AstTypeMatcher< EnumType > enumType
const internal::VariadicDynCastAllOfMatcher< Stmt, LabelStmt > labelStmt
Matches label statements.
const internal::VariadicAllOfMatcher< Stmt > stmt
Matches statements.
const internal::VariadicDynCastAllOfMatcher< Decl, FriendDecl > friendDecl
Matches friend declarations.
const internal::VariadicDynCastAllOfMatcher< Stmt, Expr > expr
Matches expressions.
const internal::VariadicDynCastAllOfMatcher< Stmt, CharacterLiteral > characterLiteral
Matches character literals (also matches wchar_t).
const internal::VariadicDynCastAllOfMatcher< Stmt, CXXFoldExpr > cxxFoldExpr
Matches C++17 fold expressions.
const internal::VariadicDynCastAllOfMatcher< Stmt, ConditionalOperator > conditionalOperator
Matches conditional operator expressions.
const internal::VariadicDynCastAllOfMatcher< Stmt, CXXStdInitializerListExpr > cxxStdInitializerListExpr
Matches C++ initializer list expressions.
const internal::VariadicOperatorMatcherFunc< 2, std::numeric_limits< unsigned >::max()> anyOf
Matches if any of the given matchers matches.
const internal::VariadicDynCastAllOfMatcher< Stmt, OpaqueValueExpr > opaqueValueExpr
Matches opaque value expressions.
const internal::VariadicDynCastAllOfMatcher< Decl, IndirectFieldDecl > indirectFieldDecl
Matches indirect field declarations.
const internal::VariadicDynCastAllOfMatcher< Decl, BlockDecl > blockDecl
Matches block declarations.
const internal::VariadicDynCastAllOfMatcher< Decl, CXXMethodDecl > cxxMethodDecl
Matches method declarations.
const AstTypeMatcher< InjectedClassNameType > injectedClassNameType
const internal::VariadicDynCastAllOfMatcher< Stmt, CXXCatchStmt > cxxCatchStmt
Matches catch statements.
const internal::VariadicDynCastAllOfMatcher< Stmt, CastExpr > castExpr
Matches any cast nodes of Clang's AST.
const internal::VariadicAllOfMatcher< QualType > qualType
Matches QualTypes in the clang AST.
const internal::VariadicDynCastAllOfMatcher< Stmt, CXXTryStmt > cxxTryStmt
Matches try statements.
const internal::VariadicDynCastAllOfMatcher< Stmt, SubstNonTypeTemplateParmExpr > substNonTypeTemplateParmExpr
Matches substitutions of non-type template parameters.
const internal::VariadicDynCastAllOfMatcher< Decl, UsingDirectiveDecl > usingDirectiveDecl
Matches using namespace declarations.
const internal::VariadicDynCastAllOfMatcher< Decl, UnresolvedUsingValueDecl > unresolvedUsingValueDecl
Matches unresolved using value declarations.
const AstTypeMatcher< TemplateSpecializationType > templateSpecializationType
const internal::ArgumentAdaptingMatcherFunc< internal::HasAncestorMatcher, internal::TypeList< Decl, NestedNameSpecifierLoc, Stmt, TypeLoc, Attr >, internal::TypeList< Decl, NestedNameSpecifierLoc, Stmt, TypeLoc, Attr > > hasAncestor
Matches AST nodes that have an ancestor that matches the provided matcher.
const internal::ArgumentAdaptingMatcherFunc< internal::HasParentMatcher, internal::TypeList< Decl, NestedNameSpecifierLoc, Stmt, TypeLoc, Attr >, internal::TypeList< Decl, NestedNameSpecifierLoc, Stmt, TypeLoc, Attr > > hasParent
Matches AST nodes that have a parent that matches the provided matcher.
const internal::VariadicDynCastAllOfMatcher< Stmt, IfStmt > ifStmt
Matches if statements.
const internal::VariadicDynCastAllOfMatcher< Stmt, CXXThisExpr > cxxThisExpr
Matches implicit and explicit this expressions.
const internal::VariadicDynCastAllOfMatcher< Stmt, ImaginaryLiteral > imaginaryLiteral
Matches imaginary literals, which are based on integer and floating point literals e....
const AstTypeMatcher< ReferenceType > referenceType
const internal::VariadicDynCastAllOfMatcher< Stmt, ContinueStmt > continueStmt
Matches continue statements.
const internal::VariadicAllOfMatcher< NestedNameSpecifierLoc > nestedNameSpecifierLoc
const internal::VariadicDynCastAllOfMatcher< Expr, RequiresExpr > requiresExpr
Matches concept requirement.
const internal::VariadicDynCastAllOfMatcher< Decl, ClassTemplateDecl > classTemplateDecl
Matches C++ class template declarations.
@ OS
Indicates that the tracking object is a descendant of a referenced-counted OSObject,...
The JSON file list parser is used to communicate input to InstallAPI.
bool isa(CodeGen::Address addr)
Definition Address.h:330
TraversalKind
Defines how we descend a level in the AST when we pass through expressions.
@ TK_IgnoreUnlessSpelledInSource
Ignore AST nodes not written in the source.
@ Result
The result type of a method or function.
Definition TypeBase.h:905
@ Other
Other implicit parameter.
Definition Decl.h:1746
Diagnostic wrappers for TextAPI types for error reporting.
Definition Dominators.h:30
Describes how types, statements, expressions, and declarations should be printed.
@ Plain
E.g., (anonymous enum)/(unnamed struct)/etc.