1 //===- Marshallers.h - Generic matcher function marshallers -----*- C++ -*-===//
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
7 //===----------------------------------------------------------------------===//
10 /// Functions templates and classes to wrap matcher construct functions.
12 /// A collection of template function and classes that provide a generic
13 /// marshalling layer on top of matcher construct functions.
14 /// These are used by the registry to export all marshaller constructors with
15 /// the same generic interface.
17 //===----------------------------------------------------------------------===//
19 #ifndef LLVM_CLANG_LIB_ASTMATCHERS_DYNAMIC_MARSHALLERS_H
20 #define LLVM_CLANG_LIB_ASTMATCHERS_DYNAMIC_MARSHALLERS_H
22 #include "clang/AST/ASTTypeTraits.h"
23 #include "clang/AST/OperationKinds.h"
24 #include "clang/ASTMatchers/ASTMatchersInternal.h"
25 #include "clang/ASTMatchers/Dynamic/Diagnostics.h"
26 #include "clang/ASTMatchers/Dynamic/VariantValue.h"
27 #include "clang/Basic/AttrKinds.h"
28 #include "clang/Basic/LLVM.h"
29 #include "clang/Basic/OpenMPKinds.h"
30 #include "clang/Basic/TypeTraits.h"
31 #include "llvm/ADT/ArrayRef.h"
32 #include "llvm/ADT/STLExtras.h"
33 #include "llvm/ADT/StringRef.h"
34 #include "llvm/ADT/StringSwitch.h"
35 #include "llvm/ADT/Twine.h"
36 #include "llvm/Support/Regex.h"
48 namespace ast_matchers
{
52 /// Helper template class to just from argument type to the right is/get
53 /// functions in VariantValue.
54 /// Used to verify and extract the matcher arguments below.
55 template <class T
> struct ArgTypeTraits
;
56 template <class T
> struct ArgTypeTraits
<const T
&> : public ArgTypeTraits
<T
> {
59 template <> struct ArgTypeTraits
<std::string
> {
60 static bool hasCorrectType(const VariantValue
&Value
) {
61 return Value
.isString();
63 static bool hasCorrectValue(const VariantValue
&Value
) { return true; }
65 static const std::string
&get(const VariantValue
&Value
) {
66 return Value
.getString();
69 static ArgKind
getKind() {
70 return ArgKind(ArgKind::AK_String
);
73 static std::optional
<std::string
> getBestGuess(const VariantValue
&) {
79 struct ArgTypeTraits
<StringRef
> : public ArgTypeTraits
<std::string
> {
82 template <class T
> struct ArgTypeTraits
<ast_matchers::internal::Matcher
<T
>> {
83 static bool hasCorrectType(const VariantValue
& Value
) {
84 return Value
.isMatcher();
86 static bool hasCorrectValue(const VariantValue
&Value
) {
87 return Value
.getMatcher().hasTypedMatcher
<T
>();
90 static ast_matchers::internal::Matcher
<T
> get(const VariantValue
&Value
) {
91 return Value
.getMatcher().getTypedMatcher
<T
>();
94 static ArgKind
getKind() {
95 return ArgKind::MakeMatcherArg(ASTNodeKind::getFromNodeKind
<T
>());
98 static std::optional
<std::string
> getBestGuess(const VariantValue
&) {
103 template <> struct ArgTypeTraits
<bool> {
104 static bool hasCorrectType(const VariantValue
&Value
) {
105 return Value
.isBoolean();
107 static bool hasCorrectValue(const VariantValue
&Value
) { return true; }
109 static bool get(const VariantValue
&Value
) {
110 return Value
.getBoolean();
113 static ArgKind
getKind() {
114 return ArgKind(ArgKind::AK_Boolean
);
117 static std::optional
<std::string
> getBestGuess(const VariantValue
&) {
122 template <> struct ArgTypeTraits
<double> {
123 static bool hasCorrectType(const VariantValue
&Value
) {
124 return Value
.isDouble();
126 static bool hasCorrectValue(const VariantValue
&Value
) { return true; }
128 static double get(const VariantValue
&Value
) {
129 return Value
.getDouble();
132 static ArgKind
getKind() {
133 return ArgKind(ArgKind::AK_Double
);
136 static std::optional
<std::string
> getBestGuess(const VariantValue
&) {
141 template <> struct ArgTypeTraits
<unsigned> {
142 static bool hasCorrectType(const VariantValue
&Value
) {
143 return Value
.isUnsigned();
145 static bool hasCorrectValue(const VariantValue
&Value
) { return true; }
147 static unsigned get(const VariantValue
&Value
) {
148 return Value
.getUnsigned();
151 static ArgKind
getKind() {
152 return ArgKind(ArgKind::AK_Unsigned
);
155 static std::optional
<std::string
> getBestGuess(const VariantValue
&) {
160 template <> struct ArgTypeTraits
<attr::Kind
> {
162 static std::optional
<attr::Kind
> getAttrKind(llvm::StringRef AttrKind
) {
163 if (!AttrKind
.consume_front("attr::"))
165 return llvm::StringSwitch
<std::optional
<attr::Kind
>>(AttrKind
)
166 #define ATTR(X) .Case(#X, attr::X)
167 #include "clang/Basic/AttrList.inc"
168 .Default(std::nullopt
);
172 static bool hasCorrectType(const VariantValue
&Value
) {
173 return Value
.isString();
175 static bool hasCorrectValue(const VariantValue
& Value
) {
176 return getAttrKind(Value
.getString()).has_value();
179 static attr::Kind
get(const VariantValue
&Value
) {
180 return *getAttrKind(Value
.getString());
183 static ArgKind
getKind() {
184 return ArgKind(ArgKind::AK_String
);
187 static std::optional
<std::string
> getBestGuess(const VariantValue
&Value
);
190 template <> struct ArgTypeTraits
<CastKind
> {
192 static std::optional
<CastKind
> getCastKind(llvm::StringRef AttrKind
) {
193 if (!AttrKind
.consume_front("CK_"))
195 return llvm::StringSwitch
<std::optional
<CastKind
>>(AttrKind
)
196 #define CAST_OPERATION(Name) .Case(#Name, CK_##Name)
197 #include "clang/AST/OperationKinds.def"
198 .Default(std::nullopt
);
202 static bool hasCorrectType(const VariantValue
&Value
) {
203 return Value
.isString();
205 static bool hasCorrectValue(const VariantValue
& Value
) {
206 return getCastKind(Value
.getString()).has_value();
209 static CastKind
get(const VariantValue
&Value
) {
210 return *getCastKind(Value
.getString());
213 static ArgKind
getKind() {
214 return ArgKind(ArgKind::AK_String
);
217 static std::optional
<std::string
> getBestGuess(const VariantValue
&Value
);
220 template <> struct ArgTypeTraits
<llvm::Regex::RegexFlags
> {
222 static std::optional
<llvm::Regex::RegexFlags
> getFlags(llvm::StringRef Flags
);
225 static bool hasCorrectType(const VariantValue
&Value
) {
226 return Value
.isString();
228 static bool hasCorrectValue(const VariantValue
& Value
) {
229 return getFlags(Value
.getString()).has_value();
232 static llvm::Regex::RegexFlags
get(const VariantValue
&Value
) {
233 return *getFlags(Value
.getString());
236 static ArgKind
getKind() { return ArgKind(ArgKind::AK_String
); }
238 static std::optional
<std::string
> getBestGuess(const VariantValue
&Value
);
241 template <> struct ArgTypeTraits
<OpenMPClauseKind
> {
243 static std::optional
<OpenMPClauseKind
>
244 getClauseKind(llvm::StringRef ClauseKind
) {
245 return llvm::StringSwitch
<std::optional
<OpenMPClauseKind
>>(ClauseKind
)
246 #define GEN_CLANG_CLAUSE_CLASS
247 #define CLAUSE_CLASS(Enum, Str, Class) .Case(#Enum, llvm::omp::Clause::Enum)
248 #include "llvm/Frontend/OpenMP/OMP.inc"
249 .Default(std::nullopt
);
253 static bool hasCorrectType(const VariantValue
&Value
) {
254 return Value
.isString();
256 static bool hasCorrectValue(const VariantValue
& Value
) {
257 return getClauseKind(Value
.getString()).has_value();
260 static OpenMPClauseKind
get(const VariantValue
&Value
) {
261 return *getClauseKind(Value
.getString());
264 static ArgKind
getKind() { return ArgKind(ArgKind::AK_String
); }
266 static std::optional
<std::string
> getBestGuess(const VariantValue
&Value
);
269 template <> struct ArgTypeTraits
<UnaryExprOrTypeTrait
> {
271 static std::optional
<UnaryExprOrTypeTrait
>
272 getUnaryOrTypeTraitKind(llvm::StringRef ClauseKind
) {
273 if (!ClauseKind
.consume_front("UETT_"))
275 return llvm::StringSwitch
<std::optional
<UnaryExprOrTypeTrait
>>(ClauseKind
)
276 #define UNARY_EXPR_OR_TYPE_TRAIT(Spelling, Name, Key) .Case(#Name, UETT_##Name)
277 #define CXX11_UNARY_EXPR_OR_TYPE_TRAIT(Spelling, Name, Key) \
278 .Case(#Name, UETT_##Name)
279 #include "clang/Basic/TokenKinds.def"
280 .Default(std::nullopt
);
284 static bool hasCorrectType(const VariantValue
&Value
) {
285 return Value
.isString();
287 static bool hasCorrectValue(const VariantValue
& Value
) {
288 return getUnaryOrTypeTraitKind(Value
.getString()).has_value();
291 static UnaryExprOrTypeTrait
get(const VariantValue
&Value
) {
292 return *getUnaryOrTypeTraitKind(Value
.getString());
295 static ArgKind
getKind() { return ArgKind(ArgKind::AK_String
); }
297 static std::optional
<std::string
> getBestGuess(const VariantValue
&Value
);
300 /// Matcher descriptor interface.
302 /// Provides a \c create() method that constructs the matcher from the provided
303 /// arguments, and various other methods for type introspection.
304 class MatcherDescriptor
{
306 virtual ~MatcherDescriptor() = default;
308 virtual VariantMatcher
create(SourceRange NameRange
,
309 ArrayRef
<ParserValue
> Args
,
310 Diagnostics
*Error
) const = 0;
312 virtual ASTNodeKind
nodeMatcherType() const { return ASTNodeKind(); }
314 virtual bool isBuilderMatcher() const { return false; }
316 virtual std::unique_ptr
<MatcherDescriptor
>
317 buildMatcherCtor(SourceRange NameRange
, ArrayRef
<ParserValue
> Args
,
318 Diagnostics
*Error
) const {
322 /// Returns whether the matcher is variadic. Variadic matchers can take any
323 /// number of arguments, but they must be of the same type.
324 virtual bool isVariadic() const = 0;
326 /// Returns the number of arguments accepted by the matcher if not variadic.
327 virtual unsigned getNumArgs() const = 0;
329 /// Given that the matcher is being converted to type \p ThisKind, append the
330 /// set of argument types accepted for argument \p ArgNo to \p ArgKinds.
331 // FIXME: We should provide the ability to constrain the output of this
332 // function based on the types of other matcher arguments.
333 virtual void getArgKinds(ASTNodeKind ThisKind
, unsigned ArgNo
,
334 std::vector
<ArgKind
> &ArgKinds
) const = 0;
336 /// Returns whether this matcher is convertible to the given type. If it is
337 /// so convertible, store in *Specificity a value corresponding to the
338 /// "specificity" of the converted matcher to the given context, and in
339 /// *LeastDerivedKind the least derived matcher kind which would result in the
340 /// same matcher overload. Zero specificity indicates that this conversion
341 /// would produce a trivial matcher that will either always or never match.
342 /// Such matchers are excluded from code completion results.
344 isConvertibleTo(ASTNodeKind Kind
, unsigned *Specificity
= nullptr,
345 ASTNodeKind
*LeastDerivedKind
= nullptr) const = 0;
347 /// Returns whether the matcher will, given a matcher of any type T, yield a
348 /// matcher of type T.
349 virtual bool isPolymorphic() const { return false; }
352 inline bool isRetKindConvertibleTo(ArrayRef
<ASTNodeKind
> RetKinds
,
353 ASTNodeKind Kind
, unsigned *Specificity
,
354 ASTNodeKind
*LeastDerivedKind
) {
355 for (const ASTNodeKind
&NodeKind
: RetKinds
) {
356 if (ArgKind::MakeMatcherArg(NodeKind
).isConvertibleTo(
357 ArgKind::MakeMatcherArg(Kind
), Specificity
)) {
358 if (LeastDerivedKind
)
359 *LeastDerivedKind
= NodeKind
;
366 /// Simple callback implementation. Marshaller and function are provided.
368 /// This class wraps a function of arbitrary signature and a marshaller
369 /// function into a MatcherDescriptor.
370 /// The marshaller is in charge of taking the VariantValue arguments, checking
371 /// their types, unpacking them and calling the underlying function.
372 class FixedArgCountMatcherDescriptor
: public MatcherDescriptor
{
374 using MarshallerType
= VariantMatcher (*)(void (*Func
)(),
375 StringRef MatcherName
,
376 SourceRange NameRange
,
377 ArrayRef
<ParserValue
> Args
,
380 /// \param Marshaller Function to unpack the arguments and call \c Func
381 /// \param Func Matcher construct function. This is the function that
382 /// compile-time matcher expressions would use to create the matcher.
383 /// \param RetKinds The list of matcher types to which the matcher is
385 /// \param ArgKinds The types of the arguments this matcher takes.
386 FixedArgCountMatcherDescriptor(MarshallerType Marshaller
, void (*Func
)(),
387 StringRef MatcherName
,
388 ArrayRef
<ASTNodeKind
> RetKinds
,
389 ArrayRef
<ArgKind
> ArgKinds
)
390 : Marshaller(Marshaller
), Func(Func
), MatcherName(MatcherName
),
391 RetKinds(RetKinds
.begin(), RetKinds
.end()),
392 ArgKinds(ArgKinds
.begin(), ArgKinds
.end()) {}
394 VariantMatcher
create(SourceRange NameRange
,
395 ArrayRef
<ParserValue
> Args
,
396 Diagnostics
*Error
) const override
{
397 return Marshaller(Func
, MatcherName
, NameRange
, Args
, Error
);
400 bool isVariadic() const override
{ return false; }
401 unsigned getNumArgs() const override
{ return ArgKinds
.size(); }
403 void getArgKinds(ASTNodeKind ThisKind
, unsigned ArgNo
,
404 std::vector
<ArgKind
> &Kinds
) const override
{
405 Kinds
.push_back(ArgKinds
[ArgNo
]);
408 bool isConvertibleTo(ASTNodeKind Kind
, unsigned *Specificity
,
409 ASTNodeKind
*LeastDerivedKind
) const override
{
410 return isRetKindConvertibleTo(RetKinds
, Kind
, Specificity
,
415 const MarshallerType Marshaller
;
416 void (* const Func
)();
417 const std::string MatcherName
;
418 const std::vector
<ASTNodeKind
> RetKinds
;
419 const std::vector
<ArgKind
> ArgKinds
;
422 /// Helper methods to extract and merge all possible typed matchers
423 /// out of the polymorphic object.
424 template <class PolyMatcher
>
425 static void mergePolyMatchers(const PolyMatcher
&Poly
,
426 std::vector
<DynTypedMatcher
> &Out
,
427 ast_matchers::internal::EmptyTypeList
) {}
429 template <class PolyMatcher
, class TypeList
>
430 static void mergePolyMatchers(const PolyMatcher
&Poly
,
431 std::vector
<DynTypedMatcher
> &Out
, TypeList
) {
432 Out
.push_back(ast_matchers::internal::Matcher
<typename
TypeList::head
>(Poly
));
433 mergePolyMatchers(Poly
, Out
, typename
TypeList::tail());
436 /// Convert the return values of the functions into a VariantMatcher.
438 /// There are 2 cases right now: The return value is a Matcher<T> or is a
439 /// polymorphic matcher. For the former, we just construct the VariantMatcher.
440 /// For the latter, we instantiate all the possible Matcher<T> of the poly
442 inline VariantMatcher
outvalueToVariantMatcher(const DynTypedMatcher
&Matcher
) {
443 return VariantMatcher::SingleMatcher(Matcher
);
446 template <typename T
>
447 static VariantMatcher
outvalueToVariantMatcher(const T
&PolyMatcher
,
448 typename
T::ReturnTypes
* =
450 std::vector
<DynTypedMatcher
> Matchers
;
451 mergePolyMatchers(PolyMatcher
, Matchers
, typename
T::ReturnTypes());
452 VariantMatcher Out
= VariantMatcher::PolymorphicMatcher(std::move(Matchers
));
456 template <typename T
>
458 buildReturnTypeVectorFromTypeList(std::vector
<ASTNodeKind
> &RetTypes
) {
459 RetTypes
.push_back(ASTNodeKind::getFromNodeKind
<typename
T::head
>());
460 buildReturnTypeVectorFromTypeList
<typename
T::tail
>(RetTypes
);
465 buildReturnTypeVectorFromTypeList
<ast_matchers::internal::EmptyTypeList
>(
466 std::vector
<ASTNodeKind
> &RetTypes
) {}
468 template <typename T
>
469 struct BuildReturnTypeVector
{
470 static void build(std::vector
<ASTNodeKind
> &RetTypes
) {
471 buildReturnTypeVectorFromTypeList
<typename
T::ReturnTypes
>(RetTypes
);
475 template <typename T
>
476 struct BuildReturnTypeVector
<ast_matchers::internal::Matcher
<T
>> {
477 static void build(std::vector
<ASTNodeKind
> &RetTypes
) {
478 RetTypes
.push_back(ASTNodeKind::getFromNodeKind
<T
>());
482 template <typename T
>
483 struct BuildReturnTypeVector
<ast_matchers::internal::BindableMatcher
<T
>> {
484 static void build(std::vector
<ASTNodeKind
> &RetTypes
) {
485 RetTypes
.push_back(ASTNodeKind::getFromNodeKind
<T
>());
489 /// Variadic marshaller function.
490 template <typename ResultT
, typename ArgT
,
491 ResultT (*Func
)(ArrayRef
<const ArgT
*>)>
493 variadicMatcherDescriptor(StringRef MatcherName
, SourceRange NameRange
,
494 ArrayRef
<ParserValue
> Args
, Diagnostics
*Error
) {
495 SmallVector
<ArgT
*, 8> InnerArgsPtr
;
496 InnerArgsPtr
.resize_for_overwrite(Args
.size());
497 SmallVector
<ArgT
, 8> InnerArgs
;
498 InnerArgs
.reserve(Args
.size());
500 for (size_t i
= 0, e
= Args
.size(); i
!= e
; ++i
) {
501 using ArgTraits
= ArgTypeTraits
<ArgT
>;
503 const ParserValue
&Arg
= Args
[i
];
504 const VariantValue
&Value
= Arg
.Value
;
505 if (!ArgTraits::hasCorrectType(Value
)) {
506 Error
->addError(Arg
.Range
, Error
->ET_RegistryWrongArgType
)
507 << (i
+ 1) << ArgTraits::getKind().asString() << Value
.getTypeAsString();
510 if (!ArgTraits::hasCorrectValue(Value
)) {
511 if (std::optional
<std::string
> BestGuess
=
512 ArgTraits::getBestGuess(Value
)) {
513 Error
->addError(Arg
.Range
, Error
->ET_RegistryUnknownEnumWithReplace
)
514 << i
+ 1 << Value
.getString() << *BestGuess
;
515 } else if (Value
.isString()) {
516 Error
->addError(Arg
.Range
, Error
->ET_RegistryValueNotFound
)
517 << Value
.getString();
519 // This isn't ideal, but it's better than reporting an empty string as
520 // the error in this case.
521 Error
->addError(Arg
.Range
, Error
->ET_RegistryWrongArgType
)
522 << (i
+ 1) << ArgTraits::getKind().asString()
523 << Value
.getTypeAsString();
527 assert(InnerArgs
.size() < InnerArgs
.capacity());
528 InnerArgs
.emplace_back(ArgTraits::get(Value
));
529 InnerArgsPtr
[i
] = &InnerArgs
[i
];
531 return outvalueToVariantMatcher(Func(InnerArgsPtr
));
534 /// Matcher descriptor for variadic functions.
536 /// This class simply wraps a VariadicFunction with the right signature to export
537 /// it as a MatcherDescriptor.
538 /// This allows us to have one implementation of the interface for as many free
539 /// functions as we want, reducing the number of symbols and size of the
541 class VariadicFuncMatcherDescriptor
: public MatcherDescriptor
{
543 using RunFunc
= VariantMatcher (*)(StringRef MatcherName
,
544 SourceRange NameRange
,
545 ArrayRef
<ParserValue
> Args
,
548 template <typename ResultT
, typename ArgT
,
549 ResultT (*F
)(ArrayRef
<const ArgT
*>)>
550 VariadicFuncMatcherDescriptor(
551 ast_matchers::internal::VariadicFunction
<ResultT
, ArgT
, F
> Func
,
552 StringRef MatcherName
)
553 : Func(&variadicMatcherDescriptor
<ResultT
, ArgT
, F
>),
554 MatcherName(MatcherName
.str()),
555 ArgsKind(ArgTypeTraits
<ArgT
>::getKind()) {
556 BuildReturnTypeVector
<ResultT
>::build(RetKinds
);
559 VariantMatcher
create(SourceRange NameRange
,
560 ArrayRef
<ParserValue
> Args
,
561 Diagnostics
*Error
) const override
{
562 return Func(MatcherName
, NameRange
, Args
, Error
);
565 bool isVariadic() const override
{ return true; }
566 unsigned getNumArgs() const override
{ return 0; }
568 void getArgKinds(ASTNodeKind ThisKind
, unsigned ArgNo
,
569 std::vector
<ArgKind
> &Kinds
) const override
{
570 Kinds
.push_back(ArgsKind
);
573 bool isConvertibleTo(ASTNodeKind Kind
, unsigned *Specificity
,
574 ASTNodeKind
*LeastDerivedKind
) const override
{
575 return isRetKindConvertibleTo(RetKinds
, Kind
, Specificity
,
579 ASTNodeKind
nodeMatcherType() const override
{ return RetKinds
[0]; }
583 const std::string MatcherName
;
584 std::vector
<ASTNodeKind
> RetKinds
;
585 const ArgKind ArgsKind
;
588 /// Return CK_Trivial when appropriate for VariadicDynCastAllOfMatchers.
589 class DynCastAllOfMatcherDescriptor
: public VariadicFuncMatcherDescriptor
{
591 template <typename BaseT
, typename DerivedT
>
592 DynCastAllOfMatcherDescriptor(
593 ast_matchers::internal::VariadicDynCastAllOfMatcher
<BaseT
, DerivedT
> Func
,
594 StringRef MatcherName
)
595 : VariadicFuncMatcherDescriptor(Func
, MatcherName
),
596 DerivedKind(ASTNodeKind::getFromNodeKind
<DerivedT
>()) {}
598 bool isConvertibleTo(ASTNodeKind Kind
, unsigned *Specificity
,
599 ASTNodeKind
*LeastDerivedKind
) const override
{
600 // If Kind is not a base of DerivedKind, either DerivedKind is a base of
601 // Kind (in which case the match will always succeed) or Kind and
602 // DerivedKind are unrelated (in which case it will always fail), so set
604 if (VariadicFuncMatcherDescriptor::isConvertibleTo(Kind
, Specificity
,
606 if (Kind
.isSame(DerivedKind
) || !Kind
.isBaseOf(DerivedKind
)) {
616 ASTNodeKind
nodeMatcherType() const override
{ return DerivedKind
; }
619 const ASTNodeKind DerivedKind
;
622 /// Helper macros to check the arguments on all marshaller functions.
623 #define CHECK_ARG_COUNT(count) \
624 if (Args.size() != count) { \
625 Error->addError(NameRange, Error->ET_RegistryWrongArgCount) \
626 << count << Args.size(); \
627 return VariantMatcher(); \
630 #define CHECK_ARG_TYPE(index, type) \
631 if (!ArgTypeTraits<type>::hasCorrectType(Args[index].Value)) { \
632 Error->addError(Args[index].Range, Error->ET_RegistryWrongArgType) \
633 << (index + 1) << ArgTypeTraits<type>::getKind().asString() \
634 << Args[index].Value.getTypeAsString(); \
635 return VariantMatcher(); \
637 if (!ArgTypeTraits<type>::hasCorrectValue(Args[index].Value)) { \
638 if (std::optional<std::string> BestGuess = \
639 ArgTypeTraits<type>::getBestGuess(Args[index].Value)) { \
640 Error->addError(Args[index].Range, \
641 Error->ET_RegistryUnknownEnumWithReplace) \
642 << index + 1 << Args[index].Value.getString() << *BestGuess; \
643 } else if (Args[index].Value.isString()) { \
644 Error->addError(Args[index].Range, Error->ET_RegistryValueNotFound) \
645 << Args[index].Value.getString(); \
647 return VariantMatcher(); \
650 /// 0-arg marshaller function.
651 template <typename ReturnType
>
652 static VariantMatcher
matcherMarshall0(void (*Func
)(), StringRef MatcherName
,
653 SourceRange NameRange
,
654 ArrayRef
<ParserValue
> Args
,
655 Diagnostics
*Error
) {
656 using FuncType
= ReturnType (*)();
658 return outvalueToVariantMatcher(reinterpret_cast<FuncType
>(Func
)());
661 /// 1-arg marshaller function.
662 template <typename ReturnType
, typename ArgType1
>
663 static VariantMatcher
matcherMarshall1(void (*Func
)(), StringRef MatcherName
,
664 SourceRange NameRange
,
665 ArrayRef
<ParserValue
> Args
,
666 Diagnostics
*Error
) {
667 using FuncType
= ReturnType (*)(ArgType1
);
669 CHECK_ARG_TYPE(0, ArgType1
);
670 return outvalueToVariantMatcher(reinterpret_cast<FuncType
>(Func
)(
671 ArgTypeTraits
<ArgType1
>::get(Args
[0].Value
)));
674 /// 2-arg marshaller function.
675 template <typename ReturnType
, typename ArgType1
, typename ArgType2
>
676 static VariantMatcher
matcherMarshall2(void (*Func
)(), StringRef MatcherName
,
677 SourceRange NameRange
,
678 ArrayRef
<ParserValue
> Args
,
679 Diagnostics
*Error
) {
680 using FuncType
= ReturnType (*)(ArgType1
, ArgType2
);
682 CHECK_ARG_TYPE(0, ArgType1
);
683 CHECK_ARG_TYPE(1, ArgType2
);
684 return outvalueToVariantMatcher(reinterpret_cast<FuncType
>(Func
)(
685 ArgTypeTraits
<ArgType1
>::get(Args
[0].Value
),
686 ArgTypeTraits
<ArgType2
>::get(Args
[1].Value
)));
689 #undef CHECK_ARG_COUNT
690 #undef CHECK_ARG_TYPE
692 /// Helper class used to collect all the possible overloads of an
693 /// argument adaptative matcher function.
694 template <template <typename ToArg
, typename FromArg
> class ArgumentAdapterT
,
695 typename FromTypes
, typename ToTypes
>
696 class AdaptativeOverloadCollector
{
698 AdaptativeOverloadCollector(
699 StringRef Name
, std::vector
<std::unique_ptr
<MatcherDescriptor
>> &Out
)
700 : Name(Name
), Out(Out
) {
701 collect(FromTypes());
705 using AdaptativeFunc
= ast_matchers::internal::ArgumentAdaptingMatcherFunc
<
706 ArgumentAdapterT
, FromTypes
, ToTypes
>;
708 /// End case for the recursion
709 static void collect(ast_matchers::internal::EmptyTypeList
) {}
711 /// Recursive case. Get the overload for the head of the list, and
712 /// recurse to the tail.
713 template <typename FromTypeList
>
714 inline void collect(FromTypeList
);
717 std::vector
<std::unique_ptr
<MatcherDescriptor
>> &Out
;
720 /// MatcherDescriptor that wraps multiple "overloads" of the same
723 /// It will try every overload and generate appropriate errors for when none or
724 /// more than one overloads match the arguments.
725 class OverloadedMatcherDescriptor
: public MatcherDescriptor
{
727 OverloadedMatcherDescriptor(
728 MutableArrayRef
<std::unique_ptr
<MatcherDescriptor
>> Callbacks
)
729 : Overloads(std::make_move_iterator(Callbacks
.begin()),
730 std::make_move_iterator(Callbacks
.end())) {}
732 ~OverloadedMatcherDescriptor() override
= default;
734 VariantMatcher
create(SourceRange NameRange
,
735 ArrayRef
<ParserValue
> Args
,
736 Diagnostics
*Error
) const override
{
737 std::vector
<VariantMatcher
> Constructed
;
738 Diagnostics::OverloadContext
Ctx(Error
);
739 for (const auto &O
: Overloads
) {
740 VariantMatcher SubMatcher
= O
->create(NameRange
, Args
, Error
);
741 if (!SubMatcher
.isNull()) {
742 Constructed
.push_back(SubMatcher
);
746 if (Constructed
.empty()) return VariantMatcher(); // No overload matched.
747 // We ignore the errors if any matcher succeeded.
749 if (Constructed
.size() > 1) {
750 // More than one constructed. It is ambiguous.
751 Error
->addError(NameRange
, Error
->ET_RegistryAmbiguousOverload
);
752 return VariantMatcher();
754 return Constructed
[0];
757 bool isVariadic() const override
{
758 bool Overload0Variadic
= Overloads
[0]->isVariadic();
760 for (const auto &O
: Overloads
) {
761 assert(Overload0Variadic
== O
->isVariadic());
764 return Overload0Variadic
;
767 unsigned getNumArgs() const override
{
768 unsigned Overload0NumArgs
= Overloads
[0]->getNumArgs();
770 for (const auto &O
: Overloads
) {
771 assert(Overload0NumArgs
== O
->getNumArgs());
774 return Overload0NumArgs
;
777 void getArgKinds(ASTNodeKind ThisKind
, unsigned ArgNo
,
778 std::vector
<ArgKind
> &Kinds
) const override
{
779 for (const auto &O
: Overloads
) {
780 if (O
->isConvertibleTo(ThisKind
))
781 O
->getArgKinds(ThisKind
, ArgNo
, Kinds
);
785 bool isConvertibleTo(ASTNodeKind Kind
, unsigned *Specificity
,
786 ASTNodeKind
*LeastDerivedKind
) const override
{
787 for (const auto &O
: Overloads
) {
788 if (O
->isConvertibleTo(Kind
, Specificity
, LeastDerivedKind
))
795 std::vector
<std::unique_ptr
<MatcherDescriptor
>> Overloads
;
798 template <typename ReturnType
>
799 class RegexMatcherDescriptor
: public MatcherDescriptor
{
801 RegexMatcherDescriptor(ReturnType (*WithFlags
)(StringRef
,
802 llvm::Regex::RegexFlags
),
803 ReturnType (*NoFlags
)(StringRef
),
804 ArrayRef
<ASTNodeKind
> RetKinds
)
805 : WithFlags(WithFlags
), NoFlags(NoFlags
),
806 RetKinds(RetKinds
.begin(), RetKinds
.end()) {}
807 bool isVariadic() const override
{ return true; }
808 unsigned getNumArgs() const override
{ return 0; }
810 void getArgKinds(ASTNodeKind ThisKind
, unsigned ArgNo
,
811 std::vector
<ArgKind
> &Kinds
) const override
{
813 Kinds
.push_back(ArgKind::AK_String
);
816 bool isConvertibleTo(ASTNodeKind Kind
, unsigned *Specificity
,
817 ASTNodeKind
*LeastDerivedKind
) const override
{
818 return isRetKindConvertibleTo(RetKinds
, Kind
, Specificity
,
822 VariantMatcher
create(SourceRange NameRange
, ArrayRef
<ParserValue
> Args
,
823 Diagnostics
*Error
) const override
{
824 if (Args
.size() < 1 || Args
.size() > 2) {
825 Error
->addError(NameRange
, Diagnostics::ET_RegistryWrongArgCount
)
826 << "1 or 2" << Args
.size();
827 return VariantMatcher();
829 if (!ArgTypeTraits
<StringRef
>::hasCorrectType(Args
[0].Value
)) {
830 Error
->addError(Args
[0].Range
, Error
->ET_RegistryWrongArgType
)
831 << 1 << ArgTypeTraits
<StringRef
>::getKind().asString()
832 << Args
[0].Value
.getTypeAsString();
833 return VariantMatcher();
835 if (Args
.size() == 1) {
836 return outvalueToVariantMatcher(
837 NoFlags(ArgTypeTraits
<StringRef
>::get(Args
[0].Value
)));
839 if (!ArgTypeTraits
<llvm::Regex::RegexFlags
>::hasCorrectType(
841 Error
->addError(Args
[1].Range
, Error
->ET_RegistryWrongArgType
)
842 << 2 << ArgTypeTraits
<llvm::Regex::RegexFlags
>::getKind().asString()
843 << Args
[1].Value
.getTypeAsString();
844 return VariantMatcher();
846 if (!ArgTypeTraits
<llvm::Regex::RegexFlags
>::hasCorrectValue(
848 if (std::optional
<std::string
> BestGuess
=
849 ArgTypeTraits
<llvm::Regex::RegexFlags
>::getBestGuess(
851 Error
->addError(Args
[1].Range
, Error
->ET_RegistryUnknownEnumWithReplace
)
852 << 2 << Args
[1].Value
.getString() << *BestGuess
;
854 Error
->addError(Args
[1].Range
, Error
->ET_RegistryValueNotFound
)
855 << Args
[1].Value
.getString();
857 return VariantMatcher();
859 return outvalueToVariantMatcher(
860 WithFlags(ArgTypeTraits
<StringRef
>::get(Args
[0].Value
),
861 ArgTypeTraits
<llvm::Regex::RegexFlags
>::get(Args
[1].Value
)));
865 ReturnType (*const WithFlags
)(StringRef
, llvm::Regex::RegexFlags
);
866 ReturnType (*const NoFlags
)(StringRef
);
867 const std::vector
<ASTNodeKind
> RetKinds
;
870 /// Variadic operator marshaller function.
871 class VariadicOperatorMatcherDescriptor
: public MatcherDescriptor
{
873 using VarOp
= DynTypedMatcher::VariadicOperator
;
875 VariadicOperatorMatcherDescriptor(unsigned MinCount
, unsigned MaxCount
,
876 VarOp Op
, StringRef MatcherName
)
877 : MinCount(MinCount
), MaxCount(MaxCount
), Op(Op
),
878 MatcherName(MatcherName
) {}
880 VariantMatcher
create(SourceRange NameRange
,
881 ArrayRef
<ParserValue
> Args
,
882 Diagnostics
*Error
) const override
{
883 if (Args
.size() < MinCount
|| MaxCount
< Args
.size()) {
884 const std::string MaxStr
=
885 (MaxCount
== std::numeric_limits
<unsigned>::max() ? ""
888 Error
->addError(NameRange
, Error
->ET_RegistryWrongArgCount
)
889 << ("(" + Twine(MinCount
) + ", " + MaxStr
+ ")") << Args
.size();
890 return VariantMatcher();
893 std::vector
<VariantMatcher
> InnerArgs
;
894 for (size_t i
= 0, e
= Args
.size(); i
!= e
; ++i
) {
895 const ParserValue
&Arg
= Args
[i
];
896 const VariantValue
&Value
= Arg
.Value
;
897 if (!Value
.isMatcher()) {
898 Error
->addError(Arg
.Range
, Error
->ET_RegistryWrongArgType
)
899 << (i
+ 1) << "Matcher<>" << Value
.getTypeAsString();
900 return VariantMatcher();
902 InnerArgs
.push_back(Value
.getMatcher());
904 return VariantMatcher::VariadicOperatorMatcher(Op
, std::move(InnerArgs
));
907 bool isVariadic() const override
{ return true; }
908 unsigned getNumArgs() const override
{ return 0; }
910 void getArgKinds(ASTNodeKind ThisKind
, unsigned ArgNo
,
911 std::vector
<ArgKind
> &Kinds
) const override
{
912 Kinds
.push_back(ArgKind::MakeMatcherArg(ThisKind
));
915 bool isConvertibleTo(ASTNodeKind Kind
, unsigned *Specificity
,
916 ASTNodeKind
*LeastDerivedKind
) const override
{
919 if (LeastDerivedKind
)
920 *LeastDerivedKind
= Kind
;
924 bool isPolymorphic() const override
{ return true; }
927 const unsigned MinCount
;
928 const unsigned MaxCount
;
930 const StringRef MatcherName
;
933 class MapAnyOfMatcherDescriptor
: public MatcherDescriptor
{
934 ASTNodeKind CladeNodeKind
;
935 std::vector
<ASTNodeKind
> NodeKinds
;
938 MapAnyOfMatcherDescriptor(ASTNodeKind CladeNodeKind
,
939 std::vector
<ASTNodeKind
> NodeKinds
)
940 : CladeNodeKind(CladeNodeKind
), NodeKinds(NodeKinds
) {}
942 VariantMatcher
create(SourceRange NameRange
, ArrayRef
<ParserValue
> Args
,
943 Diagnostics
*Error
) const override
{
945 std::vector
<DynTypedMatcher
> NodeArgs
;
947 for (auto NK
: NodeKinds
) {
948 std::vector
<DynTypedMatcher
> InnerArgs
;
950 for (const auto &Arg
: Args
) {
951 if (!Arg
.Value
.isMatcher())
953 const VariantMatcher
&VM
= Arg
.Value
.getMatcher();
954 if (VM
.hasTypedMatcher(NK
)) {
955 auto DM
= VM
.getTypedMatcher(NK
);
956 InnerArgs
.push_back(DM
);
960 if (InnerArgs
.empty()) {
962 DynTypedMatcher::trueMatcher(NK
).dynCastTo(CladeNodeKind
));
965 DynTypedMatcher::constructVariadic(
966 ast_matchers::internal::DynTypedMatcher::VO_AllOf
, NK
,
968 .dynCastTo(CladeNodeKind
));
972 auto Result
= DynTypedMatcher::constructVariadic(
973 ast_matchers::internal::DynTypedMatcher::VO_AnyOf
, CladeNodeKind
,
975 Result
.setAllowBind(true);
976 return VariantMatcher::SingleMatcher(Result
);
979 bool isVariadic() const override
{ return true; }
980 unsigned getNumArgs() const override
{ return 0; }
982 void getArgKinds(ASTNodeKind ThisKind
, unsigned,
983 std::vector
<ArgKind
> &Kinds
) const override
{
984 Kinds
.push_back(ArgKind::MakeMatcherArg(ThisKind
));
987 bool isConvertibleTo(ASTNodeKind Kind
, unsigned *Specificity
,
988 ASTNodeKind
*LeastDerivedKind
) const override
{
991 if (LeastDerivedKind
)
992 *LeastDerivedKind
= CladeNodeKind
;
997 class MapAnyOfBuilderDescriptor
: public MatcherDescriptor
{
999 VariantMatcher
create(SourceRange
, ArrayRef
<ParserValue
>,
1000 Diagnostics
*) const override
{
1004 bool isBuilderMatcher() const override
{ return true; }
1006 std::unique_ptr
<MatcherDescriptor
>
1007 buildMatcherCtor(SourceRange
, ArrayRef
<ParserValue
> Args
,
1008 Diagnostics
*) const override
{
1010 std::vector
<ASTNodeKind
> NodeKinds
;
1011 for (const auto &Arg
: Args
) {
1012 if (!Arg
.Value
.isNodeKind())
1014 NodeKinds
.push_back(Arg
.Value
.getNodeKind());
1017 if (NodeKinds
.empty())
1020 ASTNodeKind CladeNodeKind
= NodeKinds
.front().getCladeKind();
1022 for (auto NK
: NodeKinds
)
1024 if (!NK
.getCladeKind().isSame(CladeNodeKind
))
1028 return std::make_unique
<MapAnyOfMatcherDescriptor
>(CladeNodeKind
,
1032 bool isVariadic() const override
{ return true; }
1034 unsigned getNumArgs() const override
{ return 0; }
1036 void getArgKinds(ASTNodeKind ThisKind
, unsigned,
1037 std::vector
<ArgKind
> &ArgKinds
) const override
{
1038 ArgKinds
.push_back(ArgKind::MakeNodeArg(ThisKind
));
1040 bool isConvertibleTo(ASTNodeKind Kind
, unsigned *Specificity
= nullptr,
1041 ASTNodeKind
*LeastDerivedKind
= nullptr) const override
{
1044 if (LeastDerivedKind
)
1045 *LeastDerivedKind
= Kind
;
1049 bool isPolymorphic() const override
{ return false; }
1052 /// Helper functions to select the appropriate marshaller functions.
1053 /// They detect the number of arguments, arguments types and return type.
1056 template <typename ReturnType
>
1057 std::unique_ptr
<MatcherDescriptor
>
1058 makeMatcherAutoMarshall(ReturnType (*Func
)(), StringRef MatcherName
) {
1059 std::vector
<ASTNodeKind
> RetTypes
;
1060 BuildReturnTypeVector
<ReturnType
>::build(RetTypes
);
1061 return std::make_unique
<FixedArgCountMatcherDescriptor
>(
1062 matcherMarshall0
<ReturnType
>, reinterpret_cast<void (*)()>(Func
),
1063 MatcherName
, RetTypes
, std::nullopt
);
1067 template <typename ReturnType
, typename ArgType1
>
1068 std::unique_ptr
<MatcherDescriptor
>
1069 makeMatcherAutoMarshall(ReturnType (*Func
)(ArgType1
), StringRef MatcherName
) {
1070 std::vector
<ASTNodeKind
> RetTypes
;
1071 BuildReturnTypeVector
<ReturnType
>::build(RetTypes
);
1072 ArgKind AK
= ArgTypeTraits
<ArgType1
>::getKind();
1073 return std::make_unique
<FixedArgCountMatcherDescriptor
>(
1074 matcherMarshall1
<ReturnType
, ArgType1
>,
1075 reinterpret_cast<void (*)()>(Func
), MatcherName
, RetTypes
, AK
);
1079 template <typename ReturnType
, typename ArgType1
, typename ArgType2
>
1080 std::unique_ptr
<MatcherDescriptor
>
1081 makeMatcherAutoMarshall(ReturnType (*Func
)(ArgType1
, ArgType2
),
1082 StringRef MatcherName
) {
1083 std::vector
<ASTNodeKind
> RetTypes
;
1084 BuildReturnTypeVector
<ReturnType
>::build(RetTypes
);
1085 ArgKind AKs
[] = { ArgTypeTraits
<ArgType1
>::getKind(),
1086 ArgTypeTraits
<ArgType2
>::getKind() };
1087 return std::make_unique
<FixedArgCountMatcherDescriptor
>(
1088 matcherMarshall2
<ReturnType
, ArgType1
, ArgType2
>,
1089 reinterpret_cast<void (*)()>(Func
), MatcherName
, RetTypes
, AKs
);
1092 template <typename ReturnType
>
1093 std::unique_ptr
<MatcherDescriptor
> makeMatcherRegexMarshall(
1094 ReturnType (*FuncFlags
)(llvm::StringRef
, llvm::Regex::RegexFlags
),
1095 ReturnType (*Func
)(llvm::StringRef
)) {
1096 std::vector
<ASTNodeKind
> RetTypes
;
1097 BuildReturnTypeVector
<ReturnType
>::build(RetTypes
);
1098 return std::make_unique
<RegexMatcherDescriptor
<ReturnType
>>(FuncFlags
, Func
,
1102 /// Variadic overload.
1103 template <typename ResultT
, typename ArgT
,
1104 ResultT (*Func
)(ArrayRef
<const ArgT
*>)>
1105 std::unique_ptr
<MatcherDescriptor
> makeMatcherAutoMarshall(
1106 ast_matchers::internal::VariadicFunction
<ResultT
, ArgT
, Func
> VarFunc
,
1107 StringRef MatcherName
) {
1108 return std::make_unique
<VariadicFuncMatcherDescriptor
>(VarFunc
, MatcherName
);
1111 /// Overload for VariadicDynCastAllOfMatchers.
1113 /// Not strictly necessary, but DynCastAllOfMatcherDescriptor gives us better
1114 /// completion results for that type of matcher.
1115 template <typename BaseT
, typename DerivedT
>
1116 std::unique_ptr
<MatcherDescriptor
> makeMatcherAutoMarshall(
1117 ast_matchers::internal::VariadicDynCastAllOfMatcher
<BaseT
, DerivedT
>
1119 StringRef MatcherName
) {
1120 return std::make_unique
<DynCastAllOfMatcherDescriptor
>(VarFunc
, MatcherName
);
1123 /// Argument adaptative overload.
1124 template <template <typename ToArg
, typename FromArg
> class ArgumentAdapterT
,
1125 typename FromTypes
, typename ToTypes
>
1126 std::unique_ptr
<MatcherDescriptor
> makeMatcherAutoMarshall(
1127 ast_matchers::internal::ArgumentAdaptingMatcherFunc
<ArgumentAdapterT
,
1128 FromTypes
, ToTypes
>,
1129 StringRef MatcherName
) {
1130 std::vector
<std::unique_ptr
<MatcherDescriptor
>> Overloads
;
1131 AdaptativeOverloadCollector
<ArgumentAdapterT
, FromTypes
, ToTypes
>(MatcherName
,
1133 return std::make_unique
<OverloadedMatcherDescriptor
>(Overloads
);
1136 template <template <typename ToArg
, typename FromArg
> class ArgumentAdapterT
,
1137 typename FromTypes
, typename ToTypes
>
1138 template <typename FromTypeList
>
1139 inline void AdaptativeOverloadCollector
<ArgumentAdapterT
, FromTypes
,
1140 ToTypes
>::collect(FromTypeList
) {
1141 Out
.push_back(makeMatcherAutoMarshall(
1142 &AdaptativeFunc::template create
<typename
FromTypeList::head
>, Name
));
1143 collect(typename
FromTypeList::tail());
1146 /// Variadic operator overload.
1147 template <unsigned MinCount
, unsigned MaxCount
>
1148 std::unique_ptr
<MatcherDescriptor
> makeMatcherAutoMarshall(
1149 ast_matchers::internal::VariadicOperatorMatcherFunc
<MinCount
, MaxCount
>
1151 StringRef MatcherName
) {
1152 return std::make_unique
<VariadicOperatorMatcherDescriptor
>(
1153 MinCount
, MaxCount
, Func
.Op
, MatcherName
);
1156 template <typename CladeType
, typename
... MatcherT
>
1157 std::unique_ptr
<MatcherDescriptor
> makeMatcherAutoMarshall(
1158 ast_matchers::internal::MapAnyOfMatcherImpl
<CladeType
, MatcherT
...>,
1159 StringRef MatcherName
) {
1160 return std::make_unique
<MapAnyOfMatcherDescriptor
>(
1161 ASTNodeKind::getFromNodeKind
<CladeType
>(),
1162 std::vector
<ASTNodeKind
>{ASTNodeKind::getFromNodeKind
<MatcherT
>()...});
1165 } // namespace internal
1166 } // namespace dynamic
1167 } // namespace ast_matchers
1168 } // namespace clang
1170 #endif // LLVM_CLANG_LIB_ASTMATCHERS_DYNAMIC_MARSHALLERS_H