17330f729Sjoerg //===- Marshallers.h - Generic matcher function marshallers -----*- C++ -*-===// 27330f729Sjoerg // 37330f729Sjoerg // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 47330f729Sjoerg // See https://llvm.org/LICENSE.txt for license information. 57330f729Sjoerg // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 67330f729Sjoerg // 77330f729Sjoerg //===----------------------------------------------------------------------===// 87330f729Sjoerg // 97330f729Sjoerg /// \file 107330f729Sjoerg /// Functions templates and classes to wrap matcher construct functions. 117330f729Sjoerg /// 127330f729Sjoerg /// A collection of template function and classes that provide a generic 137330f729Sjoerg /// marshalling layer on top of matcher construct functions. 147330f729Sjoerg /// These are used by the registry to export all marshaller constructors with 157330f729Sjoerg /// the same generic interface. 167330f729Sjoerg // 177330f729Sjoerg //===----------------------------------------------------------------------===// 187330f729Sjoerg 197330f729Sjoerg #ifndef LLVM_CLANG_LIB_ASTMATCHERS_DYNAMIC_MARSHALLERS_H 207330f729Sjoerg #define LLVM_CLANG_LIB_ASTMATCHERS_DYNAMIC_MARSHALLERS_H 217330f729Sjoerg 227330f729Sjoerg #include "clang/AST/ASTTypeTraits.h" 237330f729Sjoerg #include "clang/AST/OperationKinds.h" 247330f729Sjoerg #include "clang/ASTMatchers/ASTMatchersInternal.h" 257330f729Sjoerg #include "clang/ASTMatchers/Dynamic/Diagnostics.h" 267330f729Sjoerg #include "clang/ASTMatchers/Dynamic/VariantValue.h" 277330f729Sjoerg #include "clang/Basic/AttrKinds.h" 287330f729Sjoerg #include "clang/Basic/LLVM.h" 297330f729Sjoerg #include "clang/Basic/OpenMPKinds.h" 30*e038c9c4Sjoerg #include "clang/Basic/TypeTraits.h" 317330f729Sjoerg #include "llvm/ADT/ArrayRef.h" 327330f729Sjoerg #include "llvm/ADT/None.h" 33*e038c9c4Sjoerg #include "llvm/ADT/Optional.h" 347330f729Sjoerg #include "llvm/ADT/STLExtras.h" 357330f729Sjoerg #include "llvm/ADT/StringRef.h" 367330f729Sjoerg #include "llvm/ADT/StringSwitch.h" 377330f729Sjoerg #include "llvm/ADT/Twine.h" 38*e038c9c4Sjoerg #include "llvm/Support/Regex.h" 397330f729Sjoerg #include <cassert> 407330f729Sjoerg #include <cstddef> 417330f729Sjoerg #include <iterator> 427330f729Sjoerg #include <limits> 437330f729Sjoerg #include <memory> 447330f729Sjoerg #include <string> 457330f729Sjoerg #include <utility> 467330f729Sjoerg #include <vector> 477330f729Sjoerg 487330f729Sjoerg namespace clang { 497330f729Sjoerg namespace ast_matchers { 507330f729Sjoerg namespace dynamic { 517330f729Sjoerg namespace internal { 527330f729Sjoerg 537330f729Sjoerg /// Helper template class to just from argument type to the right is/get 547330f729Sjoerg /// functions in VariantValue. 557330f729Sjoerg /// Used to verify and extract the matcher arguments below. 567330f729Sjoerg template <class T> struct ArgTypeTraits; 577330f729Sjoerg template <class T> struct ArgTypeTraits<const T &> : public ArgTypeTraits<T> { 587330f729Sjoerg }; 597330f729Sjoerg 607330f729Sjoerg template <> struct ArgTypeTraits<std::string> { 61*e038c9c4Sjoerg static bool hasCorrectType(const VariantValue &Value) { 62*e038c9c4Sjoerg return Value.isString(); 63*e038c9c4Sjoerg } 64*e038c9c4Sjoerg static bool hasCorrectValue(const VariantValue &Value) { return true; } 657330f729Sjoerg 667330f729Sjoerg static const std::string &get(const VariantValue &Value) { 677330f729Sjoerg return Value.getString(); 687330f729Sjoerg } 697330f729Sjoerg 707330f729Sjoerg static ArgKind getKind() { 717330f729Sjoerg return ArgKind(ArgKind::AK_String); 727330f729Sjoerg } 73*e038c9c4Sjoerg 74*e038c9c4Sjoerg static llvm::Optional<std::string> getBestGuess(const VariantValue &) { 75*e038c9c4Sjoerg return llvm::None; 76*e038c9c4Sjoerg } 777330f729Sjoerg }; 787330f729Sjoerg 797330f729Sjoerg template <> 807330f729Sjoerg struct ArgTypeTraits<StringRef> : public ArgTypeTraits<std::string> { 817330f729Sjoerg }; 827330f729Sjoerg 837330f729Sjoerg template <class T> struct ArgTypeTraits<ast_matchers::internal::Matcher<T>> { 84*e038c9c4Sjoerg static bool hasCorrectType(const VariantValue& Value) { 85*e038c9c4Sjoerg return Value.isMatcher(); 86*e038c9c4Sjoerg } 87*e038c9c4Sjoerg static bool hasCorrectValue(const VariantValue &Value) { 88*e038c9c4Sjoerg return Value.getMatcher().hasTypedMatcher<T>(); 897330f729Sjoerg } 907330f729Sjoerg 917330f729Sjoerg static ast_matchers::internal::Matcher<T> get(const VariantValue &Value) { 927330f729Sjoerg return Value.getMatcher().getTypedMatcher<T>(); 937330f729Sjoerg } 947330f729Sjoerg 957330f729Sjoerg static ArgKind getKind() { 96*e038c9c4Sjoerg return ArgKind::MakeMatcherArg(ASTNodeKind::getFromNodeKind<T>()); 97*e038c9c4Sjoerg } 98*e038c9c4Sjoerg 99*e038c9c4Sjoerg static llvm::Optional<std::string> getBestGuess(const VariantValue &) { 100*e038c9c4Sjoerg return llvm::None; 1017330f729Sjoerg } 1027330f729Sjoerg }; 1037330f729Sjoerg 1047330f729Sjoerg template <> struct ArgTypeTraits<bool> { 105*e038c9c4Sjoerg static bool hasCorrectType(const VariantValue &Value) { 106*e038c9c4Sjoerg return Value.isBoolean(); 107*e038c9c4Sjoerg } 108*e038c9c4Sjoerg static bool hasCorrectValue(const VariantValue &Value) { return true; } 1097330f729Sjoerg 1107330f729Sjoerg static bool get(const VariantValue &Value) { 1117330f729Sjoerg return Value.getBoolean(); 1127330f729Sjoerg } 1137330f729Sjoerg 1147330f729Sjoerg static ArgKind getKind() { 1157330f729Sjoerg return ArgKind(ArgKind::AK_Boolean); 1167330f729Sjoerg } 117*e038c9c4Sjoerg 118*e038c9c4Sjoerg static llvm::Optional<std::string> getBestGuess(const VariantValue &) { 119*e038c9c4Sjoerg return llvm::None; 120*e038c9c4Sjoerg } 1217330f729Sjoerg }; 1227330f729Sjoerg 1237330f729Sjoerg template <> struct ArgTypeTraits<double> { 124*e038c9c4Sjoerg static bool hasCorrectType(const VariantValue &Value) { 125*e038c9c4Sjoerg return Value.isDouble(); 126*e038c9c4Sjoerg } 127*e038c9c4Sjoerg static bool hasCorrectValue(const VariantValue &Value) { return true; } 1287330f729Sjoerg 1297330f729Sjoerg static double get(const VariantValue &Value) { 1307330f729Sjoerg return Value.getDouble(); 1317330f729Sjoerg } 1327330f729Sjoerg 1337330f729Sjoerg static ArgKind getKind() { 1347330f729Sjoerg return ArgKind(ArgKind::AK_Double); 1357330f729Sjoerg } 136*e038c9c4Sjoerg 137*e038c9c4Sjoerg static llvm::Optional<std::string> getBestGuess(const VariantValue &) { 138*e038c9c4Sjoerg return llvm::None; 139*e038c9c4Sjoerg } 1407330f729Sjoerg }; 1417330f729Sjoerg 1427330f729Sjoerg template <> struct ArgTypeTraits<unsigned> { 143*e038c9c4Sjoerg static bool hasCorrectType(const VariantValue &Value) { 144*e038c9c4Sjoerg return Value.isUnsigned(); 145*e038c9c4Sjoerg } 146*e038c9c4Sjoerg static bool hasCorrectValue(const VariantValue &Value) { return true; } 1477330f729Sjoerg 1487330f729Sjoerg static unsigned get(const VariantValue &Value) { 1497330f729Sjoerg return Value.getUnsigned(); 1507330f729Sjoerg } 1517330f729Sjoerg 1527330f729Sjoerg static ArgKind getKind() { 1537330f729Sjoerg return ArgKind(ArgKind::AK_Unsigned); 1547330f729Sjoerg } 155*e038c9c4Sjoerg 156*e038c9c4Sjoerg static llvm::Optional<std::string> getBestGuess(const VariantValue &) { 157*e038c9c4Sjoerg return llvm::None; 158*e038c9c4Sjoerg } 1597330f729Sjoerg }; 1607330f729Sjoerg 1617330f729Sjoerg template <> struct ArgTypeTraits<attr::Kind> { 1627330f729Sjoerg private: 1637330f729Sjoerg static Optional<attr::Kind> getAttrKind(llvm::StringRef AttrKind) { 164*e038c9c4Sjoerg if (!AttrKind.consume_front("attr::")) 165*e038c9c4Sjoerg return llvm::None; 1667330f729Sjoerg return llvm::StringSwitch<Optional<attr::Kind>>(AttrKind) 167*e038c9c4Sjoerg #define ATTR(X) .Case(#X, attr::X) 1687330f729Sjoerg #include "clang/Basic/AttrList.inc" 1697330f729Sjoerg .Default(llvm::None); 1707330f729Sjoerg } 1717330f729Sjoerg 1727330f729Sjoerg public: 173*e038c9c4Sjoerg static bool hasCorrectType(const VariantValue &Value) { 174*e038c9c4Sjoerg return Value.isString(); 175*e038c9c4Sjoerg } 176*e038c9c4Sjoerg static bool hasCorrectValue(const VariantValue& Value) { 177*e038c9c4Sjoerg return getAttrKind(Value.getString()).hasValue(); 1787330f729Sjoerg } 1797330f729Sjoerg 1807330f729Sjoerg static attr::Kind get(const VariantValue &Value) { 1817330f729Sjoerg return *getAttrKind(Value.getString()); 1827330f729Sjoerg } 1837330f729Sjoerg 1847330f729Sjoerg static ArgKind getKind() { 1857330f729Sjoerg return ArgKind(ArgKind::AK_String); 1867330f729Sjoerg } 187*e038c9c4Sjoerg 188*e038c9c4Sjoerg static llvm::Optional<std::string> getBestGuess(const VariantValue &Value); 1897330f729Sjoerg }; 1907330f729Sjoerg 1917330f729Sjoerg template <> struct ArgTypeTraits<CastKind> { 1927330f729Sjoerg private: 1937330f729Sjoerg static Optional<CastKind> getCastKind(llvm::StringRef AttrKind) { 194*e038c9c4Sjoerg if (!AttrKind.consume_front("CK_")) 195*e038c9c4Sjoerg return llvm::None; 1967330f729Sjoerg return llvm::StringSwitch<Optional<CastKind>>(AttrKind) 1977330f729Sjoerg #define CAST_OPERATION(Name) .Case(#Name, CK_##Name) 1987330f729Sjoerg #include "clang/AST/OperationKinds.def" 1997330f729Sjoerg .Default(llvm::None); 2007330f729Sjoerg } 2017330f729Sjoerg 2027330f729Sjoerg public: 203*e038c9c4Sjoerg static bool hasCorrectType(const VariantValue &Value) { 204*e038c9c4Sjoerg return Value.isString(); 205*e038c9c4Sjoerg } 206*e038c9c4Sjoerg static bool hasCorrectValue(const VariantValue& Value) { 207*e038c9c4Sjoerg return getCastKind(Value.getString()).hasValue(); 2087330f729Sjoerg } 2097330f729Sjoerg 2107330f729Sjoerg static CastKind get(const VariantValue &Value) { 2117330f729Sjoerg return *getCastKind(Value.getString()); 2127330f729Sjoerg } 2137330f729Sjoerg 2147330f729Sjoerg static ArgKind getKind() { 2157330f729Sjoerg return ArgKind(ArgKind::AK_String); 2167330f729Sjoerg } 217*e038c9c4Sjoerg 218*e038c9c4Sjoerg static llvm::Optional<std::string> getBestGuess(const VariantValue &Value); 219*e038c9c4Sjoerg }; 220*e038c9c4Sjoerg 221*e038c9c4Sjoerg template <> struct ArgTypeTraits<llvm::Regex::RegexFlags> { 222*e038c9c4Sjoerg private: 223*e038c9c4Sjoerg static Optional<llvm::Regex::RegexFlags> getFlags(llvm::StringRef Flags); 224*e038c9c4Sjoerg 225*e038c9c4Sjoerg public: 226*e038c9c4Sjoerg static bool hasCorrectType(const VariantValue &Value) { 227*e038c9c4Sjoerg return Value.isString(); 228*e038c9c4Sjoerg } 229*e038c9c4Sjoerg static bool hasCorrectValue(const VariantValue& Value) { 230*e038c9c4Sjoerg return getFlags(Value.getString()).hasValue(); 231*e038c9c4Sjoerg } 232*e038c9c4Sjoerg 233*e038c9c4Sjoerg static llvm::Regex::RegexFlags get(const VariantValue &Value) { 234*e038c9c4Sjoerg return *getFlags(Value.getString()); 235*e038c9c4Sjoerg } 236*e038c9c4Sjoerg 237*e038c9c4Sjoerg static ArgKind getKind() { return ArgKind(ArgKind::AK_String); } 238*e038c9c4Sjoerg 239*e038c9c4Sjoerg static llvm::Optional<std::string> getBestGuess(const VariantValue &Value); 2407330f729Sjoerg }; 2417330f729Sjoerg 2427330f729Sjoerg template <> struct ArgTypeTraits<OpenMPClauseKind> { 2437330f729Sjoerg private: 2447330f729Sjoerg static Optional<OpenMPClauseKind> getClauseKind(llvm::StringRef ClauseKind) { 2457330f729Sjoerg return llvm::StringSwitch<Optional<OpenMPClauseKind>>(ClauseKind) 246*e038c9c4Sjoerg #define GEN_CLANG_CLAUSE_CLASS 247*e038c9c4Sjoerg #define CLAUSE_CLASS(Enum, Str, Class) .Case(#Enum, llvm::omp::Clause::Enum) 248*e038c9c4Sjoerg #include "llvm/Frontend/OpenMP/OMP.inc" 2497330f729Sjoerg .Default(llvm::None); 2507330f729Sjoerg } 2517330f729Sjoerg 2527330f729Sjoerg public: 253*e038c9c4Sjoerg static bool hasCorrectType(const VariantValue &Value) { 254*e038c9c4Sjoerg return Value.isString(); 255*e038c9c4Sjoerg } 256*e038c9c4Sjoerg static bool hasCorrectValue(const VariantValue& Value) { 257*e038c9c4Sjoerg return getClauseKind(Value.getString()).hasValue(); 2587330f729Sjoerg } 2597330f729Sjoerg 2607330f729Sjoerg static OpenMPClauseKind get(const VariantValue &Value) { 2617330f729Sjoerg return *getClauseKind(Value.getString()); 2627330f729Sjoerg } 2637330f729Sjoerg 2647330f729Sjoerg static ArgKind getKind() { return ArgKind(ArgKind::AK_String); } 265*e038c9c4Sjoerg 266*e038c9c4Sjoerg static llvm::Optional<std::string> getBestGuess(const VariantValue &Value); 267*e038c9c4Sjoerg }; 268*e038c9c4Sjoerg 269*e038c9c4Sjoerg template <> struct ArgTypeTraits<UnaryExprOrTypeTrait> { 270*e038c9c4Sjoerg private: 271*e038c9c4Sjoerg static Optional<UnaryExprOrTypeTrait> 272*e038c9c4Sjoerg getUnaryOrTypeTraitKind(llvm::StringRef ClauseKind) { 273*e038c9c4Sjoerg if (!ClauseKind.consume_front("UETT_")) 274*e038c9c4Sjoerg return llvm::None; 275*e038c9c4Sjoerg return llvm::StringSwitch<Optional<UnaryExprOrTypeTrait>>(ClauseKind) 276*e038c9c4Sjoerg #define UNARY_EXPR_OR_TYPE_TRAIT(Spelling, Name, Key) .Case(#Name, UETT_##Name) 277*e038c9c4Sjoerg #define CXX11_UNARY_EXPR_OR_TYPE_TRAIT(Spelling, Name, Key) \ 278*e038c9c4Sjoerg .Case(#Name, UETT_##Name) 279*e038c9c4Sjoerg #include "clang/Basic/TokenKinds.def" 280*e038c9c4Sjoerg .Default(llvm::None); 281*e038c9c4Sjoerg } 282*e038c9c4Sjoerg 283*e038c9c4Sjoerg public: 284*e038c9c4Sjoerg static bool hasCorrectType(const VariantValue &Value) { 285*e038c9c4Sjoerg return Value.isString(); 286*e038c9c4Sjoerg } 287*e038c9c4Sjoerg static bool hasCorrectValue(const VariantValue& Value) { 288*e038c9c4Sjoerg return getUnaryOrTypeTraitKind(Value.getString()).hasValue(); 289*e038c9c4Sjoerg } 290*e038c9c4Sjoerg 291*e038c9c4Sjoerg static UnaryExprOrTypeTrait get(const VariantValue &Value) { 292*e038c9c4Sjoerg return *getUnaryOrTypeTraitKind(Value.getString()); 293*e038c9c4Sjoerg } 294*e038c9c4Sjoerg 295*e038c9c4Sjoerg static ArgKind getKind() { return ArgKind(ArgKind::AK_String); } 296*e038c9c4Sjoerg 297*e038c9c4Sjoerg static llvm::Optional<std::string> getBestGuess(const VariantValue &Value); 2987330f729Sjoerg }; 2997330f729Sjoerg 3007330f729Sjoerg /// Matcher descriptor interface. 3017330f729Sjoerg /// 3027330f729Sjoerg /// Provides a \c create() method that constructs the matcher from the provided 3037330f729Sjoerg /// arguments, and various other methods for type introspection. 3047330f729Sjoerg class MatcherDescriptor { 3057330f729Sjoerg public: 3067330f729Sjoerg virtual ~MatcherDescriptor() = default; 3077330f729Sjoerg 3087330f729Sjoerg virtual VariantMatcher create(SourceRange NameRange, 3097330f729Sjoerg ArrayRef<ParserValue> Args, 3107330f729Sjoerg Diagnostics *Error) const = 0; 3117330f729Sjoerg 312*e038c9c4Sjoerg virtual ASTNodeKind nodeMatcherType() const { return ASTNodeKind(); } 313*e038c9c4Sjoerg 314*e038c9c4Sjoerg virtual bool isBuilderMatcher() const { return false; } 315*e038c9c4Sjoerg 316*e038c9c4Sjoerg virtual std::unique_ptr<MatcherDescriptor> 317*e038c9c4Sjoerg buildMatcherCtor(SourceRange NameRange, ArrayRef<ParserValue> Args, 318*e038c9c4Sjoerg Diagnostics *Error) const { 319*e038c9c4Sjoerg return {}; 320*e038c9c4Sjoerg } 321*e038c9c4Sjoerg 3227330f729Sjoerg /// Returns whether the matcher is variadic. Variadic matchers can take any 3237330f729Sjoerg /// number of arguments, but they must be of the same type. 3247330f729Sjoerg virtual bool isVariadic() const = 0; 3257330f729Sjoerg 3267330f729Sjoerg /// Returns the number of arguments accepted by the matcher if not variadic. 3277330f729Sjoerg virtual unsigned getNumArgs() const = 0; 3287330f729Sjoerg 3297330f729Sjoerg /// Given that the matcher is being converted to type \p ThisKind, append the 3307330f729Sjoerg /// set of argument types accepted for argument \p ArgNo to \p ArgKinds. 3317330f729Sjoerg // FIXME: We should provide the ability to constrain the output of this 3327330f729Sjoerg // function based on the types of other matcher arguments. 333*e038c9c4Sjoerg virtual void getArgKinds(ASTNodeKind ThisKind, unsigned ArgNo, 3347330f729Sjoerg std::vector<ArgKind> &ArgKinds) const = 0; 3357330f729Sjoerg 3367330f729Sjoerg /// Returns whether this matcher is convertible to the given type. If it is 3377330f729Sjoerg /// so convertible, store in *Specificity a value corresponding to the 3387330f729Sjoerg /// "specificity" of the converted matcher to the given context, and in 3397330f729Sjoerg /// *LeastDerivedKind the least derived matcher kind which would result in the 3407330f729Sjoerg /// same matcher overload. Zero specificity indicates that this conversion 3417330f729Sjoerg /// would produce a trivial matcher that will either always or never match. 3427330f729Sjoerg /// Such matchers are excluded from code completion results. 343*e038c9c4Sjoerg virtual bool 344*e038c9c4Sjoerg isConvertibleTo(ASTNodeKind Kind, unsigned *Specificity = nullptr, 345*e038c9c4Sjoerg ASTNodeKind *LeastDerivedKind = nullptr) const = 0; 3467330f729Sjoerg 3477330f729Sjoerg /// Returns whether the matcher will, given a matcher of any type T, yield a 3487330f729Sjoerg /// matcher of type T. 3497330f729Sjoerg virtual bool isPolymorphic() const { return false; } 3507330f729Sjoerg }; 3517330f729Sjoerg 352*e038c9c4Sjoerg inline bool isRetKindConvertibleTo(ArrayRef<ASTNodeKind> RetKinds, 353*e038c9c4Sjoerg ASTNodeKind Kind, unsigned *Specificity, 354*e038c9c4Sjoerg ASTNodeKind *LeastDerivedKind) { 355*e038c9c4Sjoerg for (const ASTNodeKind &NodeKind : RetKinds) { 356*e038c9c4Sjoerg if (ArgKind::MakeMatcherArg(NodeKind).isConvertibleTo( 357*e038c9c4Sjoerg ArgKind::MakeMatcherArg(Kind), Specificity)) { 3587330f729Sjoerg if (LeastDerivedKind) 3597330f729Sjoerg *LeastDerivedKind = NodeKind; 3607330f729Sjoerg return true; 3617330f729Sjoerg } 3627330f729Sjoerg } 3637330f729Sjoerg return false; 3647330f729Sjoerg } 3657330f729Sjoerg 3667330f729Sjoerg /// Simple callback implementation. Marshaller and function are provided. 3677330f729Sjoerg /// 3687330f729Sjoerg /// This class wraps a function of arbitrary signature and a marshaller 3697330f729Sjoerg /// function into a MatcherDescriptor. 3707330f729Sjoerg /// The marshaller is in charge of taking the VariantValue arguments, checking 3717330f729Sjoerg /// their types, unpacking them and calling the underlying function. 3727330f729Sjoerg class FixedArgCountMatcherDescriptor : public MatcherDescriptor { 3737330f729Sjoerg public: 3747330f729Sjoerg using MarshallerType = VariantMatcher (*)(void (*Func)(), 3757330f729Sjoerg StringRef MatcherName, 3767330f729Sjoerg SourceRange NameRange, 3777330f729Sjoerg ArrayRef<ParserValue> Args, 3787330f729Sjoerg Diagnostics *Error); 3797330f729Sjoerg 3807330f729Sjoerg /// \param Marshaller Function to unpack the arguments and call \c Func 3817330f729Sjoerg /// \param Func Matcher construct function. This is the function that 3827330f729Sjoerg /// compile-time matcher expressions would use to create the matcher. 3837330f729Sjoerg /// \param RetKinds The list of matcher types to which the matcher is 3847330f729Sjoerg /// convertible. 3857330f729Sjoerg /// \param ArgKinds The types of the arguments this matcher takes. 386*e038c9c4Sjoerg FixedArgCountMatcherDescriptor(MarshallerType Marshaller, void (*Func)(), 387*e038c9c4Sjoerg StringRef MatcherName, 388*e038c9c4Sjoerg ArrayRef<ASTNodeKind> RetKinds, 3897330f729Sjoerg ArrayRef<ArgKind> ArgKinds) 3907330f729Sjoerg : Marshaller(Marshaller), Func(Func), MatcherName(MatcherName), 3917330f729Sjoerg RetKinds(RetKinds.begin(), RetKinds.end()), 3927330f729Sjoerg ArgKinds(ArgKinds.begin(), ArgKinds.end()) {} 3937330f729Sjoerg 3947330f729Sjoerg VariantMatcher create(SourceRange NameRange, 3957330f729Sjoerg ArrayRef<ParserValue> Args, 3967330f729Sjoerg Diagnostics *Error) const override { 3977330f729Sjoerg return Marshaller(Func, MatcherName, NameRange, Args, Error); 3987330f729Sjoerg } 3997330f729Sjoerg 4007330f729Sjoerg bool isVariadic() const override { return false; } 4017330f729Sjoerg unsigned getNumArgs() const override { return ArgKinds.size(); } 4027330f729Sjoerg 403*e038c9c4Sjoerg void getArgKinds(ASTNodeKind ThisKind, unsigned ArgNo, 4047330f729Sjoerg std::vector<ArgKind> &Kinds) const override { 4057330f729Sjoerg Kinds.push_back(ArgKinds[ArgNo]); 4067330f729Sjoerg } 4077330f729Sjoerg 408*e038c9c4Sjoerg bool isConvertibleTo(ASTNodeKind Kind, unsigned *Specificity, 409*e038c9c4Sjoerg ASTNodeKind *LeastDerivedKind) const override { 4107330f729Sjoerg return isRetKindConvertibleTo(RetKinds, Kind, Specificity, 4117330f729Sjoerg LeastDerivedKind); 4127330f729Sjoerg } 4137330f729Sjoerg 4147330f729Sjoerg private: 4157330f729Sjoerg const MarshallerType Marshaller; 4167330f729Sjoerg void (* const Func)(); 4177330f729Sjoerg const std::string MatcherName; 418*e038c9c4Sjoerg const std::vector<ASTNodeKind> RetKinds; 4197330f729Sjoerg const std::vector<ArgKind> ArgKinds; 4207330f729Sjoerg }; 4217330f729Sjoerg 4227330f729Sjoerg /// Helper methods to extract and merge all possible typed matchers 4237330f729Sjoerg /// out of the polymorphic object. 4247330f729Sjoerg template <class PolyMatcher> 4257330f729Sjoerg static void mergePolyMatchers(const PolyMatcher &Poly, 4267330f729Sjoerg std::vector<DynTypedMatcher> &Out, 4277330f729Sjoerg ast_matchers::internal::EmptyTypeList) {} 4287330f729Sjoerg 4297330f729Sjoerg template <class PolyMatcher, class TypeList> 4307330f729Sjoerg static void mergePolyMatchers(const PolyMatcher &Poly, 4317330f729Sjoerg std::vector<DynTypedMatcher> &Out, TypeList) { 4327330f729Sjoerg Out.push_back(ast_matchers::internal::Matcher<typename TypeList::head>(Poly)); 4337330f729Sjoerg mergePolyMatchers(Poly, Out, typename TypeList::tail()); 4347330f729Sjoerg } 4357330f729Sjoerg 4367330f729Sjoerg /// Convert the return values of the functions into a VariantMatcher. 4377330f729Sjoerg /// 4387330f729Sjoerg /// There are 2 cases right now: The return value is a Matcher<T> or is a 4397330f729Sjoerg /// polymorphic matcher. For the former, we just construct the VariantMatcher. 4407330f729Sjoerg /// For the latter, we instantiate all the possible Matcher<T> of the poly 4417330f729Sjoerg /// matcher. 442*e038c9c4Sjoerg inline VariantMatcher outvalueToVariantMatcher(const DynTypedMatcher &Matcher) { 4437330f729Sjoerg return VariantMatcher::SingleMatcher(Matcher); 4447330f729Sjoerg } 4457330f729Sjoerg 4467330f729Sjoerg template <typename T> 4477330f729Sjoerg static VariantMatcher outvalueToVariantMatcher(const T &PolyMatcher, 4487330f729Sjoerg typename T::ReturnTypes * = 4497330f729Sjoerg nullptr) { 4507330f729Sjoerg std::vector<DynTypedMatcher> Matchers; 4517330f729Sjoerg mergePolyMatchers(PolyMatcher, Matchers, typename T::ReturnTypes()); 4527330f729Sjoerg VariantMatcher Out = VariantMatcher::PolymorphicMatcher(std::move(Matchers)); 4537330f729Sjoerg return Out; 4547330f729Sjoerg } 4557330f729Sjoerg 4567330f729Sjoerg template <typename T> 457*e038c9c4Sjoerg inline void 458*e038c9c4Sjoerg buildReturnTypeVectorFromTypeList(std::vector<ASTNodeKind> &RetTypes) { 459*e038c9c4Sjoerg RetTypes.push_back(ASTNodeKind::getFromNodeKind<typename T::head>()); 4607330f729Sjoerg buildReturnTypeVectorFromTypeList<typename T::tail>(RetTypes); 4617330f729Sjoerg } 4627330f729Sjoerg 4637330f729Sjoerg template <> 4647330f729Sjoerg inline void 4657330f729Sjoerg buildReturnTypeVectorFromTypeList<ast_matchers::internal::EmptyTypeList>( 466*e038c9c4Sjoerg std::vector<ASTNodeKind> &RetTypes) {} 4677330f729Sjoerg 4687330f729Sjoerg template <typename T> 4697330f729Sjoerg struct BuildReturnTypeVector { 470*e038c9c4Sjoerg static void build(std::vector<ASTNodeKind> &RetTypes) { 4717330f729Sjoerg buildReturnTypeVectorFromTypeList<typename T::ReturnTypes>(RetTypes); 4727330f729Sjoerg } 4737330f729Sjoerg }; 4747330f729Sjoerg 4757330f729Sjoerg template <typename T> 4767330f729Sjoerg struct BuildReturnTypeVector<ast_matchers::internal::Matcher<T>> { 477*e038c9c4Sjoerg static void build(std::vector<ASTNodeKind> &RetTypes) { 478*e038c9c4Sjoerg RetTypes.push_back(ASTNodeKind::getFromNodeKind<T>()); 4797330f729Sjoerg } 4807330f729Sjoerg }; 4817330f729Sjoerg 4827330f729Sjoerg template <typename T> 4837330f729Sjoerg struct BuildReturnTypeVector<ast_matchers::internal::BindableMatcher<T>> { 484*e038c9c4Sjoerg static void build(std::vector<ASTNodeKind> &RetTypes) { 485*e038c9c4Sjoerg RetTypes.push_back(ASTNodeKind::getFromNodeKind<T>()); 4867330f729Sjoerg } 4877330f729Sjoerg }; 4887330f729Sjoerg 4897330f729Sjoerg /// Variadic marshaller function. 4907330f729Sjoerg template <typename ResultT, typename ArgT, 4917330f729Sjoerg ResultT (*Func)(ArrayRef<const ArgT *>)> 4927330f729Sjoerg VariantMatcher 4937330f729Sjoerg variadicMatcherDescriptor(StringRef MatcherName, SourceRange NameRange, 4947330f729Sjoerg ArrayRef<ParserValue> Args, Diagnostics *Error) { 495*e038c9c4Sjoerg SmallVector<ArgT *, 8> InnerArgsPtr; 496*e038c9c4Sjoerg InnerArgsPtr.resize_for_overwrite(Args.size()); 497*e038c9c4Sjoerg SmallVector<ArgT, 8> InnerArgs; 498*e038c9c4Sjoerg InnerArgs.reserve(Args.size()); 4997330f729Sjoerg 5007330f729Sjoerg for (size_t i = 0, e = Args.size(); i != e; ++i) { 5017330f729Sjoerg using ArgTraits = ArgTypeTraits<ArgT>; 5027330f729Sjoerg 5037330f729Sjoerg const ParserValue &Arg = Args[i]; 5047330f729Sjoerg const VariantValue &Value = Arg.Value; 505*e038c9c4Sjoerg if (!ArgTraits::hasCorrectType(Value)) { 5067330f729Sjoerg Error->addError(Arg.Range, Error->ET_RegistryWrongArgType) 5077330f729Sjoerg << (i + 1) << ArgTraits::getKind().asString() << Value.getTypeAsString(); 508*e038c9c4Sjoerg return {}; 5097330f729Sjoerg } 510*e038c9c4Sjoerg if (!ArgTraits::hasCorrectValue(Value)) { 511*e038c9c4Sjoerg if (llvm::Optional<std::string> BestGuess = 512*e038c9c4Sjoerg ArgTraits::getBestGuess(Value)) { 513*e038c9c4Sjoerg Error->addError(Arg.Range, Error->ET_RegistryUnknownEnumWithReplace) 514*e038c9c4Sjoerg << i + 1 << Value.getString() << *BestGuess; 515*e038c9c4Sjoerg } else if (Value.isString()) { 516*e038c9c4Sjoerg Error->addError(Arg.Range, Error->ET_RegistryValueNotFound) 517*e038c9c4Sjoerg << Value.getString(); 518*e038c9c4Sjoerg } else { 519*e038c9c4Sjoerg // This isn't ideal, but it's better than reporting an empty string as 520*e038c9c4Sjoerg // the error in this case. 521*e038c9c4Sjoerg Error->addError(Arg.Range, Error->ET_RegistryWrongArgType) 522*e038c9c4Sjoerg << (i + 1) << ArgTraits::getKind().asString() 523*e038c9c4Sjoerg << Value.getTypeAsString(); 5247330f729Sjoerg } 525*e038c9c4Sjoerg return {}; 5267330f729Sjoerg } 527*e038c9c4Sjoerg InnerArgs.set_size(i + 1); 528*e038c9c4Sjoerg InnerArgsPtr[i] = new (&InnerArgs[i]) ArgT(ArgTraits::get(Value)); 5297330f729Sjoerg } 530*e038c9c4Sjoerg return outvalueToVariantMatcher(Func(InnerArgsPtr)); 5317330f729Sjoerg } 5327330f729Sjoerg 5337330f729Sjoerg /// Matcher descriptor for variadic functions. 5347330f729Sjoerg /// 5357330f729Sjoerg /// This class simply wraps a VariadicFunction with the right signature to export 5367330f729Sjoerg /// it as a MatcherDescriptor. 5377330f729Sjoerg /// This allows us to have one implementation of the interface for as many free 5387330f729Sjoerg /// functions as we want, reducing the number of symbols and size of the 5397330f729Sjoerg /// object file. 5407330f729Sjoerg class VariadicFuncMatcherDescriptor : public MatcherDescriptor { 5417330f729Sjoerg public: 5427330f729Sjoerg using RunFunc = VariantMatcher (*)(StringRef MatcherName, 5437330f729Sjoerg SourceRange NameRange, 5447330f729Sjoerg ArrayRef<ParserValue> Args, 5457330f729Sjoerg Diagnostics *Error); 5467330f729Sjoerg 5477330f729Sjoerg template <typename ResultT, typename ArgT, 5487330f729Sjoerg ResultT (*F)(ArrayRef<const ArgT *>)> 5497330f729Sjoerg VariadicFuncMatcherDescriptor( 5507330f729Sjoerg ast_matchers::internal::VariadicFunction<ResultT, ArgT, F> Func, 5517330f729Sjoerg StringRef MatcherName) 5527330f729Sjoerg : Func(&variadicMatcherDescriptor<ResultT, ArgT, F>), 5537330f729Sjoerg MatcherName(MatcherName.str()), 5547330f729Sjoerg ArgsKind(ArgTypeTraits<ArgT>::getKind()) { 5557330f729Sjoerg BuildReturnTypeVector<ResultT>::build(RetKinds); 5567330f729Sjoerg } 5577330f729Sjoerg 5587330f729Sjoerg VariantMatcher create(SourceRange NameRange, 5597330f729Sjoerg ArrayRef<ParserValue> Args, 5607330f729Sjoerg Diagnostics *Error) const override { 5617330f729Sjoerg return Func(MatcherName, NameRange, Args, Error); 5627330f729Sjoerg } 5637330f729Sjoerg 5647330f729Sjoerg bool isVariadic() const override { return true; } 5657330f729Sjoerg unsigned getNumArgs() const override { return 0; } 5667330f729Sjoerg 567*e038c9c4Sjoerg void getArgKinds(ASTNodeKind ThisKind, unsigned ArgNo, 5687330f729Sjoerg std::vector<ArgKind> &Kinds) const override { 5697330f729Sjoerg Kinds.push_back(ArgsKind); 5707330f729Sjoerg } 5717330f729Sjoerg 572*e038c9c4Sjoerg bool isConvertibleTo(ASTNodeKind Kind, unsigned *Specificity, 573*e038c9c4Sjoerg ASTNodeKind *LeastDerivedKind) const override { 5747330f729Sjoerg return isRetKindConvertibleTo(RetKinds, Kind, Specificity, 5757330f729Sjoerg LeastDerivedKind); 5767330f729Sjoerg } 5777330f729Sjoerg 578*e038c9c4Sjoerg ASTNodeKind nodeMatcherType() const override { return RetKinds[0]; } 579*e038c9c4Sjoerg 5807330f729Sjoerg private: 5817330f729Sjoerg const RunFunc Func; 5827330f729Sjoerg const std::string MatcherName; 583*e038c9c4Sjoerg std::vector<ASTNodeKind> RetKinds; 5847330f729Sjoerg const ArgKind ArgsKind; 5857330f729Sjoerg }; 5867330f729Sjoerg 5877330f729Sjoerg /// Return CK_Trivial when appropriate for VariadicDynCastAllOfMatchers. 5887330f729Sjoerg class DynCastAllOfMatcherDescriptor : public VariadicFuncMatcherDescriptor { 5897330f729Sjoerg public: 5907330f729Sjoerg template <typename BaseT, typename DerivedT> 5917330f729Sjoerg DynCastAllOfMatcherDescriptor( 5927330f729Sjoerg ast_matchers::internal::VariadicDynCastAllOfMatcher<BaseT, DerivedT> Func, 5937330f729Sjoerg StringRef MatcherName) 5947330f729Sjoerg : VariadicFuncMatcherDescriptor(Func, MatcherName), 595*e038c9c4Sjoerg DerivedKind(ASTNodeKind::getFromNodeKind<DerivedT>()) {} 5967330f729Sjoerg 597*e038c9c4Sjoerg bool isConvertibleTo(ASTNodeKind Kind, unsigned *Specificity, 598*e038c9c4Sjoerg ASTNodeKind *LeastDerivedKind) const override { 5997330f729Sjoerg // If Kind is not a base of DerivedKind, either DerivedKind is a base of 6007330f729Sjoerg // Kind (in which case the match will always succeed) or Kind and 6017330f729Sjoerg // DerivedKind are unrelated (in which case it will always fail), so set 6027330f729Sjoerg // Specificity to 0. 6037330f729Sjoerg if (VariadicFuncMatcherDescriptor::isConvertibleTo(Kind, Specificity, 6047330f729Sjoerg LeastDerivedKind)) { 6057330f729Sjoerg if (Kind.isSame(DerivedKind) || !Kind.isBaseOf(DerivedKind)) { 6067330f729Sjoerg if (Specificity) 6077330f729Sjoerg *Specificity = 0; 6087330f729Sjoerg } 6097330f729Sjoerg return true; 6107330f729Sjoerg } else { 6117330f729Sjoerg return false; 6127330f729Sjoerg } 6137330f729Sjoerg } 6147330f729Sjoerg 615*e038c9c4Sjoerg ASTNodeKind nodeMatcherType() const override { return DerivedKind; } 616*e038c9c4Sjoerg 6177330f729Sjoerg private: 618*e038c9c4Sjoerg const ASTNodeKind DerivedKind; 6197330f729Sjoerg }; 6207330f729Sjoerg 6217330f729Sjoerg /// Helper macros to check the arguments on all marshaller functions. 6227330f729Sjoerg #define CHECK_ARG_COUNT(count) \ 6237330f729Sjoerg if (Args.size() != count) { \ 6247330f729Sjoerg Error->addError(NameRange, Error->ET_RegistryWrongArgCount) \ 6257330f729Sjoerg << count << Args.size(); \ 6267330f729Sjoerg return VariantMatcher(); \ 6277330f729Sjoerg } 6287330f729Sjoerg 6297330f729Sjoerg #define CHECK_ARG_TYPE(index, type) \ 630*e038c9c4Sjoerg if (!ArgTypeTraits<type>::hasCorrectType(Args[index].Value)) { \ 6317330f729Sjoerg Error->addError(Args[index].Range, Error->ET_RegistryWrongArgType) \ 6327330f729Sjoerg << (index + 1) << ArgTypeTraits<type>::getKind().asString() \ 6337330f729Sjoerg << Args[index].Value.getTypeAsString(); \ 6347330f729Sjoerg return VariantMatcher(); \ 635*e038c9c4Sjoerg } \ 636*e038c9c4Sjoerg if (!ArgTypeTraits<type>::hasCorrectValue(Args[index].Value)) { \ 637*e038c9c4Sjoerg if (llvm::Optional<std::string> BestGuess = \ 638*e038c9c4Sjoerg ArgTypeTraits<type>::getBestGuess(Args[index].Value)) { \ 639*e038c9c4Sjoerg Error->addError(Args[index].Range, \ 640*e038c9c4Sjoerg Error->ET_RegistryUnknownEnumWithReplace) \ 641*e038c9c4Sjoerg << index + 1 << Args[index].Value.getString() << *BestGuess; \ 642*e038c9c4Sjoerg } else if (Args[index].Value.isString()) { \ 643*e038c9c4Sjoerg Error->addError(Args[index].Range, Error->ET_RegistryValueNotFound) \ 644*e038c9c4Sjoerg << Args[index].Value.getString(); \ 645*e038c9c4Sjoerg } \ 646*e038c9c4Sjoerg return VariantMatcher(); \ 6477330f729Sjoerg } 6487330f729Sjoerg 6497330f729Sjoerg /// 0-arg marshaller function. 6507330f729Sjoerg template <typename ReturnType> 6517330f729Sjoerg static VariantMatcher matcherMarshall0(void (*Func)(), StringRef MatcherName, 6527330f729Sjoerg SourceRange NameRange, 6537330f729Sjoerg ArrayRef<ParserValue> Args, 6547330f729Sjoerg Diagnostics *Error) { 6557330f729Sjoerg using FuncType = ReturnType (*)(); 6567330f729Sjoerg CHECK_ARG_COUNT(0); 6577330f729Sjoerg return outvalueToVariantMatcher(reinterpret_cast<FuncType>(Func)()); 6587330f729Sjoerg } 6597330f729Sjoerg 6607330f729Sjoerg /// 1-arg marshaller function. 6617330f729Sjoerg template <typename ReturnType, typename ArgType1> 6627330f729Sjoerg static VariantMatcher matcherMarshall1(void (*Func)(), StringRef MatcherName, 6637330f729Sjoerg SourceRange NameRange, 6647330f729Sjoerg ArrayRef<ParserValue> Args, 6657330f729Sjoerg Diagnostics *Error) { 6667330f729Sjoerg using FuncType = ReturnType (*)(ArgType1); 6677330f729Sjoerg CHECK_ARG_COUNT(1); 6687330f729Sjoerg CHECK_ARG_TYPE(0, ArgType1); 6697330f729Sjoerg return outvalueToVariantMatcher(reinterpret_cast<FuncType>(Func)( 6707330f729Sjoerg ArgTypeTraits<ArgType1>::get(Args[0].Value))); 6717330f729Sjoerg } 6727330f729Sjoerg 6737330f729Sjoerg /// 2-arg marshaller function. 6747330f729Sjoerg template <typename ReturnType, typename ArgType1, typename ArgType2> 6757330f729Sjoerg static VariantMatcher matcherMarshall2(void (*Func)(), StringRef MatcherName, 6767330f729Sjoerg SourceRange NameRange, 6777330f729Sjoerg ArrayRef<ParserValue> Args, 6787330f729Sjoerg Diagnostics *Error) { 6797330f729Sjoerg using FuncType = ReturnType (*)(ArgType1, ArgType2); 6807330f729Sjoerg CHECK_ARG_COUNT(2); 6817330f729Sjoerg CHECK_ARG_TYPE(0, ArgType1); 6827330f729Sjoerg CHECK_ARG_TYPE(1, ArgType2); 6837330f729Sjoerg return outvalueToVariantMatcher(reinterpret_cast<FuncType>(Func)( 6847330f729Sjoerg ArgTypeTraits<ArgType1>::get(Args[0].Value), 6857330f729Sjoerg ArgTypeTraits<ArgType2>::get(Args[1].Value))); 6867330f729Sjoerg } 6877330f729Sjoerg 6887330f729Sjoerg #undef CHECK_ARG_COUNT 6897330f729Sjoerg #undef CHECK_ARG_TYPE 6907330f729Sjoerg 6917330f729Sjoerg /// Helper class used to collect all the possible overloads of an 6927330f729Sjoerg /// argument adaptative matcher function. 6937330f729Sjoerg template <template <typename ToArg, typename FromArg> class ArgumentAdapterT, 6947330f729Sjoerg typename FromTypes, typename ToTypes> 6957330f729Sjoerg class AdaptativeOverloadCollector { 6967330f729Sjoerg public: 6977330f729Sjoerg AdaptativeOverloadCollector( 6987330f729Sjoerg StringRef Name, std::vector<std::unique_ptr<MatcherDescriptor>> &Out) 6997330f729Sjoerg : Name(Name), Out(Out) { 7007330f729Sjoerg collect(FromTypes()); 7017330f729Sjoerg } 7027330f729Sjoerg 7037330f729Sjoerg private: 7047330f729Sjoerg using AdaptativeFunc = ast_matchers::internal::ArgumentAdaptingMatcherFunc< 7057330f729Sjoerg ArgumentAdapterT, FromTypes, ToTypes>; 7067330f729Sjoerg 7077330f729Sjoerg /// End case for the recursion 7087330f729Sjoerg static void collect(ast_matchers::internal::EmptyTypeList) {} 7097330f729Sjoerg 7107330f729Sjoerg /// Recursive case. Get the overload for the head of the list, and 7117330f729Sjoerg /// recurse to the tail. 7127330f729Sjoerg template <typename FromTypeList> 7137330f729Sjoerg inline void collect(FromTypeList); 7147330f729Sjoerg 7157330f729Sjoerg StringRef Name; 7167330f729Sjoerg std::vector<std::unique_ptr<MatcherDescriptor>> &Out; 7177330f729Sjoerg }; 7187330f729Sjoerg 7197330f729Sjoerg /// MatcherDescriptor that wraps multiple "overloads" of the same 7207330f729Sjoerg /// matcher. 7217330f729Sjoerg /// 7227330f729Sjoerg /// It will try every overload and generate appropriate errors for when none or 7237330f729Sjoerg /// more than one overloads match the arguments. 7247330f729Sjoerg class OverloadedMatcherDescriptor : public MatcherDescriptor { 7257330f729Sjoerg public: 7267330f729Sjoerg OverloadedMatcherDescriptor( 7277330f729Sjoerg MutableArrayRef<std::unique_ptr<MatcherDescriptor>> Callbacks) 7287330f729Sjoerg : Overloads(std::make_move_iterator(Callbacks.begin()), 7297330f729Sjoerg std::make_move_iterator(Callbacks.end())) {} 7307330f729Sjoerg 7317330f729Sjoerg ~OverloadedMatcherDescriptor() override = default; 7327330f729Sjoerg 7337330f729Sjoerg VariantMatcher create(SourceRange NameRange, 7347330f729Sjoerg ArrayRef<ParserValue> Args, 7357330f729Sjoerg Diagnostics *Error) const override { 7367330f729Sjoerg std::vector<VariantMatcher> Constructed; 7377330f729Sjoerg Diagnostics::OverloadContext Ctx(Error); 7387330f729Sjoerg for (const auto &O : Overloads) { 7397330f729Sjoerg VariantMatcher SubMatcher = O->create(NameRange, Args, Error); 7407330f729Sjoerg if (!SubMatcher.isNull()) { 7417330f729Sjoerg Constructed.push_back(SubMatcher); 7427330f729Sjoerg } 7437330f729Sjoerg } 7447330f729Sjoerg 7457330f729Sjoerg if (Constructed.empty()) return VariantMatcher(); // No overload matched. 7467330f729Sjoerg // We ignore the errors if any matcher succeeded. 7477330f729Sjoerg Ctx.revertErrors(); 7487330f729Sjoerg if (Constructed.size() > 1) { 7497330f729Sjoerg // More than one constructed. It is ambiguous. 7507330f729Sjoerg Error->addError(NameRange, Error->ET_RegistryAmbiguousOverload); 7517330f729Sjoerg return VariantMatcher(); 7527330f729Sjoerg } 7537330f729Sjoerg return Constructed[0]; 7547330f729Sjoerg } 7557330f729Sjoerg 7567330f729Sjoerg bool isVariadic() const override { 7577330f729Sjoerg bool Overload0Variadic = Overloads[0]->isVariadic(); 7587330f729Sjoerg #ifndef NDEBUG 7597330f729Sjoerg for (const auto &O : Overloads) { 7607330f729Sjoerg assert(Overload0Variadic == O->isVariadic()); 7617330f729Sjoerg } 7627330f729Sjoerg #endif 7637330f729Sjoerg return Overload0Variadic; 7647330f729Sjoerg } 7657330f729Sjoerg 7667330f729Sjoerg unsigned getNumArgs() const override { 7677330f729Sjoerg unsigned Overload0NumArgs = Overloads[0]->getNumArgs(); 7687330f729Sjoerg #ifndef NDEBUG 7697330f729Sjoerg for (const auto &O : Overloads) { 7707330f729Sjoerg assert(Overload0NumArgs == O->getNumArgs()); 7717330f729Sjoerg } 7727330f729Sjoerg #endif 7737330f729Sjoerg return Overload0NumArgs; 7747330f729Sjoerg } 7757330f729Sjoerg 776*e038c9c4Sjoerg void getArgKinds(ASTNodeKind ThisKind, unsigned ArgNo, 7777330f729Sjoerg std::vector<ArgKind> &Kinds) const override { 7787330f729Sjoerg for (const auto &O : Overloads) { 7797330f729Sjoerg if (O->isConvertibleTo(ThisKind)) 7807330f729Sjoerg O->getArgKinds(ThisKind, ArgNo, Kinds); 7817330f729Sjoerg } 7827330f729Sjoerg } 7837330f729Sjoerg 784*e038c9c4Sjoerg bool isConvertibleTo(ASTNodeKind Kind, unsigned *Specificity, 785*e038c9c4Sjoerg ASTNodeKind *LeastDerivedKind) const override { 7867330f729Sjoerg for (const auto &O : Overloads) { 7877330f729Sjoerg if (O->isConvertibleTo(Kind, Specificity, LeastDerivedKind)) 7887330f729Sjoerg return true; 7897330f729Sjoerg } 7907330f729Sjoerg return false; 7917330f729Sjoerg } 7927330f729Sjoerg 7937330f729Sjoerg private: 7947330f729Sjoerg std::vector<std::unique_ptr<MatcherDescriptor>> Overloads; 7957330f729Sjoerg }; 7967330f729Sjoerg 797*e038c9c4Sjoerg template <typename ReturnType> 798*e038c9c4Sjoerg class RegexMatcherDescriptor : public MatcherDescriptor { 799*e038c9c4Sjoerg public: 800*e038c9c4Sjoerg RegexMatcherDescriptor(ReturnType (*WithFlags)(StringRef, 801*e038c9c4Sjoerg llvm::Regex::RegexFlags), 802*e038c9c4Sjoerg ReturnType (*NoFlags)(StringRef), 803*e038c9c4Sjoerg ArrayRef<ASTNodeKind> RetKinds) 804*e038c9c4Sjoerg : WithFlags(WithFlags), NoFlags(NoFlags), 805*e038c9c4Sjoerg RetKinds(RetKinds.begin(), RetKinds.end()) {} 806*e038c9c4Sjoerg bool isVariadic() const override { return true; } 807*e038c9c4Sjoerg unsigned getNumArgs() const override { return 0; } 808*e038c9c4Sjoerg 809*e038c9c4Sjoerg void getArgKinds(ASTNodeKind ThisKind, unsigned ArgNo, 810*e038c9c4Sjoerg std::vector<ArgKind> &Kinds) const override { 811*e038c9c4Sjoerg assert(ArgNo < 2); 812*e038c9c4Sjoerg Kinds.push_back(ArgKind::AK_String); 813*e038c9c4Sjoerg } 814*e038c9c4Sjoerg 815*e038c9c4Sjoerg bool isConvertibleTo(ASTNodeKind Kind, unsigned *Specificity, 816*e038c9c4Sjoerg ASTNodeKind *LeastDerivedKind) const override { 817*e038c9c4Sjoerg return isRetKindConvertibleTo(RetKinds, Kind, Specificity, 818*e038c9c4Sjoerg LeastDerivedKind); 819*e038c9c4Sjoerg } 820*e038c9c4Sjoerg 821*e038c9c4Sjoerg VariantMatcher create(SourceRange NameRange, ArrayRef<ParserValue> Args, 822*e038c9c4Sjoerg Diagnostics *Error) const override { 823*e038c9c4Sjoerg if (Args.size() < 1 || Args.size() > 2) { 824*e038c9c4Sjoerg Error->addError(NameRange, Diagnostics::ET_RegistryWrongArgCount) 825*e038c9c4Sjoerg << "1 or 2" << Args.size(); 826*e038c9c4Sjoerg return VariantMatcher(); 827*e038c9c4Sjoerg } 828*e038c9c4Sjoerg if (!ArgTypeTraits<StringRef>::hasCorrectType(Args[0].Value)) { 829*e038c9c4Sjoerg Error->addError(Args[0].Range, Error->ET_RegistryWrongArgType) 830*e038c9c4Sjoerg << 1 << ArgTypeTraits<StringRef>::getKind().asString() 831*e038c9c4Sjoerg << Args[0].Value.getTypeAsString(); 832*e038c9c4Sjoerg return VariantMatcher(); 833*e038c9c4Sjoerg } 834*e038c9c4Sjoerg if (Args.size() == 1) { 835*e038c9c4Sjoerg return outvalueToVariantMatcher( 836*e038c9c4Sjoerg NoFlags(ArgTypeTraits<StringRef>::get(Args[0].Value))); 837*e038c9c4Sjoerg } 838*e038c9c4Sjoerg if (!ArgTypeTraits<llvm::Regex::RegexFlags>::hasCorrectType( 839*e038c9c4Sjoerg Args[1].Value)) { 840*e038c9c4Sjoerg Error->addError(Args[1].Range, Error->ET_RegistryWrongArgType) 841*e038c9c4Sjoerg << 2 << ArgTypeTraits<llvm::Regex::RegexFlags>::getKind().asString() 842*e038c9c4Sjoerg << Args[1].Value.getTypeAsString(); 843*e038c9c4Sjoerg return VariantMatcher(); 844*e038c9c4Sjoerg } 845*e038c9c4Sjoerg if (!ArgTypeTraits<llvm::Regex::RegexFlags>::hasCorrectValue( 846*e038c9c4Sjoerg Args[1].Value)) { 847*e038c9c4Sjoerg if (llvm::Optional<std::string> BestGuess = 848*e038c9c4Sjoerg ArgTypeTraits<llvm::Regex::RegexFlags>::getBestGuess( 849*e038c9c4Sjoerg Args[1].Value)) { 850*e038c9c4Sjoerg Error->addError(Args[1].Range, Error->ET_RegistryUnknownEnumWithReplace) 851*e038c9c4Sjoerg << 2 << Args[1].Value.getString() << *BestGuess; 852*e038c9c4Sjoerg } else { 853*e038c9c4Sjoerg Error->addError(Args[1].Range, Error->ET_RegistryValueNotFound) 854*e038c9c4Sjoerg << Args[1].Value.getString(); 855*e038c9c4Sjoerg } 856*e038c9c4Sjoerg return VariantMatcher(); 857*e038c9c4Sjoerg } 858*e038c9c4Sjoerg return outvalueToVariantMatcher( 859*e038c9c4Sjoerg WithFlags(ArgTypeTraits<StringRef>::get(Args[0].Value), 860*e038c9c4Sjoerg ArgTypeTraits<llvm::Regex::RegexFlags>::get(Args[1].Value))); 861*e038c9c4Sjoerg } 862*e038c9c4Sjoerg 863*e038c9c4Sjoerg private: 864*e038c9c4Sjoerg ReturnType (*const WithFlags)(StringRef, llvm::Regex::RegexFlags); 865*e038c9c4Sjoerg ReturnType (*const NoFlags)(StringRef); 866*e038c9c4Sjoerg const std::vector<ASTNodeKind> RetKinds; 867*e038c9c4Sjoerg }; 868*e038c9c4Sjoerg 8697330f729Sjoerg /// Variadic operator marshaller function. 8707330f729Sjoerg class VariadicOperatorMatcherDescriptor : public MatcherDescriptor { 8717330f729Sjoerg public: 8727330f729Sjoerg using VarOp = DynTypedMatcher::VariadicOperator; 8737330f729Sjoerg 8747330f729Sjoerg VariadicOperatorMatcherDescriptor(unsigned MinCount, unsigned MaxCount, 8757330f729Sjoerg VarOp Op, StringRef MatcherName) 8767330f729Sjoerg : MinCount(MinCount), MaxCount(MaxCount), Op(Op), 8777330f729Sjoerg MatcherName(MatcherName) {} 8787330f729Sjoerg 8797330f729Sjoerg VariantMatcher create(SourceRange NameRange, 8807330f729Sjoerg ArrayRef<ParserValue> Args, 8817330f729Sjoerg Diagnostics *Error) const override { 8827330f729Sjoerg if (Args.size() < MinCount || MaxCount < Args.size()) { 8837330f729Sjoerg const std::string MaxStr = 8847330f729Sjoerg (MaxCount == std::numeric_limits<unsigned>::max() ? "" 8857330f729Sjoerg : Twine(MaxCount)) 8867330f729Sjoerg .str(); 8877330f729Sjoerg Error->addError(NameRange, Error->ET_RegistryWrongArgCount) 8887330f729Sjoerg << ("(" + Twine(MinCount) + ", " + MaxStr + ")") << Args.size(); 8897330f729Sjoerg return VariantMatcher(); 8907330f729Sjoerg } 8917330f729Sjoerg 8927330f729Sjoerg std::vector<VariantMatcher> InnerArgs; 8937330f729Sjoerg for (size_t i = 0, e = Args.size(); i != e; ++i) { 8947330f729Sjoerg const ParserValue &Arg = Args[i]; 8957330f729Sjoerg const VariantValue &Value = Arg.Value; 8967330f729Sjoerg if (!Value.isMatcher()) { 8977330f729Sjoerg Error->addError(Arg.Range, Error->ET_RegistryWrongArgType) 8987330f729Sjoerg << (i + 1) << "Matcher<>" << Value.getTypeAsString(); 8997330f729Sjoerg return VariantMatcher(); 9007330f729Sjoerg } 9017330f729Sjoerg InnerArgs.push_back(Value.getMatcher()); 9027330f729Sjoerg } 9037330f729Sjoerg return VariantMatcher::VariadicOperatorMatcher(Op, std::move(InnerArgs)); 9047330f729Sjoerg } 9057330f729Sjoerg 9067330f729Sjoerg bool isVariadic() const override { return true; } 9077330f729Sjoerg unsigned getNumArgs() const override { return 0; } 9087330f729Sjoerg 909*e038c9c4Sjoerg void getArgKinds(ASTNodeKind ThisKind, unsigned ArgNo, 9107330f729Sjoerg std::vector<ArgKind> &Kinds) const override { 911*e038c9c4Sjoerg Kinds.push_back(ArgKind::MakeMatcherArg(ThisKind)); 9127330f729Sjoerg } 9137330f729Sjoerg 914*e038c9c4Sjoerg bool isConvertibleTo(ASTNodeKind Kind, unsigned *Specificity, 915*e038c9c4Sjoerg ASTNodeKind *LeastDerivedKind) const override { 9167330f729Sjoerg if (Specificity) 9177330f729Sjoerg *Specificity = 1; 9187330f729Sjoerg if (LeastDerivedKind) 9197330f729Sjoerg *LeastDerivedKind = Kind; 9207330f729Sjoerg return true; 9217330f729Sjoerg } 9227330f729Sjoerg 9237330f729Sjoerg bool isPolymorphic() const override { return true; } 9247330f729Sjoerg 9257330f729Sjoerg private: 9267330f729Sjoerg const unsigned MinCount; 9277330f729Sjoerg const unsigned MaxCount; 9287330f729Sjoerg const VarOp Op; 9297330f729Sjoerg const StringRef MatcherName; 9307330f729Sjoerg }; 9317330f729Sjoerg 932*e038c9c4Sjoerg class MapAnyOfMatcherDescriptor : public MatcherDescriptor { 933*e038c9c4Sjoerg ASTNodeKind CladeNodeKind; 934*e038c9c4Sjoerg std::vector<ASTNodeKind> NodeKinds; 935*e038c9c4Sjoerg 936*e038c9c4Sjoerg public: 937*e038c9c4Sjoerg MapAnyOfMatcherDescriptor(ASTNodeKind CladeNodeKind, 938*e038c9c4Sjoerg std::vector<ASTNodeKind> NodeKinds) 939*e038c9c4Sjoerg : CladeNodeKind(CladeNodeKind), NodeKinds(NodeKinds) {} 940*e038c9c4Sjoerg 941*e038c9c4Sjoerg VariantMatcher create(SourceRange NameRange, ArrayRef<ParserValue> Args, 942*e038c9c4Sjoerg Diagnostics *Error) const override { 943*e038c9c4Sjoerg 944*e038c9c4Sjoerg std::vector<DynTypedMatcher> NodeArgs; 945*e038c9c4Sjoerg 946*e038c9c4Sjoerg for (auto NK : NodeKinds) { 947*e038c9c4Sjoerg std::vector<DynTypedMatcher> InnerArgs; 948*e038c9c4Sjoerg 949*e038c9c4Sjoerg for (const auto &Arg : Args) { 950*e038c9c4Sjoerg if (!Arg.Value.isMatcher()) 951*e038c9c4Sjoerg return {}; 952*e038c9c4Sjoerg const VariantMatcher &VM = Arg.Value.getMatcher(); 953*e038c9c4Sjoerg if (VM.hasTypedMatcher(NK)) { 954*e038c9c4Sjoerg auto DM = VM.getTypedMatcher(NK); 955*e038c9c4Sjoerg InnerArgs.push_back(DM); 956*e038c9c4Sjoerg } 957*e038c9c4Sjoerg } 958*e038c9c4Sjoerg 959*e038c9c4Sjoerg if (InnerArgs.empty()) { 960*e038c9c4Sjoerg NodeArgs.push_back( 961*e038c9c4Sjoerg DynTypedMatcher::trueMatcher(NK).dynCastTo(CladeNodeKind)); 962*e038c9c4Sjoerg } else { 963*e038c9c4Sjoerg NodeArgs.push_back( 964*e038c9c4Sjoerg DynTypedMatcher::constructVariadic( 965*e038c9c4Sjoerg ast_matchers::internal::DynTypedMatcher::VO_AllOf, NK, 966*e038c9c4Sjoerg InnerArgs) 967*e038c9c4Sjoerg .dynCastTo(CladeNodeKind)); 968*e038c9c4Sjoerg } 969*e038c9c4Sjoerg } 970*e038c9c4Sjoerg 971*e038c9c4Sjoerg auto Result = DynTypedMatcher::constructVariadic( 972*e038c9c4Sjoerg ast_matchers::internal::DynTypedMatcher::VO_AnyOf, CladeNodeKind, 973*e038c9c4Sjoerg NodeArgs); 974*e038c9c4Sjoerg Result.setAllowBind(true); 975*e038c9c4Sjoerg return VariantMatcher::SingleMatcher(Result); 976*e038c9c4Sjoerg } 977*e038c9c4Sjoerg 978*e038c9c4Sjoerg bool isVariadic() const override { return true; } 979*e038c9c4Sjoerg unsigned getNumArgs() const override { return 0; } 980*e038c9c4Sjoerg 981*e038c9c4Sjoerg void getArgKinds(ASTNodeKind ThisKind, unsigned, 982*e038c9c4Sjoerg std::vector<ArgKind> &Kinds) const override { 983*e038c9c4Sjoerg Kinds.push_back(ArgKind::MakeMatcherArg(ThisKind)); 984*e038c9c4Sjoerg } 985*e038c9c4Sjoerg 986*e038c9c4Sjoerg bool isConvertibleTo(ASTNodeKind Kind, unsigned *Specificity, 987*e038c9c4Sjoerg ASTNodeKind *LeastDerivedKind) const override { 988*e038c9c4Sjoerg if (Specificity) 989*e038c9c4Sjoerg *Specificity = 1; 990*e038c9c4Sjoerg if (LeastDerivedKind) 991*e038c9c4Sjoerg *LeastDerivedKind = CladeNodeKind; 992*e038c9c4Sjoerg return true; 993*e038c9c4Sjoerg } 994*e038c9c4Sjoerg }; 995*e038c9c4Sjoerg 996*e038c9c4Sjoerg class MapAnyOfBuilderDescriptor : public MatcherDescriptor { 997*e038c9c4Sjoerg public: 998*e038c9c4Sjoerg VariantMatcher create(SourceRange, ArrayRef<ParserValue>, 999*e038c9c4Sjoerg Diagnostics *) const override { 1000*e038c9c4Sjoerg return {}; 1001*e038c9c4Sjoerg } 1002*e038c9c4Sjoerg 1003*e038c9c4Sjoerg bool isBuilderMatcher() const override { return true; } 1004*e038c9c4Sjoerg 1005*e038c9c4Sjoerg std::unique_ptr<MatcherDescriptor> 1006*e038c9c4Sjoerg buildMatcherCtor(SourceRange, ArrayRef<ParserValue> Args, 1007*e038c9c4Sjoerg Diagnostics *) const override { 1008*e038c9c4Sjoerg 1009*e038c9c4Sjoerg std::vector<ASTNodeKind> NodeKinds; 1010*e038c9c4Sjoerg for (auto Arg : Args) { 1011*e038c9c4Sjoerg if (!Arg.Value.isNodeKind()) 1012*e038c9c4Sjoerg return {}; 1013*e038c9c4Sjoerg NodeKinds.push_back(Arg.Value.getNodeKind()); 1014*e038c9c4Sjoerg } 1015*e038c9c4Sjoerg 1016*e038c9c4Sjoerg if (NodeKinds.empty()) 1017*e038c9c4Sjoerg return {}; 1018*e038c9c4Sjoerg 1019*e038c9c4Sjoerg ASTNodeKind CladeNodeKind = NodeKinds.front().getCladeKind(); 1020*e038c9c4Sjoerg 1021*e038c9c4Sjoerg for (auto NK : NodeKinds) 1022*e038c9c4Sjoerg { 1023*e038c9c4Sjoerg if (!NK.getCladeKind().isSame(CladeNodeKind)) 1024*e038c9c4Sjoerg return {}; 1025*e038c9c4Sjoerg } 1026*e038c9c4Sjoerg 1027*e038c9c4Sjoerg return std::make_unique<MapAnyOfMatcherDescriptor>(CladeNodeKind, 1028*e038c9c4Sjoerg NodeKinds); 1029*e038c9c4Sjoerg } 1030*e038c9c4Sjoerg 1031*e038c9c4Sjoerg bool isVariadic() const override { return true; } 1032*e038c9c4Sjoerg 1033*e038c9c4Sjoerg unsigned getNumArgs() const override { return 0; } 1034*e038c9c4Sjoerg 1035*e038c9c4Sjoerg void getArgKinds(ASTNodeKind ThisKind, unsigned, 1036*e038c9c4Sjoerg std::vector<ArgKind> &ArgKinds) const override { 1037*e038c9c4Sjoerg ArgKinds.push_back(ArgKind::MakeNodeArg(ThisKind)); 1038*e038c9c4Sjoerg return; 1039*e038c9c4Sjoerg } 1040*e038c9c4Sjoerg bool isConvertibleTo(ASTNodeKind Kind, unsigned *Specificity = nullptr, 1041*e038c9c4Sjoerg ASTNodeKind *LeastDerivedKind = nullptr) const override { 1042*e038c9c4Sjoerg if (Specificity) 1043*e038c9c4Sjoerg *Specificity = 1; 1044*e038c9c4Sjoerg if (LeastDerivedKind) 1045*e038c9c4Sjoerg *LeastDerivedKind = Kind; 1046*e038c9c4Sjoerg return true; 1047*e038c9c4Sjoerg } 1048*e038c9c4Sjoerg 1049*e038c9c4Sjoerg bool isPolymorphic() const override { return false; } 1050*e038c9c4Sjoerg }; 1051*e038c9c4Sjoerg 10527330f729Sjoerg /// Helper functions to select the appropriate marshaller functions. 10537330f729Sjoerg /// They detect the number of arguments, arguments types and return type. 10547330f729Sjoerg 10557330f729Sjoerg /// 0-arg overload 10567330f729Sjoerg template <typename ReturnType> 10577330f729Sjoerg std::unique_ptr<MatcherDescriptor> 10587330f729Sjoerg makeMatcherAutoMarshall(ReturnType (*Func)(), StringRef MatcherName) { 1059*e038c9c4Sjoerg std::vector<ASTNodeKind> RetTypes; 10607330f729Sjoerg BuildReturnTypeVector<ReturnType>::build(RetTypes); 10617330f729Sjoerg return std::make_unique<FixedArgCountMatcherDescriptor>( 10627330f729Sjoerg matcherMarshall0<ReturnType>, reinterpret_cast<void (*)()>(Func), 10637330f729Sjoerg MatcherName, RetTypes, None); 10647330f729Sjoerg } 10657330f729Sjoerg 10667330f729Sjoerg /// 1-arg overload 10677330f729Sjoerg template <typename ReturnType, typename ArgType1> 10687330f729Sjoerg std::unique_ptr<MatcherDescriptor> 10697330f729Sjoerg makeMatcherAutoMarshall(ReturnType (*Func)(ArgType1), StringRef MatcherName) { 1070*e038c9c4Sjoerg std::vector<ASTNodeKind> RetTypes; 10717330f729Sjoerg BuildReturnTypeVector<ReturnType>::build(RetTypes); 10727330f729Sjoerg ArgKind AK = ArgTypeTraits<ArgType1>::getKind(); 10737330f729Sjoerg return std::make_unique<FixedArgCountMatcherDescriptor>( 10747330f729Sjoerg matcherMarshall1<ReturnType, ArgType1>, 10757330f729Sjoerg reinterpret_cast<void (*)()>(Func), MatcherName, RetTypes, AK); 10767330f729Sjoerg } 10777330f729Sjoerg 10787330f729Sjoerg /// 2-arg overload 10797330f729Sjoerg template <typename ReturnType, typename ArgType1, typename ArgType2> 10807330f729Sjoerg std::unique_ptr<MatcherDescriptor> 10817330f729Sjoerg makeMatcherAutoMarshall(ReturnType (*Func)(ArgType1, ArgType2), 10827330f729Sjoerg StringRef MatcherName) { 1083*e038c9c4Sjoerg std::vector<ASTNodeKind> RetTypes; 10847330f729Sjoerg BuildReturnTypeVector<ReturnType>::build(RetTypes); 10857330f729Sjoerg ArgKind AKs[] = { ArgTypeTraits<ArgType1>::getKind(), 10867330f729Sjoerg ArgTypeTraits<ArgType2>::getKind() }; 10877330f729Sjoerg return std::make_unique<FixedArgCountMatcherDescriptor>( 10887330f729Sjoerg matcherMarshall2<ReturnType, ArgType1, ArgType2>, 10897330f729Sjoerg reinterpret_cast<void (*)()>(Func), MatcherName, RetTypes, AKs); 10907330f729Sjoerg } 10917330f729Sjoerg 1092*e038c9c4Sjoerg template <typename ReturnType> 1093*e038c9c4Sjoerg std::unique_ptr<MatcherDescriptor> makeMatcherRegexMarshall( 1094*e038c9c4Sjoerg ReturnType (*FuncFlags)(llvm::StringRef, llvm::Regex::RegexFlags), 1095*e038c9c4Sjoerg ReturnType (*Func)(llvm::StringRef)) { 1096*e038c9c4Sjoerg std::vector<ASTNodeKind> RetTypes; 1097*e038c9c4Sjoerg BuildReturnTypeVector<ReturnType>::build(RetTypes); 1098*e038c9c4Sjoerg return std::make_unique<RegexMatcherDescriptor<ReturnType>>(FuncFlags, Func, 1099*e038c9c4Sjoerg RetTypes); 1100*e038c9c4Sjoerg } 1101*e038c9c4Sjoerg 11027330f729Sjoerg /// Variadic overload. 11037330f729Sjoerg template <typename ResultT, typename ArgT, 11047330f729Sjoerg ResultT (*Func)(ArrayRef<const ArgT *>)> 11057330f729Sjoerg std::unique_ptr<MatcherDescriptor> makeMatcherAutoMarshall( 11067330f729Sjoerg ast_matchers::internal::VariadicFunction<ResultT, ArgT, Func> VarFunc, 11077330f729Sjoerg StringRef MatcherName) { 11087330f729Sjoerg return std::make_unique<VariadicFuncMatcherDescriptor>(VarFunc, MatcherName); 11097330f729Sjoerg } 11107330f729Sjoerg 11117330f729Sjoerg /// Overload for VariadicDynCastAllOfMatchers. 11127330f729Sjoerg /// 11137330f729Sjoerg /// Not strictly necessary, but DynCastAllOfMatcherDescriptor gives us better 11147330f729Sjoerg /// completion results for that type of matcher. 11157330f729Sjoerg template <typename BaseT, typename DerivedT> 11167330f729Sjoerg std::unique_ptr<MatcherDescriptor> makeMatcherAutoMarshall( 11177330f729Sjoerg ast_matchers::internal::VariadicDynCastAllOfMatcher<BaseT, DerivedT> 11187330f729Sjoerg VarFunc, 11197330f729Sjoerg StringRef MatcherName) { 11207330f729Sjoerg return std::make_unique<DynCastAllOfMatcherDescriptor>(VarFunc, MatcherName); 11217330f729Sjoerg } 11227330f729Sjoerg 11237330f729Sjoerg /// Argument adaptative overload. 11247330f729Sjoerg template <template <typename ToArg, typename FromArg> class ArgumentAdapterT, 11257330f729Sjoerg typename FromTypes, typename ToTypes> 11267330f729Sjoerg std::unique_ptr<MatcherDescriptor> makeMatcherAutoMarshall( 11277330f729Sjoerg ast_matchers::internal::ArgumentAdaptingMatcherFunc<ArgumentAdapterT, 11287330f729Sjoerg FromTypes, ToTypes>, 11297330f729Sjoerg StringRef MatcherName) { 11307330f729Sjoerg std::vector<std::unique_ptr<MatcherDescriptor>> Overloads; 11317330f729Sjoerg AdaptativeOverloadCollector<ArgumentAdapterT, FromTypes, ToTypes>(MatcherName, 11327330f729Sjoerg Overloads); 11337330f729Sjoerg return std::make_unique<OverloadedMatcherDescriptor>(Overloads); 11347330f729Sjoerg } 11357330f729Sjoerg 11367330f729Sjoerg template <template <typename ToArg, typename FromArg> class ArgumentAdapterT, 11377330f729Sjoerg typename FromTypes, typename ToTypes> 11387330f729Sjoerg template <typename FromTypeList> 11397330f729Sjoerg inline void AdaptativeOverloadCollector<ArgumentAdapterT, FromTypes, 11407330f729Sjoerg ToTypes>::collect(FromTypeList) { 11417330f729Sjoerg Out.push_back(makeMatcherAutoMarshall( 11427330f729Sjoerg &AdaptativeFunc::template create<typename FromTypeList::head>, Name)); 11437330f729Sjoerg collect(typename FromTypeList::tail()); 11447330f729Sjoerg } 11457330f729Sjoerg 11467330f729Sjoerg /// Variadic operator overload. 11477330f729Sjoerg template <unsigned MinCount, unsigned MaxCount> 11487330f729Sjoerg std::unique_ptr<MatcherDescriptor> makeMatcherAutoMarshall( 11497330f729Sjoerg ast_matchers::internal::VariadicOperatorMatcherFunc<MinCount, MaxCount> 11507330f729Sjoerg Func, 11517330f729Sjoerg StringRef MatcherName) { 11527330f729Sjoerg return std::make_unique<VariadicOperatorMatcherDescriptor>( 11537330f729Sjoerg MinCount, MaxCount, Func.Op, MatcherName); 11547330f729Sjoerg } 11557330f729Sjoerg 1156*e038c9c4Sjoerg template <typename CladeType, typename... MatcherT> 1157*e038c9c4Sjoerg std::unique_ptr<MatcherDescriptor> makeMatcherAutoMarshall( 1158*e038c9c4Sjoerg ast_matchers::internal::MapAnyOfMatcherImpl<CladeType, MatcherT...>, 1159*e038c9c4Sjoerg StringRef MatcherName) { 1160*e038c9c4Sjoerg return std::make_unique<MapAnyOfMatcherDescriptor>( 1161*e038c9c4Sjoerg ASTNodeKind::getFromNodeKind<CladeType>(), 1162*e038c9c4Sjoerg std::vector<ASTNodeKind>{ASTNodeKind::getFromNodeKind<MatcherT>()...}); 1163*e038c9c4Sjoerg } 1164*e038c9c4Sjoerg 11657330f729Sjoerg } // namespace internal 11667330f729Sjoerg } // namespace dynamic 11677330f729Sjoerg } // namespace ast_matchers 11687330f729Sjoerg } // namespace clang 11697330f729Sjoerg 11707330f729Sjoerg #endif // LLVM_CLANG_AST_MATCHERS_DYNAMIC_MARSHALLERS_H 1171