xref: /netbsd-src/external/apache2/llvm/dist/clang/lib/ASTMatchers/Dynamic/Marshallers.h (revision e038c9c4676b0f19b1b7dd08a940c6ed64a6d5ae)
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