diff options
Diffstat (limited to 'lib/ASTMatchers')
| -rw-r--r-- | lib/ASTMatchers/ASTMatchFinder.cpp | 37 | ||||
| -rw-r--r-- | lib/ASTMatchers/ASTMatchersInternal.cpp | 40 | ||||
| -rw-r--r-- | lib/ASTMatchers/Dynamic/Marshallers.h | 50 | ||||
| -rw-r--r-- | lib/ASTMatchers/Dynamic/Parser.cpp | 30 | ||||
| -rw-r--r-- | lib/ASTMatchers/Dynamic/Registry.cpp | 16 | ||||
| -rw-r--r-- | lib/ASTMatchers/Dynamic/VariantValue.cpp | 2 |
6 files changed, 111 insertions, 64 deletions
diff --git a/lib/ASTMatchers/ASTMatchFinder.cpp b/lib/ASTMatchers/ASTMatchFinder.cpp index 02aee4b46ddd1..63f8395b82778 100644 --- a/lib/ASTMatchers/ASTMatchFinder.cpp +++ b/lib/ASTMatchers/ASTMatchFinder.cpp @@ -145,17 +145,22 @@ public: ScopedIncrement ScopedDepth(&CurrentDepth); return (DeclNode == nullptr) || traverse(*DeclNode); } - bool TraverseStmt(Stmt *StmtNode) { + bool TraverseStmt(Stmt *StmtNode, DataRecursionQueue *Queue = nullptr) { + // If we need to keep track of the depth, we can't perform data recursion. + if (CurrentDepth == 0 || (CurrentDepth <= MaxDepth && MaxDepth < INT_MAX)) + Queue = nullptr; + ScopedIncrement ScopedDepth(&CurrentDepth); - const Stmt *StmtToTraverse = StmtNode; - if (Traversal == - ASTMatchFinder::TK_IgnoreImplicitCastsAndParentheses) { - const Expr *ExprNode = dyn_cast_or_null<Expr>(StmtNode); - if (ExprNode) { + Stmt *StmtToTraverse = StmtNode; + if (Traversal == ASTMatchFinder::TK_IgnoreImplicitCastsAndParentheses) { + if (Expr *ExprNode = dyn_cast_or_null<Expr>(StmtNode)) StmtToTraverse = ExprNode->IgnoreParenImpCasts(); - } } - return (StmtToTraverse == nullptr) || traverse(*StmtToTraverse); + if (!StmtToTraverse) + return true; + if (!match(*StmtToTraverse)) + return false; + return VisitorBase::TraverseStmt(StmtToTraverse, Queue); } // We assume that the QualType and the contained type are on the same // hierarchy level. Thus, we try to match either of them. @@ -378,7 +383,7 @@ public: } bool TraverseDecl(Decl *DeclNode); - bool TraverseStmt(Stmt *StmtNode); + bool TraverseStmt(Stmt *StmtNode, DataRecursionQueue *Queue = nullptr); bool TraverseType(QualType TypeNode); bool TraverseTypeLoc(TypeLoc TypeNode); bool TraverseNestedNameSpecifier(NestedNameSpecifier *NNS); @@ -506,7 +511,7 @@ private: TimeBucketRegion() : Bucket(nullptr) {} ~TimeBucketRegion() { setBucket(nullptr); } - /// \brief Start timing for \p NewBucket. + /// Start timing for \p NewBucket. /// /// If there was a bucket already set, it will finish the timing for that /// other bucket. @@ -529,7 +534,7 @@ private: llvm::TimeRecord *Bucket; }; - /// \brief Runs all the \p Matchers on \p Node. + /// Runs all the \p Matchers on \p Node. /// /// Used by \c matchDispatch() below. template <typename T, typename MC> @@ -585,7 +590,7 @@ private: } /// @{ - /// \brief Overloads to pair the different node types to their matchers. + /// Overloads to pair the different node types to their matchers. void matchDispatch(const Decl *Node) { return matchWithFilter(ast_type_traits::DynTypedNode::create(*Node)); } @@ -747,14 +752,14 @@ private: return false; } - /// \brief Bucket to record map. + /// Bucket to record map. /// /// Used to get the appropriate bucket for each matcher. llvm::StringMap<llvm::TimeRecord> TimeByBucket; const MatchFinder::MatchersByType *Matchers; - /// \brief Filtered list of matcher indices for each matcher kind. + /// Filtered list of matcher indices for each matcher kind. /// /// \c Decl and \c Stmt toplevel matchers usually apply to a specific node /// kind (and derived kinds) so it is a waste to try every matcher on every @@ -841,12 +846,12 @@ bool MatchASTVisitor::TraverseDecl(Decl *DeclNode) { return RecursiveASTVisitor<MatchASTVisitor>::TraverseDecl(DeclNode); } -bool MatchASTVisitor::TraverseStmt(Stmt *StmtNode) { +bool MatchASTVisitor::TraverseStmt(Stmt *StmtNode, DataRecursionQueue *Queue) { if (!StmtNode) { return true; } match(*StmtNode); - return RecursiveASTVisitor<MatchASTVisitor>::TraverseStmt(StmtNode); + return RecursiveASTVisitor<MatchASTVisitor>::TraverseStmt(StmtNode, Queue); } bool MatchASTVisitor::TraverseType(QualType TypeNode) { diff --git a/lib/ASTMatchers/ASTMatchersInternal.cpp b/lib/ASTMatchers/ASTMatchersInternal.cpp index 0bcdd8e328048..9cea2f5efc5ba 100644 --- a/lib/ASTMatchers/ASTMatchersInternal.cpp +++ b/lib/ASTMatchers/ASTMatchersInternal.cpp @@ -38,6 +38,16 @@ namespace clang { namespace ast_matchers { + +AST_MATCHER_P(ObjCMessageExpr, hasAnySelectorMatcher, std::vector<std::string>, + Matches) { + std::string SelString = Node.getSelector().getAsString(); + for (const std::string &S : Matches) + if (S == SelString) + return true; + return false; +} + namespace internal { bool NotUnaryOperator(const ast_type_traits::DynTypedNode &DynNode, @@ -108,7 +118,7 @@ private: const IntrusiveRefCntPtr<DynMatcherInterface> InnerMatcher; }; -/// \brief A matcher that always returns true. +/// A matcher that always returns true. /// /// We only ever need one instance of this matcher, so we create a global one /// and reuse it to reduce the overhead of the matcher and increase the chance @@ -315,12 +325,22 @@ bool AnyOfVariadicOperator(const ast_type_traits::DynTypedNode &DynNode, return false; } -Matcher<NamedDecl> hasAnyNameFunc(ArrayRef<const StringRef *> NameRefs) { +inline static +std::vector<std::string> vectorFromRefs(ArrayRef<const StringRef *> NameRefs) { std::vector<std::string> Names; for (auto *Name : NameRefs) Names.emplace_back(*Name); - return internal::Matcher<NamedDecl>( - new internal::HasNameMatcher(std::move(Names))); + return Names; +} + +Matcher<NamedDecl> hasAnyNameFunc(ArrayRef<const StringRef *> NameRefs) { + std::vector<std::string> Names = vectorFromRefs(NameRefs); + return internal::Matcher<NamedDecl>(new internal::HasNameMatcher(Names)); +} + +Matcher<ObjCMessageExpr> hasAnySelectorFunc( + ArrayRef<const StringRef *> NameRefs) { + return hasAnySelectorMatcher(vectorFromRefs(NameRefs)); } HasNameMatcher::HasNameMatcher(std::vector<std::string> N) @@ -393,7 +413,8 @@ public: /// Return true if there are still any patterns left. bool consumeNameSuffix(StringRef NodeName, bool CanSkip) { for (size_t I = 0; I < Patterns.size();) { - if (internal::consumeNameSuffix(Patterns[I].P, NodeName) || + if (::clang::ast_matchers::internal::consumeNameSuffix(Patterns[I].P, + NodeName) || CanSkip) { ++I; } else { @@ -527,6 +548,8 @@ bool HasNameMatcher::matchesNode(const NamedDecl &Node) const { } // end namespace internal +const internal::VariadicDynCastAllOfMatcher<Stmt, ObjCAutoreleasePoolStmt> + autoreleasePoolStmt; const internal::VariadicDynCastAllOfMatcher<Decl, TranslationUnitDecl> translationUnitDecl; const internal::VariadicDynCastAllOfMatcher<Decl, TypedefDecl> typedefDecl; @@ -605,6 +628,8 @@ const internal::VariadicDynCastAllOfMatcher<Decl, ObjCCategoryImplDecl> objcCategoryImplDecl; const internal::VariadicDynCastAllOfMatcher<Decl, ObjCMethodDecl> objcMethodDecl; +const internal::VariadicDynCastAllOfMatcher<Decl, BlockDecl> + blockDecl; const internal::VariadicDynCastAllOfMatcher<Decl, ObjCIvarDecl> objcIvarDecl; const internal::VariadicDynCastAllOfMatcher<Decl, ObjCPropertyDecl> objcPropertyDecl; @@ -654,6 +679,7 @@ const internal::VariadicDynCastAllOfMatcher<Stmt, CXXOperatorCallExpr> cxxOperatorCallExpr; const internal::VariadicDynCastAllOfMatcher<Stmt, Expr> expr; const internal::VariadicDynCastAllOfMatcher<Stmt, DeclRefExpr> declRefExpr; +const internal::VariadicDynCastAllOfMatcher<Stmt, ObjCIvarRefExpr> objcIvarRefExpr; const internal::VariadicDynCastAllOfMatcher<Stmt, IfStmt> ifStmt; const internal::VariadicDynCastAllOfMatcher<Stmt, ForStmt> forStmt; const internal::VariadicDynCastAllOfMatcher<Stmt, CXXForRangeStmt> @@ -739,6 +765,9 @@ const internal::VariadicOperatorMatcherFunc< const internal::VariadicFunction<internal::Matcher<NamedDecl>, StringRef, internal::hasAnyNameFunc> hasAnyName = {}; +const internal::VariadicFunction<internal::Matcher<ObjCMessageExpr>, StringRef, + internal::hasAnySelectorFunc> + hasAnySelector = {}; const internal::ArgumentAdaptingMatcherFunc<internal::HasMatcher> has = {}; const internal::ArgumentAdaptingMatcherFunc<internal::HasDescendantMatcher> hasDescendant = {}; @@ -772,6 +801,7 @@ const AstTypeMatcher<IncompleteArrayType> incompleteArrayType; const AstTypeMatcher<VariableArrayType> variableArrayType; const AstTypeMatcher<AtomicType> atomicType; const AstTypeMatcher<AutoType> autoType; +const AstTypeMatcher<DecltypeType> decltypeType; const AstTypeMatcher<FunctionType> functionType; const AstTypeMatcher<FunctionProtoType> functionProtoType; const AstTypeMatcher<ParenType> parenType; diff --git a/lib/ASTMatchers/Dynamic/Marshallers.h b/lib/ASTMatchers/Dynamic/Marshallers.h index af90e2c7eca1d..c6c89351afd3c 100644 --- a/lib/ASTMatchers/Dynamic/Marshallers.h +++ b/lib/ASTMatchers/Dynamic/Marshallers.h @@ -8,7 +8,7 @@ //===----------------------------------------------------------------------===// // /// \file -/// \brief Functions templates and classes to wrap matcher construct functions. +/// Functions templates and classes to wrap matcher construct functions. /// /// A collection of template function and classes that provide a generic /// marshalling layer on top of matcher construct functions. @@ -47,7 +47,7 @@ namespace ast_matchers { namespace dynamic { namespace internal { -/// \brief Helper template class to just from argument type to the right is/get +/// Helper template class to just from argument type to the right is/get /// functions in VariantValue. /// Used to verify and extract the matcher arguments below. template <class T> struct ArgTypeTraits; @@ -166,7 +166,7 @@ public: } }; -/// \brief Matcher descriptor interface. +/// Matcher descriptor interface. /// /// Provides a \c create() method that constructs the matcher from the provided /// arguments, and various other methods for type introspection. @@ -222,7 +222,7 @@ inline bool isRetKindConvertibleTo( return false; } -/// \brief Simple callback implementation. Marshaller and function are provided. +/// Simple callback implementation. Marshaller and function are provided. /// /// This class wraps a function of arbitrary signature and a marshaller /// function into a MatcherDescriptor. @@ -279,7 +279,7 @@ private: const std::vector<ArgKind> ArgKinds; }; -/// \brief Helper methods to extract and merge all possible typed matchers +/// Helper methods to extract and merge all possible typed matchers /// out of the polymorphic object. template <class PolyMatcher> static void mergePolyMatchers(const PolyMatcher &Poly, @@ -293,7 +293,7 @@ static void mergePolyMatchers(const PolyMatcher &Poly, mergePolyMatchers(Poly, Out, typename TypeList::tail()); } -/// \brief Convert the return values of the functions into a VariantMatcher. +/// Convert the return values of the functions into a VariantMatcher. /// /// There are 2 cases right now: The return value is a Matcher<T> or is a /// polymorphic matcher. For the former, we just construct the VariantMatcher. @@ -347,7 +347,7 @@ struct BuildReturnTypeVector<ast_matchers::internal::BindableMatcher<T>> { } }; -/// \brief Variadic marshaller function. +/// Variadic marshaller function. template <typename ResultT, typename ArgT, ResultT (*Func)(ArrayRef<const ArgT *>)> VariantMatcher @@ -383,7 +383,7 @@ variadicMatcherDescriptor(StringRef MatcherName, SourceRange NameRange, return Out; } -/// \brief Matcher descriptor for variadic functions. +/// Matcher descriptor for variadic functions. /// /// This class simply wraps a VariadicFunction with the right signature to export /// it as a MatcherDescriptor. @@ -436,7 +436,7 @@ private: const ArgKind ArgsKind; }; -/// \brief Return CK_Trivial when appropriate for VariadicDynCastAllOfMatchers. +/// Return CK_Trivial when appropriate for VariadicDynCastAllOfMatchers. class DynCastAllOfMatcherDescriptor : public VariadicFuncMatcherDescriptor { public: template <typename BaseT, typename DerivedT> @@ -470,7 +470,7 @@ private: const ast_type_traits::ASTNodeKind DerivedKind; }; -/// \brief Helper macros to check the arguments on all marshaller functions. +/// Helper macros to check the arguments on all marshaller functions. #define CHECK_ARG_COUNT(count) \ if (Args.size() != count) { \ Error->addError(NameRange, Error->ET_RegistryWrongArgCount) \ @@ -486,7 +486,7 @@ private: return VariantMatcher(); \ } -/// \brief 0-arg marshaller function. +/// 0-arg marshaller function. template <typename ReturnType> static VariantMatcher matcherMarshall0(void (*Func)(), StringRef MatcherName, SourceRange NameRange, @@ -497,7 +497,7 @@ static VariantMatcher matcherMarshall0(void (*Func)(), StringRef MatcherName, return outvalueToVariantMatcher(reinterpret_cast<FuncType>(Func)()); } -/// \brief 1-arg marshaller function. +/// 1-arg marshaller function. template <typename ReturnType, typename ArgType1> static VariantMatcher matcherMarshall1(void (*Func)(), StringRef MatcherName, SourceRange NameRange, @@ -510,7 +510,7 @@ static VariantMatcher matcherMarshall1(void (*Func)(), StringRef MatcherName, ArgTypeTraits<ArgType1>::get(Args[0].Value))); } -/// \brief 2-arg marshaller function. +/// 2-arg marshaller function. template <typename ReturnType, typename ArgType1, typename ArgType2> static VariantMatcher matcherMarshall2(void (*Func)(), StringRef MatcherName, SourceRange NameRange, @@ -528,7 +528,7 @@ static VariantMatcher matcherMarshall2(void (*Func)(), StringRef MatcherName, #undef CHECK_ARG_COUNT #undef CHECK_ARG_TYPE -/// \brief Helper class used to collect all the possible overloads of an +/// Helper class used to collect all the possible overloads of an /// argument adaptative matcher function. template <template <typename ToArg, typename FromArg> class ArgumentAdapterT, typename FromTypes, typename ToTypes> @@ -544,10 +544,10 @@ private: using AdaptativeFunc = ast_matchers::internal::ArgumentAdaptingMatcherFunc< ArgumentAdapterT, FromTypes, ToTypes>; - /// \brief End case for the recursion + /// End case for the recursion static void collect(ast_matchers::internal::EmptyTypeList) {} - /// \brief Recursive case. Get the overload for the head of the list, and + /// Recursive case. Get the overload for the head of the list, and /// recurse to the tail. template <typename FromTypeList> inline void collect(FromTypeList); @@ -556,7 +556,7 @@ private: std::vector<std::unique_ptr<MatcherDescriptor>> &Out; }; -/// \brief MatcherDescriptor that wraps multiple "overloads" of the same +/// MatcherDescriptor that wraps multiple "overloads" of the same /// matcher. /// /// It will try every overload and generate appropriate errors for when none or @@ -635,7 +635,7 @@ private: std::vector<std::unique_ptr<MatcherDescriptor>> Overloads; }; -/// \brief Variadic operator marshaller function. +/// Variadic operator marshaller function. class VariadicOperatorMatcherDescriptor : public MatcherDescriptor { public: using VarOp = DynTypedMatcher::VariadicOperator; @@ -701,7 +701,7 @@ private: /// Helper functions to select the appropriate marshaller functions. /// They detect the number of arguments, arguments types and return type. -/// \brief 0-arg overload +/// 0-arg overload template <typename ReturnType> std::unique_ptr<MatcherDescriptor> makeMatcherAutoMarshall(ReturnType (*Func)(), StringRef MatcherName) { @@ -712,7 +712,7 @@ makeMatcherAutoMarshall(ReturnType (*Func)(), StringRef MatcherName) { MatcherName, RetTypes, None); } -/// \brief 1-arg overload +/// 1-arg overload template <typename ReturnType, typename ArgType1> std::unique_ptr<MatcherDescriptor> makeMatcherAutoMarshall(ReturnType (*Func)(ArgType1), StringRef MatcherName) { @@ -724,7 +724,7 @@ makeMatcherAutoMarshall(ReturnType (*Func)(ArgType1), StringRef MatcherName) { reinterpret_cast<void (*)()>(Func), MatcherName, RetTypes, AK); } -/// \brief 2-arg overload +/// 2-arg overload template <typename ReturnType, typename ArgType1, typename ArgType2> std::unique_ptr<MatcherDescriptor> makeMatcherAutoMarshall(ReturnType (*Func)(ArgType1, ArgType2), @@ -738,7 +738,7 @@ makeMatcherAutoMarshall(ReturnType (*Func)(ArgType1, ArgType2), reinterpret_cast<void (*)()>(Func), MatcherName, RetTypes, AKs); } -/// \brief Variadic overload. +/// Variadic overload. template <typename ResultT, typename ArgT, ResultT (*Func)(ArrayRef<const ArgT *>)> std::unique_ptr<MatcherDescriptor> makeMatcherAutoMarshall( @@ -747,7 +747,7 @@ std::unique_ptr<MatcherDescriptor> makeMatcherAutoMarshall( return llvm::make_unique<VariadicFuncMatcherDescriptor>(VarFunc, MatcherName); } -/// \brief Overload for VariadicDynCastAllOfMatchers. +/// Overload for VariadicDynCastAllOfMatchers. /// /// Not strictly necessary, but DynCastAllOfMatcherDescriptor gives us better /// completion results for that type of matcher. @@ -759,7 +759,7 @@ std::unique_ptr<MatcherDescriptor> makeMatcherAutoMarshall( return llvm::make_unique<DynCastAllOfMatcherDescriptor>(VarFunc, MatcherName); } -/// \brief Argument adaptative overload. +/// Argument adaptative overload. template <template <typename ToArg, typename FromArg> class ArgumentAdapterT, typename FromTypes, typename ToTypes> std::unique_ptr<MatcherDescriptor> makeMatcherAutoMarshall( @@ -782,7 +782,7 @@ inline void AdaptativeOverloadCollector<ArgumentAdapterT, FromTypes, collect(typename FromTypeList::tail()); } -/// \brief Variadic operator overload. +/// Variadic operator overload. template <unsigned MinCount, unsigned MaxCount> std::unique_ptr<MatcherDescriptor> makeMatcherAutoMarshall( ast_matchers::internal::VariadicOperatorMatcherFunc<MinCount, MaxCount> diff --git a/lib/ASTMatchers/Dynamic/Parser.cpp b/lib/ASTMatchers/Dynamic/Parser.cpp index 89e1a2695860c..da8df907ba7fa 100644 --- a/lib/ASTMatchers/Dynamic/Parser.cpp +++ b/lib/ASTMatchers/Dynamic/Parser.cpp @@ -8,7 +8,7 @@ //===----------------------------------------------------------------------===// /// /// \file -/// \brief Recursive parser implementation for the matcher expression grammar. +/// Recursive parser implementation for the matcher expression grammar. /// //===----------------------------------------------------------------------===// @@ -34,9 +34,9 @@ namespace clang { namespace ast_matchers { namespace dynamic { -/// \brief Simple structure to hold information for one token from the parser. +/// Simple structure to hold information for one token from the parser. struct Parser::TokenInfo { - /// \brief Different possible tokens. + /// Different possible tokens. enum TokenKind { TK_Eof, TK_OpenParen, @@ -50,7 +50,7 @@ struct Parser::TokenInfo { TK_CodeCompletion }; - /// \brief Some known identifiers. + /// Some known identifiers. static const char* const ID_Bind; TokenInfo() = default; @@ -63,7 +63,7 @@ struct Parser::TokenInfo { const char* const Parser::TokenInfo::ID_Bind = "bind"; -/// \brief Simple tokenizer for the parser. +/// Simple tokenizer for the parser. class Parser::CodeTokenizer { public: explicit CodeTokenizer(StringRef MatcherCode, Diagnostics *Error) @@ -78,10 +78,10 @@ public: NextToken = getNextToken(); } - /// \brief Returns but doesn't consume the next token. + /// Returns but doesn't consume the next token. const TokenInfo &peekNextToken() const { return NextToken; } - /// \brief Consumes and returns the next token. + /// Consumes and returns the next token. TokenInfo consumeNextToken() { TokenInfo ThisToken = NextToken; NextToken = getNextToken(); @@ -185,7 +185,7 @@ private: return Result; } - /// \brief Consume an unsigned and float literal. + /// Consume an unsigned and float literal. void consumeNumberLiteral(TokenInfo *Result) { bool isFloatingLiteral = false; unsigned Length = 1; @@ -238,7 +238,7 @@ private: Result->Kind = TokenInfo::TK_Error; } - /// \brief Consume a string literal. + /// Consume a string literal. /// /// \c Code must be positioned at the start of the literal (the opening /// quote). Consumed until it finds the same closing quote character. @@ -272,7 +272,7 @@ private: Result->Kind = TokenInfo::TK_Error; } - /// \brief Consume all leading whitespace from \c Code. + /// Consume all leading whitespace from \c Code. void consumeWhitespace() { while (!Code.empty() && isWhitespace(Code[0])) { if (Code[0] == '\n') { @@ -326,7 +326,7 @@ struct Parser::ScopedContextEntry { } }; -/// \brief Parse expressions that start with an identifier. +/// Parse expressions that start with an identifier. /// /// This function can parse named values and matchers. /// In case of failure it will try to determine the user's intent to give @@ -359,7 +359,7 @@ bool Parser::parseIdentifierPrefixImpl(VariantValue *Value) { return parseMatcherExpressionImpl(NameToken, Value); } -/// \brief Parse and validate a matcher expression. +/// Parse and validate a matcher expression. /// \return \c true on success, in which case \c Value has the matcher parsed. /// If the input is malformed, or some argument has an error, it /// returns \c false. @@ -524,7 +524,7 @@ void Parser::addExpressionCompletions() { } } -/// \brief Parse an <Expresssion> +/// Parse an <Expression> bool Parser::parseExpressionImpl(VariantValue *Value) { switch (Tokenizer->nextTokenKind()) { case TokenInfo::TK_Literal: @@ -619,8 +619,8 @@ Parser::completeExpression(StringRef Code, unsigned CompletionOffset, Sema *S, P.parseExpressionImpl(&Dummy); // Sort by specificity, then by name. - std::sort(P.Completions.begin(), P.Completions.end(), - [](const MatcherCompletion &A, const MatcherCompletion &B) { + llvm::sort(P.Completions.begin(), P.Completions.end(), + [](const MatcherCompletion &A, const MatcherCompletion &B) { if (A.Specificity != B.Specificity) return A.Specificity > B.Specificity; return A.TypedText < B.TypedText; diff --git a/lib/ASTMatchers/Dynamic/Registry.cpp b/lib/ASTMatchers/Dynamic/Registry.cpp index 2b7bb7a2120d1..4d2d76f6a75bf 100644 --- a/lib/ASTMatchers/Dynamic/Registry.cpp +++ b/lib/ASTMatchers/Dynamic/Registry.cpp @@ -8,7 +8,7 @@ //===----------------------------------------------------------------------===// // /// \file -/// \brief Registry map populated at static initialization time. +/// Registry map populated at static initialization time. // //===----------------------------------------------------------------------===// @@ -90,7 +90,7 @@ void RegistryMaps::registerMatcher( REGISTER_MATCHER_OVERLOAD(name); \ } while (false) -/// \brief Generate a registry map with all the known matchers. +/// Generate a registry map with all the known matchers. RegistryMaps::RegistryMaps() { // TODO: Here is the list of the missing matchers, grouped by reason. // @@ -134,8 +134,10 @@ RegistryMaps::RegistryMaps() { REGISTER_MATCHER(atomicExpr); REGISTER_MATCHER(atomicType); REGISTER_MATCHER(autoType); + REGISTER_MATCHER(autoreleasePoolStmt) REGISTER_MATCHER(binaryOperator); REGISTER_MATCHER(binaryConditionalOperator); + REGISTER_MATCHER(blockDecl); REGISTER_MATCHER(blockPointerType); REGISTER_MATCHER(booleanType); REGISTER_MATCHER(breakStmt); @@ -186,6 +188,7 @@ RegistryMaps::RegistryMaps() { REGISTER_MATCHER(decayedType); REGISTER_MATCHER(decl); REGISTER_MATCHER(declaratorDecl); + REGISTER_MATCHER(decltypeType); REGISTER_MATCHER(declCountIs); REGISTER_MATCHER(declRefExpr); REGISTER_MATCHER(declStmt); @@ -281,11 +284,13 @@ RegistryMaps::RegistryMaps() { REGISTER_MATCHER(hasParent); REGISTER_MATCHER(hasQualifier); REGISTER_MATCHER(hasRangeInit); + REGISTER_MATCHER(hasReceiver); REGISTER_MATCHER(hasReceiverType); REGISTER_MATCHER(hasReplacementType); REGISTER_MATCHER(hasReturnValue); REGISTER_MATCHER(hasRHS); REGISTER_MATCHER(hasSelector); + REGISTER_MATCHER(hasAnySelector); REGISTER_MATCHER(hasSingleDecl); REGISTER_MATCHER(hasSize); REGISTER_MATCHER(hasSizeExpr); @@ -296,6 +301,7 @@ RegistryMaps::RegistryMaps() { REGISTER_MATCHER(hasTemplateArgument); REGISTER_MATCHER(hasThen); REGISTER_MATCHER(hasThreadStorageDuration); + REGISTER_MATCHER(hasTrailingReturn); REGISTER_MATCHER(hasTrueExpression); REGISTER_MATCHER(hasTypeLoc); REGISTER_MATCHER(hasUnaryOperand); @@ -321,6 +327,7 @@ RegistryMaps::RegistryMaps() { REGISTER_MATCHER(isAnyPointer); REGISTER_MATCHER(isArray); REGISTER_MATCHER(isArrow); + REGISTER_MATCHER(isAssignmentOperator); REGISTER_MATCHER(isBaseInitializer); REGISTER_MATCHER(isBitField); REGISTER_MATCHER(isCatchAll); @@ -344,6 +351,7 @@ RegistryMaps::RegistryMaps() { REGISTER_MATCHER(isImplicit); REGISTER_MATCHER(isExpansionInFileMatching); REGISTER_MATCHER(isExpansionInMainFile); + REGISTER_MATCHER(isInstanceMessage); REGISTER_MATCHER(isInstantiated); REGISTER_MATCHER(isExpansionInSystemHeader); REGISTER_MATCHER(isInteger); @@ -351,15 +359,18 @@ RegistryMaps::RegistryMaps() { REGISTER_MATCHER(isInTemplateInstantiation); REGISTER_MATCHER(isLambda); REGISTER_MATCHER(isListInitialization); + REGISTER_MATCHER(isMain); REGISTER_MATCHER(isMemberInitializer); REGISTER_MATCHER(isMoveAssignmentOperator); REGISTER_MATCHER(isMoveConstructor); + REGISTER_MATCHER(isNoReturn); REGISTER_MATCHER(isNoThrow); REGISTER_MATCHER(isOverride); REGISTER_MATCHER(isPrivate); REGISTER_MATCHER(isProtected); REGISTER_MATCHER(isPublic); REGISTER_MATCHER(isPure); + REGISTER_MATCHER(isScoped); REGISTER_MATCHER(isSignedInteger); REGISTER_MATCHER(isStaticStorageClass); REGISTER_MATCHER(isStruct); @@ -399,6 +410,7 @@ RegistryMaps::RegistryMaps() { REGISTER_MATCHER(objcImplementationDecl); REGISTER_MATCHER(objcInterfaceDecl); REGISTER_MATCHER(objcIvarDecl); + REGISTER_MATCHER(objcIvarRefExpr); REGISTER_MATCHER(objcMessageExpr); REGISTER_MATCHER(objcMethodDecl); REGISTER_MATCHER(objcObjectPointerType); diff --git a/lib/ASTMatchers/Dynamic/VariantValue.cpp b/lib/ASTMatchers/Dynamic/VariantValue.cpp index 57858d00acb45..06d95eaa7563e 100644 --- a/lib/ASTMatchers/Dynamic/VariantValue.cpp +++ b/lib/ASTMatchers/Dynamic/VariantValue.cpp @@ -8,7 +8,7 @@ //===----------------------------------------------------------------------===// /// /// \file -/// \brief Polymorphic value type. +/// Polymorphic value type. /// //===----------------------------------------------------------------------===// |
