Lines Matching +full:x +full:- +full:tal

1 //===--- ASTMatchFinder.cpp - Structural query framework ------------------===//
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
7 //===----------------------------------------------------------------------===//
16 //===----------------------------------------------------------------------===//
40 // 10k has been experimentally found to give a good trade-off
45 // revisit this number; also, put up micro-benchmarks that we can
66 // FIXME: Benchmark whether memoization of non-pointer typed nodes
112 // - Traverse(node) calls BaseTraverse(node) when it needs
114 // - BaseTraverse(node) then calls (via VisitorBase::Traverse*(node))
116 // - Traverse*(c) in turn calls Traverse(c), completing the
156 if (DeclNode && DeclNode->isImplicit() && in TraverseDecl()
157 Finder->isTraversalIgnoringImplicitNodes()) in TraverseDecl()
168 if (LambdaNode && Finder->isTraversalIgnoringImplicitNodes()) in getStmtToTraverse()
172 Finder->getASTContext().getParentMapContext().traverseIgnored( in getStmtToTraverse()
240 bool TraverseTemplateArgumentLoc(TemplateArgumentLoc TAL) { in TraverseTemplateArgumentLoc() argument
242 return traverse(TAL); in TraverseTemplateArgumentLoc()
245 if (!Finder->isTraversalIgnoringImplicitNodes()) in TraverseCXXForRangeStmt()
250 if (auto *Init = Node->getInit()) in TraverseCXXForRangeStmt()
253 if (!match(*Node->getLoopVariable())) in TraverseCXXForRangeStmt()
255 if (match(*Node->getRangeInit())) in TraverseCXXForRangeStmt()
256 if (!VisitorBase::TraverseStmt(Node->getRangeInit())) in TraverseCXXForRangeStmt()
258 if (!match(*Node->getBody())) in TraverseCXXForRangeStmt()
260 return VisitorBase::TraverseStmt(Node->getBody()); in TraverseCXXForRangeStmt()
263 if (!Finder->isTraversalIgnoringImplicitNodes()) in TraverseCXXRewrittenBinaryOperator()
269 return match(*Node->getLHS()) && match(*Node->getRHS()); in TraverseCXXRewrittenBinaryOperator()
273 (A->isImplicit() && in TraverseAttr()
274 Finder->getASTContext().getParentMapContext().getTraversalKind() == in TraverseAttr()
281 if (!Finder->isTraversalIgnoringImplicitNodes()) in TraverseLambdaExpr()
287 for (unsigned I = 0, N = Node->capture_size(); I != N; ++I) { in TraverseLambdaExpr()
288 const auto *C = Node->capture_begin() + I; in TraverseLambdaExpr()
289 if (!C->isExplicit()) in TraverseLambdaExpr()
291 if (Node->isInitCapture(C) && !match(*C->getCapturedVar())) in TraverseLambdaExpr()
293 if (!match(*Node->capture_init_begin()[I])) in TraverseLambdaExpr()
297 if (const auto *TPL = Node->getTemplateParameterList()) { in TraverseLambdaExpr()
304 for (const auto *P : Node->getCallOperator()->parameters()) { in TraverseLambdaExpr()
309 if (!match(*Node->getBody())) in TraverseLambdaExpr()
312 return VisitorBase::TraverseStmt(Node->getBody()); in TraverseLambdaExpr()
322 ~ScopedIncrement() { --(*Depth); } in ~ScopedIncrement()
359 bool baseTraverse(TemplateArgumentLoc TAL) { in baseTraverse() argument
360 return VisitorBase::TraverseTemplateArgumentLoc(TAL); in baseTraverse()
378 if (Matcher->matches(DynTypedNode::create(Node), Finder, in match()
386 if (Matcher->matches(DynTypedNode::create(Node), Finder, in match()
429 Options.CheckProfiling->Records = std::move(TimeByBucket); in ~MatchASTVisitor()
436 for (MatchCallback *MC : Matchers->AllCallbacks) { in onStartOfTranslationUnit()
438 Timer.setBucket(&TimeByBucket[MC->getID()]); in onStartOfTranslationUnit()
439 MC->onStartOfTranslationUnit(); in onStartOfTranslationUnit()
446 for (MatchCallback *MC : Matchers->AllCallbacks) { in onEndOfTranslationUnit()
448 Timer.setBucket(&TimeByBucket[MC->getID()]); in onEndOfTranslationUnit()
449 MC->onEndOfTranslationUnit(); in onEndOfTranslationUnit()
463 // isDerivedFrom(x) properly, where x can be the name of the base in VisitTypedefNameDecl()
466 // In general, the is-alias-of (as defined by typedefs) relation in VisitTypedefNameDecl()
467 // is tree-shaped, as you can typedef a type more than once. For in VisitTypedefNameDecl()
478 // |- B in VisitTypedefNameDecl()
479 // `- C in VisitTypedefNameDecl()
480 // |- D in VisitTypedefNameDecl()
481 // `- E in VisitTypedefNameDecl()
488 const Type *TypeNode = DeclNode->getUnderlyingType().getTypePtr(); in VisitTypedefNameDecl()
490 ActiveASTContext->getCanonicalType(TypeNode); in VisitTypedefNameDecl()
496 const ObjCInterfaceDecl *InterfaceDecl = CAD->getClassInterface(); in VisitObjCCompatibleAliasDecl()
508 bool TraverseTemplateArgumentLoc(TemplateArgumentLoc TAL);
515 TraverseStmt(RF->getInit()); in dataTraverseNode()
517 match(*RF->getLoopVariable()); in dataTraverseNode()
518 TraverseStmt(RF->getRangeInit()); in dataTraverseNode()
522 for (auto *SubStmt : RF->children()) { in dataTraverseNode()
523 if (SubStmt != RF->getBody()) in dataTraverseNode()
527 TraverseStmt(RF->getBody()); in dataTraverseNode()
532 TraverseStmt(const_cast<Expr *>(RBO->getLHS())); in dataTraverseNode()
533 TraverseStmt(const_cast<Expr *>(RBO->getRHS())); in dataTraverseNode()
537 for (auto *SubStmt : RBO->children()) { in dataTraverseNode()
543 for (auto I : llvm::zip(LE->captures(), LE->capture_inits())) { in dataTraverseNode()
552 TraverseDecl(LE->getLambdaClass()); in dataTraverseNode()
559 TypeLoc TL = LE->getCallOperator()->getTypeSourceInfo()->getTypeLoc(); in dataTraverseNode()
562 if (auto *TPL = LE->getTemplateParameterList()) { in dataTraverseNode()
566 if (Expr *RequiresClause = TPL->getRequiresClause()) { in dataTraverseNode()
571 if (LE->hasExplicitParameters()) { in dataTraverseNode()
578 for (const auto &E : T->exceptions()) in dataTraverseNode()
581 if (Expr *NE = T->getNoexceptExpr()) in dataTraverseNode()
584 if (LE->hasExplicitResultType()) in dataTraverseNode()
586 TraverseStmt(LE->getTrailingRequiresClause()); in dataTraverseNode()
589 TraverseStmt(LE->getBody()); in dataTraverseNode()
600 // For AST-nodes that don't have an identity, we can't memoize. in memoizedMatchesRecursively()
601 if (!Node.getMemoizationData() || !Builder->isComparable()) in memoizedMatchesRecursively()
610 // Memoize result even doing a single-level match, it might be expensive. in memoizedMatchesRecursively()
614 *Builder = I->second.Nodes; in memoizedMatchesRecursively()
615 return I->second.ResultOfMatch; in memoizedMatchesRecursively()
880 OS << D->getDeclKindName() << "Decl "; in dumpNode()
882 ND->printQualifiedName(OS); in dumpNode()
886 D->getSourceRange().print(OS, Ctx.getSourceManager()); in dumpNode()
888 OS << S->getStmtClassName() << " : "; in dumpNode()
889 S->getSourceRange().print(OS, Ctx.getSourceManager()); in dumpNode()
891 OS << T->getTypeClassName() << "Type : "; in dumpNode()
895 QT->print(OS, Ctx.getPrintingPolicy()); in dumpNode()
916 } else if (const auto *TAL = State.getNode<TemplateArgumentLoc>()) { in dumpNodeFromState() local
917 dumpNode(Ctx, DynTypedNode::create(*TAL), OS); in dumpNodeFromState()
939 OS << "ASTMatcher: Processing '" << CB->getID() << "' against:\n\t"; in print()
941 const BoundNodes::IDToNodeMap &Map = Nodes->getMap(); in print()
946 OS << "\n--- Bound Nodes Begin ---\n"; in print()
948 OS << " " << Item.first << " - { "; in print()
952 OS << "--- Bound Nodes End ---\n"; in print()
954 OS << "ASTMatcher: Matching '" << CB->getID() << "' against:\n\t"; in print()
967 : MV(V), MB(V->TraversingASTNodeNotSpelledInSource) { in ASTNodeNotSpelledInSourceScope()
968 V->TraversingASTNodeNotSpelledInSource = B; in ASTNodeNotSpelledInSourceScope()
971 MV->TraversingASTNodeNotSpelledInSource = MB; in ~ASTNodeNotSpelledInSourceScope()
981 : MV(V), MB(V->TraversingASTNodeNotAsIs) { in ASTNodeNotAsIsSourceScope()
982 V->TraversingASTNodeNotAsIs = B; in ASTNodeNotAsIsSourceScope()
984 ~ASTNodeNotAsIsSourceScope() { MV->TraversingASTNodeNotAsIs = MB; } in ~ASTNodeNotAsIsSourceScope()
1010 *NewBucket -= Now; in setBucket()
1028 Timer.setBucket(&TimeByBucket[MP.second->getID()]); in matchWithoutFilter()
1042 it != MatcherFiltersMap.end() ? it->second : getFilterForKind(Kind); in matchWithFilter()
1049 auto &Matchers = this->Matchers->DeclOrStmt; in matchWithFilter()
1053 Timer.setBucket(&TimeByBucket[MP.second->getID()]); in matchWithFilter()
1073 auto &Matchers = this->Matchers->DeclOrStmt; in getFilterForKind()
1093 matchWithoutFilter(QualType(Node, 0), Matchers->Type); in matchDispatch()
1096 matchWithoutFilter(*Node, Matchers->TypeLoc); in matchDispatch()
1099 matchWithoutFilter(*Node, Matchers->Type); in matchDispatch()
1102 matchWithoutFilter(*Node, Matchers->NestedNameSpecifier); in matchDispatch()
1105 matchWithoutFilter(*Node, Matchers->NestedNameSpecifierLoc); in matchDispatch()
1108 matchWithoutFilter(*Node, Matchers->CtorInit); in matchDispatch()
1111 matchWithoutFilter(*Node, Matchers->TemplateArgumentLoc); in matchDispatch()
1114 matchWithoutFilter(*Node, Matchers->Attr); in matchDispatch()
1123 for (const auto &Parent : ActiveASTContext->getParents(Node)) { in matchesParentOf()
1171 if (Builder->isComparable()) { in matchesAnyAncestorOf()
1183 *Builder = I->second.Nodes; in matchesAnyAncestorOf()
1184 return Finish(I->second.ResultOfMatch); in matchesAnyAncestorOf()
1188 Parents = ActiveASTContext->getParents(Node); in matchesAnyAncestorOf()
1214 llvm::any_of(ActiveASTContext->getTraversalScope(), [](Decl *D) { in matchesAnyAncestorOf()
1215 return D->getKind() == Decl::TranslationUnit; in matchesAnyAncestorOf()
1235 for (const auto &Parent : ActiveASTContext->getParents(Queue.front())) { in matchesAnyAncestorOf()
1269 TraversalKindScope RAII(*Context, Callback->getCheckTraversalKind()); in visitMatch()
1271 Callback->run(MatchFinder::MatchResult(BoundNodesView, Context)); in visitMatch()
1285 ActiveASTContext->getCanonicalType(TypeNode); in typeHasMatchingAlias()
1289 for (const TypedefNameDecl *Alias : Aliases->second) { in typeHasMatchingAlias()
1306 for (const ObjCCompatibleAliasDecl *Alias : Aliases->second) { in objcClassHasMatchingCompatibilityAlias()
1337 // Maps an Objective-C interface to its ObjCCompatibleAliasDecls.
1342 // Maps (matcher, node) -> the match result for memoization.
1349 if (auto *RD = TypeNode->getAsCXXRecordDecl()) in getAsCXXRecordDeclOrPrimaryTemplate()
1353 auto *TemplateType = TypeNode->getAs<TemplateSpecializationType>(); in getAsCXXRecordDeclOrPrimaryTemplate()
1354 while (TemplateType && TemplateType->isTypeAlias()) in getAsCXXRecordDeclOrPrimaryTemplate()
1356 TemplateType->getAliasedType()->getAs<TemplateSpecializationType>(); in getAsCXXRecordDeclOrPrimaryTemplate()
1362 TemplateType->getTemplateName().getAsTemplateDecl())) in getAsCXXRecordDeclOrPrimaryTemplate()
1363 return ClassTemplate->getTemplatedDecl(); in getAsCXXRecordDeclOrPrimaryTemplate()
1383 if (!Declaration->hasDefinition()) in classIsDerivedFromImpl()
1387 for (const auto &It : Declaration->bases()) { in classIsDerivedFromImpl()
1415 // Returns true if the given Objective-C class is directly or indirectly
1422 for (const ObjCInterfaceDecl *ClassDecl = Declaration->getSuperClass(); in objcClassIsDerivedFrom()
1423 ClassDecl != nullptr; ClassDecl = ClassDecl->getSuperClass()) { in objcClassIsDerivedFrom()
1429 const Type *TypeNode = ClassDecl->getTypeForDecl(); in objcClassIsDerivedFrom()
1450 TraversingASTNodeNotSpelledInSource || DeclNode->isImplicit(); in TraverseDecl()
1454 auto SK = CTSD->getSpecializationKind(); in TraverseDecl()
1459 if (FD->isDefaulted()) in TraverseDecl()
1461 if (FD->isTemplateInstantiation()) in TraverseDecl()
1494 // that the TypeLocs are structurally a shadow-hierarchy to the expressed in TraverseTypeLoc()
1515 // because the traversal is already done in the parallel "Loc"-hierarchy. in TraverseNestedNameSpecifierLoc()
1530 if (!CtorInit->isWritten()) in TraverseConstructorInitializer()
1560 ParsingDone->run(); in HandleTranslationUnit()
1562 Finder->matchAST(Context); in HandleTranslationUnit()
1575 SourceManager(&Context->getSourceManager()) {} in MatchResult()
1589 TK = Action->getCheckTraversalKind(); in addMatcher()
1607 TK = Action->getCheckTraversalKind(); in addMatcher()