xref: /aosp_15_r20/external/clang/lib/ASTMatchers/Dynamic/Marshallers.h (revision 67e74705e28f6214e480b399dd47ea732279e315)
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