1*67e74705SXin Li //===--- Marshallers.h - Generic matcher function marshallers ---*- C++ -*-===// 2*67e74705SXin Li // 3*67e74705SXin Li // The LLVM Compiler Infrastructure 4*67e74705SXin Li // 5*67e74705SXin Li // This file is distributed under the University of Illinois Open Source 6*67e74705SXin Li // License. See LICENSE.TXT for details. 7*67e74705SXin Li // 8*67e74705SXin Li //===----------------------------------------------------------------------===// 9*67e74705SXin Li /// 10*67e74705SXin Li /// \file 11*67e74705SXin Li /// \brief Functions templates and classes to wrap matcher construct functions. 12*67e74705SXin Li /// 13*67e74705SXin Li /// A collection of template function and classes that provide a generic 14*67e74705SXin Li /// marshalling layer on top of matcher construct functions. 15*67e74705SXin Li /// These are used by the registry to export all marshaller constructors with 16*67e74705SXin Li /// the same generic interface. 17*67e74705SXin Li /// 18*67e74705SXin Li //===----------------------------------------------------------------------===// 19*67e74705SXin Li 20*67e74705SXin Li #ifndef LLVM_CLANG_LIB_ASTMATCHERS_DYNAMIC_MARSHALLERS_H 21*67e74705SXin Li #define LLVM_CLANG_LIB_ASTMATCHERS_DYNAMIC_MARSHALLERS_H 22*67e74705SXin Li 23*67e74705SXin Li #include "clang/ASTMatchers/ASTMatchers.h" 24*67e74705SXin Li #include "clang/ASTMatchers/Dynamic/Diagnostics.h" 25*67e74705SXin Li #include "clang/ASTMatchers/Dynamic/VariantValue.h" 26*67e74705SXin Li #include "clang/Basic/LLVM.h" 27*67e74705SXin Li #include "llvm/ADT/STLExtras.h" 28*67e74705SXin Li #include <string> 29*67e74705SXin Li 30*67e74705SXin Li namespace clang { 31*67e74705SXin Li namespace ast_matchers { 32*67e74705SXin Li namespace dynamic { 33*67e74705SXin Li namespace internal { 34*67e74705SXin Li 35*67e74705SXin Li /// \brief Helper template class to just from argument type to the right is/get 36*67e74705SXin Li /// functions in VariantValue. 37*67e74705SXin Li /// Used to verify and extract the matcher arguments below. 38*67e74705SXin Li template <class T> struct ArgTypeTraits; 39*67e74705SXin Li template <class T> struct ArgTypeTraits<const T &> : public ArgTypeTraits<T> { 40*67e74705SXin Li }; 41*67e74705SXin Li 42*67e74705SXin Li template <> struct ArgTypeTraits<std::string> { 43*67e74705SXin Li static bool is(const VariantValue &Value) { return Value.isString(); } 44*67e74705SXin Li static const std::string &get(const VariantValue &Value) { 45*67e74705SXin Li return Value.getString(); 46*67e74705SXin Li } 47*67e74705SXin Li static ArgKind getKind() { 48*67e74705SXin Li return ArgKind(ArgKind::AK_String); 49*67e74705SXin Li } 50*67e74705SXin Li }; 51*67e74705SXin Li 52*67e74705SXin Li template <> 53*67e74705SXin Li struct ArgTypeTraits<StringRef> : public ArgTypeTraits<std::string> { 54*67e74705SXin Li }; 55*67e74705SXin Li 56*67e74705SXin Li template <class T> struct ArgTypeTraits<ast_matchers::internal::Matcher<T> > { 57*67e74705SXin Li static bool is(const VariantValue &Value) { 58*67e74705SXin Li return Value.isMatcher() && Value.getMatcher().hasTypedMatcher<T>(); 59*67e74705SXin Li } 60*67e74705SXin Li static ast_matchers::internal::Matcher<T> get(const VariantValue &Value) { 61*67e74705SXin Li return Value.getMatcher().getTypedMatcher<T>(); 62*67e74705SXin Li } 63*67e74705SXin Li static ArgKind getKind() { 64*67e74705SXin Li return ArgKind(ast_type_traits::ASTNodeKind::getFromNodeKind<T>()); 65*67e74705SXin Li } 66*67e74705SXin Li }; 67*67e74705SXin Li 68*67e74705SXin Li template <> struct ArgTypeTraits<unsigned> { 69*67e74705SXin Li static bool is(const VariantValue &Value) { return Value.isUnsigned(); } 70*67e74705SXin Li static unsigned get(const VariantValue &Value) { 71*67e74705SXin Li return Value.getUnsigned(); 72*67e74705SXin Li } 73*67e74705SXin Li static ArgKind getKind() { 74*67e74705SXin Li return ArgKind(ArgKind::AK_Unsigned); 75*67e74705SXin Li } 76*67e74705SXin Li }; 77*67e74705SXin Li 78*67e74705SXin Li template <> struct ArgTypeTraits<attr::Kind> { 79*67e74705SXin Li private: 80*67e74705SXin Li static attr::Kind getAttrKind(llvm::StringRef AttrKind) { 81*67e74705SXin Li return llvm::StringSwitch<attr::Kind>(AttrKind) 82*67e74705SXin Li #define ATTR(X) .Case("attr::" #X, attr:: X) 83*67e74705SXin Li #include "clang/Basic/AttrList.inc" 84*67e74705SXin Li .Default(attr::Kind(-1)); 85*67e74705SXin Li } 86*67e74705SXin Li public: 87*67e74705SXin Li static bool is(const VariantValue &Value) { 88*67e74705SXin Li return Value.isString() && 89*67e74705SXin Li getAttrKind(Value.getString()) != attr::Kind(-1); 90*67e74705SXin Li } 91*67e74705SXin Li static attr::Kind get(const VariantValue &Value) { 92*67e74705SXin Li return getAttrKind(Value.getString()); 93*67e74705SXin Li } 94*67e74705SXin Li static ArgKind getKind() { 95*67e74705SXin Li return ArgKind(ArgKind::AK_String); 96*67e74705SXin Li } 97*67e74705SXin Li }; 98*67e74705SXin Li 99*67e74705SXin Li template <> struct ArgTypeTraits<clang::CastKind> { 100*67e74705SXin Li private: 101*67e74705SXin Li static clang::CastKind getCastKind(llvm::StringRef AttrKind) { 102*67e74705SXin Li return llvm::StringSwitch<clang::CastKind>(AttrKind) 103*67e74705SXin Li #define CAST_OPERATION(Name) .Case( #Name, CK_##Name) 104*67e74705SXin Li #include "clang/AST/OperationKinds.def" 105*67e74705SXin Li .Default(CK_Invalid); 106*67e74705SXin Li } 107*67e74705SXin Li 108*67e74705SXin Li public: 109*67e74705SXin Li static bool is(const VariantValue &Value) { 110*67e74705SXin Li return Value.isString() && 111*67e74705SXin Li getCastKind(Value.getString()) != CK_Invalid; 112*67e74705SXin Li } 113*67e74705SXin Li static clang::CastKind get(const VariantValue &Value) { 114*67e74705SXin Li return getCastKind(Value.getString()); 115*67e74705SXin Li } 116*67e74705SXin Li static ArgKind getKind() { 117*67e74705SXin Li return ArgKind(ArgKind::AK_String); 118*67e74705SXin Li } 119*67e74705SXin Li }; 120*67e74705SXin Li 121*67e74705SXin Li /// \brief Matcher descriptor interface. 122*67e74705SXin Li /// 123*67e74705SXin Li /// Provides a \c create() method that constructs the matcher from the provided 124*67e74705SXin Li /// arguments, and various other methods for type introspection. 125*67e74705SXin Li class MatcherDescriptor { 126*67e74705SXin Li public: 127*67e74705SXin Li virtual ~MatcherDescriptor() {} 128*67e74705SXin Li virtual VariantMatcher create(SourceRange NameRange, 129*67e74705SXin Li ArrayRef<ParserValue> Args, 130*67e74705SXin Li Diagnostics *Error) const = 0; 131*67e74705SXin Li 132*67e74705SXin Li /// Returns whether the matcher is variadic. Variadic matchers can take any 133*67e74705SXin Li /// number of arguments, but they must be of the same type. 134*67e74705SXin Li virtual bool isVariadic() const = 0; 135*67e74705SXin Li 136*67e74705SXin Li /// Returns the number of arguments accepted by the matcher if not variadic. 137*67e74705SXin Li virtual unsigned getNumArgs() const = 0; 138*67e74705SXin Li 139*67e74705SXin Li /// Given that the matcher is being converted to type \p ThisKind, append the 140*67e74705SXin Li /// set of argument types accepted for argument \p ArgNo to \p ArgKinds. 141*67e74705SXin Li // FIXME: We should provide the ability to constrain the output of this 142*67e74705SXin Li // function based on the types of other matcher arguments. 143*67e74705SXin Li virtual void getArgKinds(ast_type_traits::ASTNodeKind ThisKind, unsigned ArgNo, 144*67e74705SXin Li std::vector<ArgKind> &ArgKinds) const = 0; 145*67e74705SXin Li 146*67e74705SXin Li /// Returns whether this matcher is convertible to the given type. If it is 147*67e74705SXin Li /// so convertible, store in *Specificity a value corresponding to the 148*67e74705SXin Li /// "specificity" of the converted matcher to the given context, and in 149*67e74705SXin Li /// *LeastDerivedKind the least derived matcher kind which would result in the 150*67e74705SXin Li /// same matcher overload. Zero specificity indicates that this conversion 151*67e74705SXin Li /// would produce a trivial matcher that will either always or never match. 152*67e74705SXin Li /// Such matchers are excluded from code completion results. 153*67e74705SXin Li virtual bool isConvertibleTo( 154*67e74705SXin Li ast_type_traits::ASTNodeKind Kind, unsigned *Specificity = nullptr, 155*67e74705SXin Li ast_type_traits::ASTNodeKind *LeastDerivedKind = nullptr) const = 0; 156*67e74705SXin Li 157*67e74705SXin Li /// Returns whether the matcher will, given a matcher of any type T, yield a 158*67e74705SXin Li /// matcher of type T. 159*67e74705SXin Li virtual bool isPolymorphic() const { return false; } 160*67e74705SXin Li }; 161*67e74705SXin Li 162*67e74705SXin Li inline bool isRetKindConvertibleTo( 163*67e74705SXin Li ArrayRef<ast_type_traits::ASTNodeKind> RetKinds, 164*67e74705SXin Li ast_type_traits::ASTNodeKind Kind, unsigned *Specificity, 165*67e74705SXin Li ast_type_traits::ASTNodeKind *LeastDerivedKind) { 166*67e74705SXin Li for (const ast_type_traits::ASTNodeKind &NodeKind : RetKinds) { 167*67e74705SXin Li if (ArgKind(NodeKind).isConvertibleTo(Kind, Specificity)) { 168*67e74705SXin Li if (LeastDerivedKind) 169*67e74705SXin Li *LeastDerivedKind = NodeKind; 170*67e74705SXin Li return true; 171*67e74705SXin Li } 172*67e74705SXin Li } 173*67e74705SXin Li return false; 174*67e74705SXin Li } 175*67e74705SXin Li 176*67e74705SXin Li /// \brief Simple callback implementation. Marshaller and function are provided. 177*67e74705SXin Li /// 178*67e74705SXin Li /// This class wraps a function of arbitrary signature and a marshaller 179*67e74705SXin Li /// function into a MatcherDescriptor. 180*67e74705SXin Li /// The marshaller is in charge of taking the VariantValue arguments, checking 181*67e74705SXin Li /// their types, unpacking them and calling the underlying function. 182*67e74705SXin Li class FixedArgCountMatcherDescriptor : public MatcherDescriptor { 183*67e74705SXin Li public: 184*67e74705SXin Li typedef VariantMatcher (*MarshallerType)(void (*Func)(), 185*67e74705SXin Li StringRef MatcherName, 186*67e74705SXin Li SourceRange NameRange, 187*67e74705SXin Li ArrayRef<ParserValue> Args, 188*67e74705SXin Li Diagnostics *Error); 189*67e74705SXin Li 190*67e74705SXin Li /// \param Marshaller Function to unpack the arguments and call \c Func 191*67e74705SXin Li /// \param Func Matcher construct function. This is the function that 192*67e74705SXin Li /// compile-time matcher expressions would use to create the matcher. 193*67e74705SXin Li /// \param RetKinds The list of matcher types to which the matcher is 194*67e74705SXin Li /// convertible. 195*67e74705SXin Li /// \param ArgKinds The types of the arguments this matcher takes. 196*67e74705SXin Li FixedArgCountMatcherDescriptor( 197*67e74705SXin Li MarshallerType Marshaller, void (*Func)(), StringRef MatcherName, 198*67e74705SXin Li ArrayRef<ast_type_traits::ASTNodeKind> RetKinds, 199*67e74705SXin Li ArrayRef<ArgKind> ArgKinds) 200*67e74705SXin Li : Marshaller(Marshaller), Func(Func), MatcherName(MatcherName), 201*67e74705SXin Li RetKinds(RetKinds.begin(), RetKinds.end()), 202*67e74705SXin Li ArgKinds(ArgKinds.begin(), ArgKinds.end()) {} 203*67e74705SXin Li 204*67e74705SXin Li VariantMatcher create(SourceRange NameRange, 205*67e74705SXin Li ArrayRef<ParserValue> Args, 206*67e74705SXin Li Diagnostics *Error) const override { 207*67e74705SXin Li return Marshaller(Func, MatcherName, NameRange, Args, Error); 208*67e74705SXin Li } 209*67e74705SXin Li 210*67e74705SXin Li bool isVariadic() const override { return false; } 211*67e74705SXin Li unsigned getNumArgs() const override { return ArgKinds.size(); } 212*67e74705SXin Li void getArgKinds(ast_type_traits::ASTNodeKind ThisKind, unsigned ArgNo, 213*67e74705SXin Li std::vector<ArgKind> &Kinds) const override { 214*67e74705SXin Li Kinds.push_back(ArgKinds[ArgNo]); 215*67e74705SXin Li } 216*67e74705SXin Li bool isConvertibleTo( 217*67e74705SXin Li ast_type_traits::ASTNodeKind Kind, unsigned *Specificity, 218*67e74705SXin Li ast_type_traits::ASTNodeKind *LeastDerivedKind) const override { 219*67e74705SXin Li return isRetKindConvertibleTo(RetKinds, Kind, Specificity, 220*67e74705SXin Li LeastDerivedKind); 221*67e74705SXin Li } 222*67e74705SXin Li 223*67e74705SXin Li private: 224*67e74705SXin Li const MarshallerType Marshaller; 225*67e74705SXin Li void (* const Func)(); 226*67e74705SXin Li const std::string MatcherName; 227*67e74705SXin Li const std::vector<ast_type_traits::ASTNodeKind> RetKinds; 228*67e74705SXin Li const std::vector<ArgKind> ArgKinds; 229*67e74705SXin Li }; 230*67e74705SXin Li 231*67e74705SXin Li /// \brief Helper methods to extract and merge all possible typed matchers 232*67e74705SXin Li /// out of the polymorphic object. 233*67e74705SXin Li template <class PolyMatcher> 234*67e74705SXin Li static void mergePolyMatchers(const PolyMatcher &Poly, 235*67e74705SXin Li std::vector<DynTypedMatcher> &Out, 236*67e74705SXin Li ast_matchers::internal::EmptyTypeList) {} 237*67e74705SXin Li 238*67e74705SXin Li template <class PolyMatcher, class TypeList> 239*67e74705SXin Li static void mergePolyMatchers(const PolyMatcher &Poly, 240*67e74705SXin Li std::vector<DynTypedMatcher> &Out, TypeList) { 241*67e74705SXin Li Out.push_back(ast_matchers::internal::Matcher<typename TypeList::head>(Poly)); 242*67e74705SXin Li mergePolyMatchers(Poly, Out, typename TypeList::tail()); 243*67e74705SXin Li } 244*67e74705SXin Li 245*67e74705SXin Li /// \brief Convert the return values of the functions into a VariantMatcher. 246*67e74705SXin Li /// 247*67e74705SXin Li /// There are 2 cases right now: The return value is a Matcher<T> or is a 248*67e74705SXin Li /// polymorphic matcher. For the former, we just construct the VariantMatcher. 249*67e74705SXin Li /// For the latter, we instantiate all the possible Matcher<T> of the poly 250*67e74705SXin Li /// matcher. 251*67e74705SXin Li static VariantMatcher outvalueToVariantMatcher(const DynTypedMatcher &Matcher) { 252*67e74705SXin Li return VariantMatcher::SingleMatcher(Matcher); 253*67e74705SXin Li } 254*67e74705SXin Li 255*67e74705SXin Li template <typename T> 256*67e74705SXin Li static VariantMatcher outvalueToVariantMatcher(const T &PolyMatcher, 257*67e74705SXin Li typename T::ReturnTypes * = 258*67e74705SXin Li nullptr) { 259*67e74705SXin Li std::vector<DynTypedMatcher> Matchers; 260*67e74705SXin Li mergePolyMatchers(PolyMatcher, Matchers, typename T::ReturnTypes()); 261*67e74705SXin Li VariantMatcher Out = VariantMatcher::PolymorphicMatcher(std::move(Matchers)); 262*67e74705SXin Li return Out; 263*67e74705SXin Li } 264*67e74705SXin Li 265*67e74705SXin Li template <typename T> 266*67e74705SXin Li inline void buildReturnTypeVectorFromTypeList( 267*67e74705SXin Li std::vector<ast_type_traits::ASTNodeKind> &RetTypes) { 268*67e74705SXin Li RetTypes.push_back( 269*67e74705SXin Li ast_type_traits::ASTNodeKind::getFromNodeKind<typename T::head>()); 270*67e74705SXin Li buildReturnTypeVectorFromTypeList<typename T::tail>(RetTypes); 271*67e74705SXin Li } 272*67e74705SXin Li 273*67e74705SXin Li template <> 274*67e74705SXin Li inline void 275*67e74705SXin Li buildReturnTypeVectorFromTypeList<ast_matchers::internal::EmptyTypeList>( 276*67e74705SXin Li std::vector<ast_type_traits::ASTNodeKind> &RetTypes) {} 277*67e74705SXin Li 278*67e74705SXin Li template <typename T> 279*67e74705SXin Li struct BuildReturnTypeVector { 280*67e74705SXin Li static void build(std::vector<ast_type_traits::ASTNodeKind> &RetTypes) { 281*67e74705SXin Li buildReturnTypeVectorFromTypeList<typename T::ReturnTypes>(RetTypes); 282*67e74705SXin Li } 283*67e74705SXin Li }; 284*67e74705SXin Li 285*67e74705SXin Li template <typename T> 286*67e74705SXin Li struct BuildReturnTypeVector<ast_matchers::internal::Matcher<T> > { 287*67e74705SXin Li static void build(std::vector<ast_type_traits::ASTNodeKind> &RetTypes) { 288*67e74705SXin Li RetTypes.push_back(ast_type_traits::ASTNodeKind::getFromNodeKind<T>()); 289*67e74705SXin Li } 290*67e74705SXin Li }; 291*67e74705SXin Li 292*67e74705SXin Li template <typename T> 293*67e74705SXin Li struct BuildReturnTypeVector<ast_matchers::internal::BindableMatcher<T> > { 294*67e74705SXin Li static void build(std::vector<ast_type_traits::ASTNodeKind> &RetTypes) { 295*67e74705SXin Li RetTypes.push_back(ast_type_traits::ASTNodeKind::getFromNodeKind<T>()); 296*67e74705SXin Li } 297*67e74705SXin Li }; 298*67e74705SXin Li 299*67e74705SXin Li /// \brief Variadic marshaller function. 300*67e74705SXin Li template <typename ResultT, typename ArgT, 301*67e74705SXin Li ResultT (*Func)(ArrayRef<const ArgT *>)> 302*67e74705SXin Li VariantMatcher 303*67e74705SXin Li variadicMatcherDescriptor(StringRef MatcherName, SourceRange NameRange, 304*67e74705SXin Li ArrayRef<ParserValue> Args, Diagnostics *Error) { 305*67e74705SXin Li ArgT **InnerArgs = new ArgT *[Args.size()](); 306*67e74705SXin Li 307*67e74705SXin Li bool HasError = false; 308*67e74705SXin Li for (size_t i = 0, e = Args.size(); i != e; ++i) { 309*67e74705SXin Li typedef ArgTypeTraits<ArgT> ArgTraits; 310*67e74705SXin Li const ParserValue &Arg = Args[i]; 311*67e74705SXin Li const VariantValue &Value = Arg.Value; 312*67e74705SXin Li if (!ArgTraits::is(Value)) { 313*67e74705SXin Li Error->addError(Arg.Range, Error->ET_RegistryWrongArgType) 314*67e74705SXin Li << (i + 1) << ArgTraits::getKind().asString() << Value.getTypeAsString(); 315*67e74705SXin Li HasError = true; 316*67e74705SXin Li break; 317*67e74705SXin Li } 318*67e74705SXin Li InnerArgs[i] = new ArgT(ArgTraits::get(Value)); 319*67e74705SXin Li } 320*67e74705SXin Li 321*67e74705SXin Li VariantMatcher Out; 322*67e74705SXin Li if (!HasError) { 323*67e74705SXin Li Out = outvalueToVariantMatcher(Func(llvm::makeArrayRef(InnerArgs, 324*67e74705SXin Li Args.size()))); 325*67e74705SXin Li } 326*67e74705SXin Li 327*67e74705SXin Li for (size_t i = 0, e = Args.size(); i != e; ++i) { 328*67e74705SXin Li delete InnerArgs[i]; 329*67e74705SXin Li } 330*67e74705SXin Li delete[] InnerArgs; 331*67e74705SXin Li return Out; 332*67e74705SXin Li } 333*67e74705SXin Li 334*67e74705SXin Li /// \brief Matcher descriptor for variadic functions. 335*67e74705SXin Li /// 336*67e74705SXin Li /// This class simply wraps a VariadicFunction with the right signature to export 337*67e74705SXin Li /// it as a MatcherDescriptor. 338*67e74705SXin Li /// This allows us to have one implementation of the interface for as many free 339*67e74705SXin Li /// functions as we want, reducing the number of symbols and size of the 340*67e74705SXin Li /// object file. 341*67e74705SXin Li class VariadicFuncMatcherDescriptor : public MatcherDescriptor { 342*67e74705SXin Li public: 343*67e74705SXin Li typedef VariantMatcher (*RunFunc)(StringRef MatcherName, 344*67e74705SXin Li SourceRange NameRange, 345*67e74705SXin Li ArrayRef<ParserValue> Args, 346*67e74705SXin Li Diagnostics *Error); 347*67e74705SXin Li 348*67e74705SXin Li template <typename ResultT, typename ArgT, 349*67e74705SXin Li ResultT (*F)(ArrayRef<const ArgT *>)> 350*67e74705SXin Li VariadicFuncMatcherDescriptor( 351*67e74705SXin Li ast_matchers::internal::VariadicFunction<ResultT, ArgT, F> Func, 352*67e74705SXin Li StringRef MatcherName) 353*67e74705SXin Li : Func(&variadicMatcherDescriptor<ResultT, ArgT, F>), 354*67e74705SXin Li MatcherName(MatcherName.str()), 355*67e74705SXin Li ArgsKind(ArgTypeTraits<ArgT>::getKind()) { 356*67e74705SXin Li BuildReturnTypeVector<ResultT>::build(RetKinds); 357*67e74705SXin Li } 358*67e74705SXin Li 359*67e74705SXin Li VariantMatcher create(SourceRange NameRange, 360*67e74705SXin Li ArrayRef<ParserValue> Args, 361*67e74705SXin Li Diagnostics *Error) const override { 362*67e74705SXin Li return Func(MatcherName, NameRange, Args, Error); 363*67e74705SXin Li } 364*67e74705SXin Li 365*67e74705SXin Li bool isVariadic() const override { return true; } 366*67e74705SXin Li unsigned getNumArgs() const override { return 0; } 367*67e74705SXin Li void getArgKinds(ast_type_traits::ASTNodeKind ThisKind, unsigned ArgNo, 368*67e74705SXin Li std::vector<ArgKind> &Kinds) const override { 369*67e74705SXin Li Kinds.push_back(ArgsKind); 370*67e74705SXin Li } 371*67e74705SXin Li bool isConvertibleTo( 372*67e74705SXin Li ast_type_traits::ASTNodeKind Kind, unsigned *Specificity, 373*67e74705SXin Li ast_type_traits::ASTNodeKind *LeastDerivedKind) const override { 374*67e74705SXin Li return isRetKindConvertibleTo(RetKinds, Kind, Specificity, 375*67e74705SXin Li LeastDerivedKind); 376*67e74705SXin Li } 377*67e74705SXin Li 378*67e74705SXin Li private: 379*67e74705SXin Li const RunFunc Func; 380*67e74705SXin Li const std::string MatcherName; 381*67e74705SXin Li std::vector<ast_type_traits::ASTNodeKind> RetKinds; 382*67e74705SXin Li const ArgKind ArgsKind; 383*67e74705SXin Li }; 384*67e74705SXin Li 385*67e74705SXin Li /// \brief Return CK_Trivial when appropriate for VariadicDynCastAllOfMatchers. 386*67e74705SXin Li class DynCastAllOfMatcherDescriptor : public VariadicFuncMatcherDescriptor { 387*67e74705SXin Li public: 388*67e74705SXin Li template <typename BaseT, typename DerivedT> 389*67e74705SXin Li DynCastAllOfMatcherDescriptor( 390*67e74705SXin Li ast_matchers::internal::VariadicDynCastAllOfMatcher<BaseT, DerivedT> Func, 391*67e74705SXin Li StringRef MatcherName) 392*67e74705SXin Li : VariadicFuncMatcherDescriptor(Func, MatcherName), 393*67e74705SXin Li DerivedKind(ast_type_traits::ASTNodeKind::getFromNodeKind<DerivedT>()) { 394*67e74705SXin Li } 395*67e74705SXin Li 396*67e74705SXin Li bool 397*67e74705SXin Li isConvertibleTo(ast_type_traits::ASTNodeKind Kind, unsigned *Specificity, 398*67e74705SXin Li ast_type_traits::ASTNodeKind *LeastDerivedKind) const override { 399*67e74705SXin Li // If Kind is not a base of DerivedKind, either DerivedKind is a base of 400*67e74705SXin Li // Kind (in which case the match will always succeed) or Kind and 401*67e74705SXin Li // DerivedKind are unrelated (in which case it will always fail), so set 402*67e74705SXin Li // Specificity to 0. 403*67e74705SXin Li if (VariadicFuncMatcherDescriptor::isConvertibleTo(Kind, Specificity, 404*67e74705SXin Li LeastDerivedKind)) { 405*67e74705SXin Li if (Kind.isSame(DerivedKind) || !Kind.isBaseOf(DerivedKind)) { 406*67e74705SXin Li if (Specificity) 407*67e74705SXin Li *Specificity = 0; 408*67e74705SXin Li } 409*67e74705SXin Li return true; 410*67e74705SXin Li } else { 411*67e74705SXin Li return false; 412*67e74705SXin Li } 413*67e74705SXin Li } 414*67e74705SXin Li 415*67e74705SXin Li private: 416*67e74705SXin Li const ast_type_traits::ASTNodeKind DerivedKind; 417*67e74705SXin Li }; 418*67e74705SXin Li 419*67e74705SXin Li /// \brief Helper macros to check the arguments on all marshaller functions. 420*67e74705SXin Li #define CHECK_ARG_COUNT(count) \ 421*67e74705SXin Li if (Args.size() != count) { \ 422*67e74705SXin Li Error->addError(NameRange, Error->ET_RegistryWrongArgCount) \ 423*67e74705SXin Li << count << Args.size(); \ 424*67e74705SXin Li return VariantMatcher(); \ 425*67e74705SXin Li } 426*67e74705SXin Li 427*67e74705SXin Li #define CHECK_ARG_TYPE(index, type) \ 428*67e74705SXin Li if (!ArgTypeTraits<type>::is(Args[index].Value)) { \ 429*67e74705SXin Li Error->addError(Args[index].Range, Error->ET_RegistryWrongArgType) \ 430*67e74705SXin Li << (index + 1) << ArgTypeTraits<type>::getKind().asString() \ 431*67e74705SXin Li << Args[index].Value.getTypeAsString(); \ 432*67e74705SXin Li return VariantMatcher(); \ 433*67e74705SXin Li } 434*67e74705SXin Li 435*67e74705SXin Li /// \brief 0-arg marshaller function. 436*67e74705SXin Li template <typename ReturnType> 437*67e74705SXin Li static VariantMatcher matcherMarshall0(void (*Func)(), StringRef MatcherName, 438*67e74705SXin Li SourceRange NameRange, 439*67e74705SXin Li ArrayRef<ParserValue> Args, 440*67e74705SXin Li Diagnostics *Error) { 441*67e74705SXin Li typedef ReturnType (*FuncType)(); 442*67e74705SXin Li CHECK_ARG_COUNT(0); 443*67e74705SXin Li return outvalueToVariantMatcher(reinterpret_cast<FuncType>(Func)()); 444*67e74705SXin Li } 445*67e74705SXin Li 446*67e74705SXin Li /// \brief 1-arg marshaller function. 447*67e74705SXin Li template <typename ReturnType, typename ArgType1> 448*67e74705SXin Li static VariantMatcher matcherMarshall1(void (*Func)(), StringRef MatcherName, 449*67e74705SXin Li SourceRange NameRange, 450*67e74705SXin Li ArrayRef<ParserValue> Args, 451*67e74705SXin Li Diagnostics *Error) { 452*67e74705SXin Li typedef ReturnType (*FuncType)(ArgType1); 453*67e74705SXin Li CHECK_ARG_COUNT(1); 454*67e74705SXin Li CHECK_ARG_TYPE(0, ArgType1); 455*67e74705SXin Li return outvalueToVariantMatcher(reinterpret_cast<FuncType>(Func)( 456*67e74705SXin Li ArgTypeTraits<ArgType1>::get(Args[0].Value))); 457*67e74705SXin Li } 458*67e74705SXin Li 459*67e74705SXin Li /// \brief 2-arg marshaller function. 460*67e74705SXin Li template <typename ReturnType, typename ArgType1, typename ArgType2> 461*67e74705SXin Li static VariantMatcher matcherMarshall2(void (*Func)(), StringRef MatcherName, 462*67e74705SXin Li SourceRange NameRange, 463*67e74705SXin Li ArrayRef<ParserValue> Args, 464*67e74705SXin Li Diagnostics *Error) { 465*67e74705SXin Li typedef ReturnType (*FuncType)(ArgType1, ArgType2); 466*67e74705SXin Li CHECK_ARG_COUNT(2); 467*67e74705SXin Li CHECK_ARG_TYPE(0, ArgType1); 468*67e74705SXin Li CHECK_ARG_TYPE(1, ArgType2); 469*67e74705SXin Li return outvalueToVariantMatcher(reinterpret_cast<FuncType>(Func)( 470*67e74705SXin Li ArgTypeTraits<ArgType1>::get(Args[0].Value), 471*67e74705SXin Li ArgTypeTraits<ArgType2>::get(Args[1].Value))); 472*67e74705SXin Li } 473*67e74705SXin Li 474*67e74705SXin Li #undef CHECK_ARG_COUNT 475*67e74705SXin Li #undef CHECK_ARG_TYPE 476*67e74705SXin Li 477*67e74705SXin Li /// \brief Helper class used to collect all the possible overloads of an 478*67e74705SXin Li /// argument adaptative matcher function. 479*67e74705SXin Li template <template <typename ToArg, typename FromArg> class ArgumentAdapterT, 480*67e74705SXin Li typename FromTypes, typename ToTypes> 481*67e74705SXin Li class AdaptativeOverloadCollector { 482*67e74705SXin Li public: 483*67e74705SXin Li AdaptativeOverloadCollector(StringRef Name, 484*67e74705SXin Li std::vector<MatcherDescriptor *> &Out) 485*67e74705SXin Li : Name(Name), Out(Out) { 486*67e74705SXin Li collect(FromTypes()); 487*67e74705SXin Li } 488*67e74705SXin Li 489*67e74705SXin Li private: 490*67e74705SXin Li typedef ast_matchers::internal::ArgumentAdaptingMatcherFunc< 491*67e74705SXin Li ArgumentAdapterT, FromTypes, ToTypes> AdaptativeFunc; 492*67e74705SXin Li 493*67e74705SXin Li /// \brief End case for the recursion 494*67e74705SXin Li static void collect(ast_matchers::internal::EmptyTypeList) {} 495*67e74705SXin Li 496*67e74705SXin Li /// \brief Recursive case. Get the overload for the head of the list, and 497*67e74705SXin Li /// recurse to the tail. 498*67e74705SXin Li template <typename FromTypeList> 499*67e74705SXin Li inline void collect(FromTypeList); 500*67e74705SXin Li 501*67e74705SXin Li StringRef Name; 502*67e74705SXin Li std::vector<MatcherDescriptor *> &Out; 503*67e74705SXin Li }; 504*67e74705SXin Li 505*67e74705SXin Li /// \brief MatcherDescriptor that wraps multiple "overloads" of the same 506*67e74705SXin Li /// matcher. 507*67e74705SXin Li /// 508*67e74705SXin Li /// It will try every overload and generate appropriate errors for when none or 509*67e74705SXin Li /// more than one overloads match the arguments. 510*67e74705SXin Li class OverloadedMatcherDescriptor : public MatcherDescriptor { 511*67e74705SXin Li public: 512*67e74705SXin Li OverloadedMatcherDescriptor(ArrayRef<MatcherDescriptor *> Callbacks) 513*67e74705SXin Li : Overloads(Callbacks.begin(), Callbacks.end()) {} 514*67e74705SXin Li 515*67e74705SXin Li ~OverloadedMatcherDescriptor() override {} 516*67e74705SXin Li 517*67e74705SXin Li VariantMatcher create(SourceRange NameRange, 518*67e74705SXin Li ArrayRef<ParserValue> Args, 519*67e74705SXin Li Diagnostics *Error) const override { 520*67e74705SXin Li std::vector<VariantMatcher> Constructed; 521*67e74705SXin Li Diagnostics::OverloadContext Ctx(Error); 522*67e74705SXin Li for (const auto &O : Overloads) { 523*67e74705SXin Li VariantMatcher SubMatcher = O->create(NameRange, Args, Error); 524*67e74705SXin Li if (!SubMatcher.isNull()) { 525*67e74705SXin Li Constructed.push_back(SubMatcher); 526*67e74705SXin Li } 527*67e74705SXin Li } 528*67e74705SXin Li 529*67e74705SXin Li if (Constructed.empty()) return VariantMatcher(); // No overload matched. 530*67e74705SXin Li // We ignore the errors if any matcher succeeded. 531*67e74705SXin Li Ctx.revertErrors(); 532*67e74705SXin Li if (Constructed.size() > 1) { 533*67e74705SXin Li // More than one constructed. It is ambiguous. 534*67e74705SXin Li Error->addError(NameRange, Error->ET_RegistryAmbiguousOverload); 535*67e74705SXin Li return VariantMatcher(); 536*67e74705SXin Li } 537*67e74705SXin Li return Constructed[0]; 538*67e74705SXin Li } 539*67e74705SXin Li 540*67e74705SXin Li bool isVariadic() const override { 541*67e74705SXin Li bool Overload0Variadic = Overloads[0]->isVariadic(); 542*67e74705SXin Li #ifndef NDEBUG 543*67e74705SXin Li for (const auto &O : Overloads) { 544*67e74705SXin Li assert(Overload0Variadic == O->isVariadic()); 545*67e74705SXin Li } 546*67e74705SXin Li #endif 547*67e74705SXin Li return Overload0Variadic; 548*67e74705SXin Li } 549*67e74705SXin Li 550*67e74705SXin Li unsigned getNumArgs() const override { 551*67e74705SXin Li unsigned Overload0NumArgs = Overloads[0]->getNumArgs(); 552*67e74705SXin Li #ifndef NDEBUG 553*67e74705SXin Li for (const auto &O : Overloads) { 554*67e74705SXin Li assert(Overload0NumArgs == O->getNumArgs()); 555*67e74705SXin Li } 556*67e74705SXin Li #endif 557*67e74705SXin Li return Overload0NumArgs; 558*67e74705SXin Li } 559*67e74705SXin Li 560*67e74705SXin Li void getArgKinds(ast_type_traits::ASTNodeKind ThisKind, unsigned ArgNo, 561*67e74705SXin Li std::vector<ArgKind> &Kinds) const override { 562*67e74705SXin Li for (const auto &O : Overloads) { 563*67e74705SXin Li if (O->isConvertibleTo(ThisKind)) 564*67e74705SXin Li O->getArgKinds(ThisKind, ArgNo, Kinds); 565*67e74705SXin Li } 566*67e74705SXin Li } 567*67e74705SXin Li 568*67e74705SXin Li bool isConvertibleTo( 569*67e74705SXin Li ast_type_traits::ASTNodeKind Kind, unsigned *Specificity, 570*67e74705SXin Li ast_type_traits::ASTNodeKind *LeastDerivedKind) const override { 571*67e74705SXin Li for (const auto &O : Overloads) { 572*67e74705SXin Li if (O->isConvertibleTo(Kind, Specificity, LeastDerivedKind)) 573*67e74705SXin Li return true; 574*67e74705SXin Li } 575*67e74705SXin Li return false; 576*67e74705SXin Li } 577*67e74705SXin Li 578*67e74705SXin Li private: 579*67e74705SXin Li std::vector<std::unique_ptr<MatcherDescriptor>> Overloads; 580*67e74705SXin Li }; 581*67e74705SXin Li 582*67e74705SXin Li /// \brief Variadic operator marshaller function. 583*67e74705SXin Li class VariadicOperatorMatcherDescriptor : public MatcherDescriptor { 584*67e74705SXin Li public: 585*67e74705SXin Li typedef DynTypedMatcher::VariadicOperator VarOp; 586*67e74705SXin Li VariadicOperatorMatcherDescriptor(unsigned MinCount, unsigned MaxCount, 587*67e74705SXin Li VarOp Op, StringRef MatcherName) 588*67e74705SXin Li : MinCount(MinCount), MaxCount(MaxCount), Op(Op), 589*67e74705SXin Li MatcherName(MatcherName) {} 590*67e74705SXin Li 591*67e74705SXin Li VariantMatcher create(SourceRange NameRange, 592*67e74705SXin Li ArrayRef<ParserValue> Args, 593*67e74705SXin Li Diagnostics *Error) const override { 594*67e74705SXin Li if (Args.size() < MinCount || MaxCount < Args.size()) { 595*67e74705SXin Li const std::string MaxStr = 596*67e74705SXin Li (MaxCount == UINT_MAX ? "" : Twine(MaxCount)).str(); 597*67e74705SXin Li Error->addError(NameRange, Error->ET_RegistryWrongArgCount) 598*67e74705SXin Li << ("(" + Twine(MinCount) + ", " + MaxStr + ")") << Args.size(); 599*67e74705SXin Li return VariantMatcher(); 600*67e74705SXin Li } 601*67e74705SXin Li 602*67e74705SXin Li std::vector<VariantMatcher> InnerArgs; 603*67e74705SXin Li for (size_t i = 0, e = Args.size(); i != e; ++i) { 604*67e74705SXin Li const ParserValue &Arg = Args[i]; 605*67e74705SXin Li const VariantValue &Value = Arg.Value; 606*67e74705SXin Li if (!Value.isMatcher()) { 607*67e74705SXin Li Error->addError(Arg.Range, Error->ET_RegistryWrongArgType) 608*67e74705SXin Li << (i + 1) << "Matcher<>" << Value.getTypeAsString(); 609*67e74705SXin Li return VariantMatcher(); 610*67e74705SXin Li } 611*67e74705SXin Li InnerArgs.push_back(Value.getMatcher()); 612*67e74705SXin Li } 613*67e74705SXin Li return VariantMatcher::VariadicOperatorMatcher(Op, std::move(InnerArgs)); 614*67e74705SXin Li } 615*67e74705SXin Li 616*67e74705SXin Li bool isVariadic() const override { return true; } 617*67e74705SXin Li unsigned getNumArgs() const override { return 0; } 618*67e74705SXin Li void getArgKinds(ast_type_traits::ASTNodeKind ThisKind, unsigned ArgNo, 619*67e74705SXin Li std::vector<ArgKind> &Kinds) const override { 620*67e74705SXin Li Kinds.push_back(ThisKind); 621*67e74705SXin Li } 622*67e74705SXin Li bool isConvertibleTo(ast_type_traits::ASTNodeKind Kind, unsigned *Specificity, 623*67e74705SXin Li ast_type_traits::ASTNodeKind *LeastDerivedKind) const override { 624*67e74705SXin Li if (Specificity) 625*67e74705SXin Li *Specificity = 1; 626*67e74705SXin Li if (LeastDerivedKind) 627*67e74705SXin Li *LeastDerivedKind = Kind; 628*67e74705SXin Li return true; 629*67e74705SXin Li } 630*67e74705SXin Li bool isPolymorphic() const override { return true; } 631*67e74705SXin Li 632*67e74705SXin Li private: 633*67e74705SXin Li const unsigned MinCount; 634*67e74705SXin Li const unsigned MaxCount; 635*67e74705SXin Li const VarOp Op; 636*67e74705SXin Li const StringRef MatcherName; 637*67e74705SXin Li }; 638*67e74705SXin Li 639*67e74705SXin Li /// Helper functions to select the appropriate marshaller functions. 640*67e74705SXin Li /// They detect the number of arguments, arguments types and return type. 641*67e74705SXin Li 642*67e74705SXin Li /// \brief 0-arg overload 643*67e74705SXin Li template <typename ReturnType> 644*67e74705SXin Li MatcherDescriptor *makeMatcherAutoMarshall(ReturnType (*Func)(), 645*67e74705SXin Li StringRef MatcherName) { 646*67e74705SXin Li std::vector<ast_type_traits::ASTNodeKind> RetTypes; 647*67e74705SXin Li BuildReturnTypeVector<ReturnType>::build(RetTypes); 648*67e74705SXin Li return new FixedArgCountMatcherDescriptor( 649*67e74705SXin Li matcherMarshall0<ReturnType>, reinterpret_cast<void (*)()>(Func), 650*67e74705SXin Li MatcherName, RetTypes, None); 651*67e74705SXin Li } 652*67e74705SXin Li 653*67e74705SXin Li /// \brief 1-arg overload 654*67e74705SXin Li template <typename ReturnType, typename ArgType1> 655*67e74705SXin Li MatcherDescriptor *makeMatcherAutoMarshall(ReturnType (*Func)(ArgType1), 656*67e74705SXin Li StringRef MatcherName) { 657*67e74705SXin Li std::vector<ast_type_traits::ASTNodeKind> RetTypes; 658*67e74705SXin Li BuildReturnTypeVector<ReturnType>::build(RetTypes); 659*67e74705SXin Li ArgKind AK = ArgTypeTraits<ArgType1>::getKind(); 660*67e74705SXin Li return new FixedArgCountMatcherDescriptor( 661*67e74705SXin Li matcherMarshall1<ReturnType, ArgType1>, 662*67e74705SXin Li reinterpret_cast<void (*)()>(Func), MatcherName, RetTypes, AK); 663*67e74705SXin Li } 664*67e74705SXin Li 665*67e74705SXin Li /// \brief 2-arg overload 666*67e74705SXin Li template <typename ReturnType, typename ArgType1, typename ArgType2> 667*67e74705SXin Li MatcherDescriptor *makeMatcherAutoMarshall(ReturnType (*Func)(ArgType1, ArgType2), 668*67e74705SXin Li StringRef MatcherName) { 669*67e74705SXin Li std::vector<ast_type_traits::ASTNodeKind> RetTypes; 670*67e74705SXin Li BuildReturnTypeVector<ReturnType>::build(RetTypes); 671*67e74705SXin Li ArgKind AKs[] = { ArgTypeTraits<ArgType1>::getKind(), 672*67e74705SXin Li ArgTypeTraits<ArgType2>::getKind() }; 673*67e74705SXin Li return new FixedArgCountMatcherDescriptor( 674*67e74705SXin Li matcherMarshall2<ReturnType, ArgType1, ArgType2>, 675*67e74705SXin Li reinterpret_cast<void (*)()>(Func), MatcherName, RetTypes, AKs); 676*67e74705SXin Li } 677*67e74705SXin Li 678*67e74705SXin Li /// \brief Variadic overload. 679*67e74705SXin Li template <typename ResultT, typename ArgT, 680*67e74705SXin Li ResultT (*Func)(ArrayRef<const ArgT *>)> 681*67e74705SXin Li MatcherDescriptor *makeMatcherAutoMarshall( 682*67e74705SXin Li ast_matchers::internal::VariadicFunction<ResultT, ArgT, Func> VarFunc, 683*67e74705SXin Li StringRef MatcherName) { 684*67e74705SXin Li return new VariadicFuncMatcherDescriptor(VarFunc, MatcherName); 685*67e74705SXin Li } 686*67e74705SXin Li 687*67e74705SXin Li /// \brief Overload for VariadicDynCastAllOfMatchers. 688*67e74705SXin Li /// 689*67e74705SXin Li /// Not strictly necessary, but DynCastAllOfMatcherDescriptor gives us better 690*67e74705SXin Li /// completion results for that type of matcher. 691*67e74705SXin Li template <typename BaseT, typename DerivedT> 692*67e74705SXin Li MatcherDescriptor * 693*67e74705SXin Li makeMatcherAutoMarshall(ast_matchers::internal::VariadicDynCastAllOfMatcher< 694*67e74705SXin Li BaseT, DerivedT> VarFunc, 695*67e74705SXin Li StringRef MatcherName) { 696*67e74705SXin Li return new DynCastAllOfMatcherDescriptor(VarFunc, MatcherName); 697*67e74705SXin Li } 698*67e74705SXin Li 699*67e74705SXin Li /// \brief Argument adaptative overload. 700*67e74705SXin Li template <template <typename ToArg, typename FromArg> class ArgumentAdapterT, 701*67e74705SXin Li typename FromTypes, typename ToTypes> 702*67e74705SXin Li MatcherDescriptor * 703*67e74705SXin Li makeMatcherAutoMarshall(ast_matchers::internal::ArgumentAdaptingMatcherFunc< 704*67e74705SXin Li ArgumentAdapterT, FromTypes, ToTypes>, 705*67e74705SXin Li StringRef MatcherName) { 706*67e74705SXin Li std::vector<MatcherDescriptor *> Overloads; 707*67e74705SXin Li AdaptativeOverloadCollector<ArgumentAdapterT, FromTypes, ToTypes>(MatcherName, 708*67e74705SXin Li Overloads); 709*67e74705SXin Li return new OverloadedMatcherDescriptor(Overloads); 710*67e74705SXin Li } 711*67e74705SXin Li 712*67e74705SXin Li template <template <typename ToArg, typename FromArg> class ArgumentAdapterT, 713*67e74705SXin Li typename FromTypes, typename ToTypes> 714*67e74705SXin Li template <typename FromTypeList> 715*67e74705SXin Li inline void AdaptativeOverloadCollector<ArgumentAdapterT, FromTypes, 716*67e74705SXin Li ToTypes>::collect(FromTypeList) { 717*67e74705SXin Li Out.push_back(makeMatcherAutoMarshall( 718*67e74705SXin Li &AdaptativeFunc::template create<typename FromTypeList::head>, Name)); 719*67e74705SXin Li collect(typename FromTypeList::tail()); 720*67e74705SXin Li } 721*67e74705SXin Li 722*67e74705SXin Li /// \brief Variadic operator overload. 723*67e74705SXin Li template <unsigned MinCount, unsigned MaxCount> 724*67e74705SXin Li MatcherDescriptor * 725*67e74705SXin Li makeMatcherAutoMarshall(ast_matchers::internal::VariadicOperatorMatcherFunc< 726*67e74705SXin Li MinCount, MaxCount> Func, 727*67e74705SXin Li StringRef MatcherName) { 728*67e74705SXin Li return new VariadicOperatorMatcherDescriptor(MinCount, MaxCount, Func.Op, 729*67e74705SXin Li MatcherName); 730*67e74705SXin Li } 731*67e74705SXin Li 732*67e74705SXin Li } // namespace internal 733*67e74705SXin Li } // namespace dynamic 734*67e74705SXin Li } // namespace ast_matchers 735*67e74705SXin Li } // namespace clang 736*67e74705SXin Li 737*67e74705SXin Li #endif // LLVM_CLANG_AST_MATCHERS_DYNAMIC_MARSHALLERS_H 738