diff options
Diffstat (limited to 'lib/ASTMatchers/Dynamic/Marshallers.h')
-rw-r--r-- | lib/ASTMatchers/Dynamic/Marshallers.h | 120 |
1 files changed, 80 insertions, 40 deletions
diff --git a/lib/ASTMatchers/Dynamic/Marshallers.h b/lib/ASTMatchers/Dynamic/Marshallers.h index c557ff162691..af90e2c7eca1 100644 --- a/lib/ASTMatchers/Dynamic/Marshallers.h +++ b/lib/ASTMatchers/Dynamic/Marshallers.h @@ -1,4 +1,4 @@ -//===--- Marshallers.h - Generic matcher function marshallers ---*- C++ -*-===// +//===- Marshallers.h - Generic matcher function marshallers -----*- C++ -*-===// // // The LLVM Compiler Infrastructure // @@ -6,7 +6,7 @@ // License. See LICENSE.TXT for details. // //===----------------------------------------------------------------------===// -/// +// /// \file /// \brief Functions templates and classes to wrap matcher construct functions. /// @@ -14,18 +14,33 @@ /// marshalling layer on top of matcher construct functions. /// These are used by the registry to export all marshaller constructors with /// the same generic interface. -/// +// //===----------------------------------------------------------------------===// #ifndef LLVM_CLANG_LIB_ASTMATCHERS_DYNAMIC_MARSHALLERS_H #define LLVM_CLANG_LIB_ASTMATCHERS_DYNAMIC_MARSHALLERS_H -#include "clang/ASTMatchers/ASTMatchers.h" +#include "clang/AST/ASTTypeTraits.h" +#include "clang/AST/OperationKinds.h" +#include "clang/ASTMatchers/ASTMatchersInternal.h" #include "clang/ASTMatchers/Dynamic/Diagnostics.h" #include "clang/ASTMatchers/Dynamic/VariantValue.h" +#include "clang/Basic/AttrKinds.h" #include "clang/Basic/LLVM.h" +#include "llvm/ADT/ArrayRef.h" +#include "llvm/ADT/None.h" #include "llvm/ADT/STLExtras.h" +#include "llvm/ADT/StringRef.h" +#include "llvm/ADT/StringSwitch.h" +#include "llvm/ADT/Twine.h" +#include <cassert> +#include <cstddef> +#include <iterator> +#include <limits> +#include <memory> #include <string> +#include <utility> +#include <vector> namespace clang { namespace ast_matchers { @@ -41,9 +56,11 @@ template <class T> struct ArgTypeTraits<const T &> : public ArgTypeTraits<T> { template <> struct ArgTypeTraits<std::string> { static bool is(const VariantValue &Value) { return Value.isString(); } + static const std::string &get(const VariantValue &Value) { return Value.getString(); } + static ArgKind getKind() { return ArgKind(ArgKind::AK_String); } @@ -53,13 +70,15 @@ template <> struct ArgTypeTraits<StringRef> : public ArgTypeTraits<std::string> { }; -template <class T> struct ArgTypeTraits<ast_matchers::internal::Matcher<T> > { +template <class T> struct ArgTypeTraits<ast_matchers::internal::Matcher<T>> { static bool is(const VariantValue &Value) { return Value.isMatcher() && Value.getMatcher().hasTypedMatcher<T>(); } + static ast_matchers::internal::Matcher<T> get(const VariantValue &Value) { return Value.getMatcher().getTypedMatcher<T>(); } + static ArgKind getKind() { return ArgKind(ast_type_traits::ASTNodeKind::getFromNodeKind<T>()); } @@ -67,9 +86,11 @@ template <class T> struct ArgTypeTraits<ast_matchers::internal::Matcher<T> > { template <> struct ArgTypeTraits<bool> { static bool is(const VariantValue &Value) { return Value.isBoolean(); } + static bool get(const VariantValue &Value) { return Value.getBoolean(); } + static ArgKind getKind() { return ArgKind(ArgKind::AK_Boolean); } @@ -77,9 +98,11 @@ template <> struct ArgTypeTraits<bool> { template <> struct ArgTypeTraits<double> { static bool is(const VariantValue &Value) { return Value.isDouble(); } + static double get(const VariantValue &Value) { return Value.getDouble(); } + static ArgKind getKind() { return ArgKind(ArgKind::AK_Double); } @@ -87,9 +110,11 @@ template <> struct ArgTypeTraits<double> { template <> struct ArgTypeTraits<unsigned> { static bool is(const VariantValue &Value) { return Value.isUnsigned(); } + static unsigned get(const VariantValue &Value) { return Value.getUnsigned(); } + static ArgKind getKind() { return ArgKind(ArgKind::AK_Unsigned); } @@ -97,42 +122,45 @@ template <> struct ArgTypeTraits<unsigned> { template <> struct ArgTypeTraits<attr::Kind> { private: - static attr::Kind getAttrKind(llvm::StringRef AttrKind) { - return llvm::StringSwitch<attr::Kind>(AttrKind) + static Optional<attr::Kind> getAttrKind(llvm::StringRef AttrKind) { + return llvm::StringSwitch<Optional<attr::Kind>>(AttrKind) #define ATTR(X) .Case("attr::" #X, attr:: X) #include "clang/Basic/AttrList.inc" - .Default(attr::Kind(-1)); + .Default(llvm::None); } + public: static bool is(const VariantValue &Value) { - return Value.isString() && - getAttrKind(Value.getString()) != attr::Kind(-1); + return Value.isString() && getAttrKind(Value.getString()); } + static attr::Kind get(const VariantValue &Value) { - return getAttrKind(Value.getString()); + return *getAttrKind(Value.getString()); } + static ArgKind getKind() { return ArgKind(ArgKind::AK_String); } }; -template <> struct ArgTypeTraits<clang::CastKind> { +template <> struct ArgTypeTraits<CastKind> { private: - static clang::CastKind getCastKind(llvm::StringRef AttrKind) { - return llvm::StringSwitch<clang::CastKind>(AttrKind) + static Optional<CastKind> getCastKind(llvm::StringRef AttrKind) { + return llvm::StringSwitch<Optional<CastKind>>(AttrKind) #define CAST_OPERATION(Name) .Case( #Name, CK_##Name) #include "clang/AST/OperationKinds.def" - .Default(CK_Invalid); + .Default(llvm::None); } public: static bool is(const VariantValue &Value) { - return Value.isString() && - getCastKind(Value.getString()) != CK_Invalid; + return Value.isString() && getCastKind(Value.getString()); } - static clang::CastKind get(const VariantValue &Value) { - return getCastKind(Value.getString()); + + static CastKind get(const VariantValue &Value) { + return *getCastKind(Value.getString()); } + static ArgKind getKind() { return ArgKind(ArgKind::AK_String); } @@ -144,7 +172,8 @@ public: /// arguments, and various other methods for type introspection. class MatcherDescriptor { public: - virtual ~MatcherDescriptor() {} + virtual ~MatcherDescriptor() = default; + virtual VariantMatcher create(SourceRange NameRange, ArrayRef<ParserValue> Args, Diagnostics *Error) const = 0; @@ -201,11 +230,11 @@ inline bool isRetKindConvertibleTo( /// their types, unpacking them and calling the underlying function. class FixedArgCountMatcherDescriptor : public MatcherDescriptor { public: - typedef VariantMatcher (*MarshallerType)(void (*Func)(), - StringRef MatcherName, - SourceRange NameRange, - ArrayRef<ParserValue> Args, - Diagnostics *Error); + using MarshallerType = VariantMatcher (*)(void (*Func)(), + StringRef MatcherName, + SourceRange NameRange, + ArrayRef<ParserValue> Args, + Diagnostics *Error); /// \param Marshaller Function to unpack the arguments and call \c Func /// \param Func Matcher construct function. This is the function that @@ -229,10 +258,12 @@ public: bool isVariadic() const override { return false; } unsigned getNumArgs() const override { return ArgKinds.size(); } + void getArgKinds(ast_type_traits::ASTNodeKind ThisKind, unsigned ArgNo, std::vector<ArgKind> &Kinds) const override { Kinds.push_back(ArgKinds[ArgNo]); } + bool isConvertibleTo( ast_type_traits::ASTNodeKind Kind, unsigned *Specificity, ast_type_traits::ASTNodeKind *LeastDerivedKind) const override { @@ -303,14 +334,14 @@ struct BuildReturnTypeVector { }; template <typename T> -struct BuildReturnTypeVector<ast_matchers::internal::Matcher<T> > { +struct BuildReturnTypeVector<ast_matchers::internal::Matcher<T>> { static void build(std::vector<ast_type_traits::ASTNodeKind> &RetTypes) { RetTypes.push_back(ast_type_traits::ASTNodeKind::getFromNodeKind<T>()); } }; template <typename T> -struct BuildReturnTypeVector<ast_matchers::internal::BindableMatcher<T> > { +struct BuildReturnTypeVector<ast_matchers::internal::BindableMatcher<T>> { static void build(std::vector<ast_type_traits::ASTNodeKind> &RetTypes) { RetTypes.push_back(ast_type_traits::ASTNodeKind::getFromNodeKind<T>()); } @@ -326,7 +357,8 @@ variadicMatcherDescriptor(StringRef MatcherName, SourceRange NameRange, bool HasError = false; for (size_t i = 0, e = Args.size(); i != e; ++i) { - typedef ArgTypeTraits<ArgT> ArgTraits; + using ArgTraits = ArgTypeTraits<ArgT>; + const ParserValue &Arg = Args[i]; const VariantValue &Value = Arg.Value; if (!ArgTraits::is(Value)) { @@ -360,10 +392,10 @@ variadicMatcherDescriptor(StringRef MatcherName, SourceRange NameRange, /// object file. class VariadicFuncMatcherDescriptor : public MatcherDescriptor { public: - typedef VariantMatcher (*RunFunc)(StringRef MatcherName, - SourceRange NameRange, - ArrayRef<ParserValue> Args, - Diagnostics *Error); + using RunFunc = VariantMatcher (*)(StringRef MatcherName, + SourceRange NameRange, + ArrayRef<ParserValue> Args, + Diagnostics *Error); template <typename ResultT, typename ArgT, ResultT (*F)(ArrayRef<const ArgT *>)> @@ -384,10 +416,12 @@ public: bool isVariadic() const override { return true; } unsigned getNumArgs() const override { return 0; } + void getArgKinds(ast_type_traits::ASTNodeKind ThisKind, unsigned ArgNo, std::vector<ArgKind> &Kinds) const override { Kinds.push_back(ArgsKind); } + bool isConvertibleTo( ast_type_traits::ASTNodeKind Kind, unsigned *Specificity, ast_type_traits::ASTNodeKind *LeastDerivedKind) const override { @@ -458,7 +492,7 @@ static VariantMatcher matcherMarshall0(void (*Func)(), StringRef MatcherName, SourceRange NameRange, ArrayRef<ParserValue> Args, Diagnostics *Error) { - typedef ReturnType (*FuncType)(); + using FuncType = ReturnType (*)(); CHECK_ARG_COUNT(0); return outvalueToVariantMatcher(reinterpret_cast<FuncType>(Func)()); } @@ -469,7 +503,7 @@ static VariantMatcher matcherMarshall1(void (*Func)(), StringRef MatcherName, SourceRange NameRange, ArrayRef<ParserValue> Args, Diagnostics *Error) { - typedef ReturnType (*FuncType)(ArgType1); + using FuncType = ReturnType (*)(ArgType1); CHECK_ARG_COUNT(1); CHECK_ARG_TYPE(0, ArgType1); return outvalueToVariantMatcher(reinterpret_cast<FuncType>(Func)( @@ -482,7 +516,7 @@ static VariantMatcher matcherMarshall2(void (*Func)(), StringRef MatcherName, SourceRange NameRange, ArrayRef<ParserValue> Args, Diagnostics *Error) { - typedef ReturnType (*FuncType)(ArgType1, ArgType2); + using FuncType = ReturnType (*)(ArgType1, ArgType2); CHECK_ARG_COUNT(2); CHECK_ARG_TYPE(0, ArgType1); CHECK_ARG_TYPE(1, ArgType2); @@ -507,8 +541,8 @@ public: } private: - typedef ast_matchers::internal::ArgumentAdaptingMatcherFunc< - ArgumentAdapterT, FromTypes, ToTypes> AdaptativeFunc; + using AdaptativeFunc = ast_matchers::internal::ArgumentAdaptingMatcherFunc< + ArgumentAdapterT, FromTypes, ToTypes>; /// \brief End case for the recursion static void collect(ast_matchers::internal::EmptyTypeList) {} @@ -534,7 +568,7 @@ public: : Overloads(std::make_move_iterator(Callbacks.begin()), std::make_move_iterator(Callbacks.end())) {} - ~OverloadedMatcherDescriptor() override {} + ~OverloadedMatcherDescriptor() override = default; VariantMatcher create(SourceRange NameRange, ArrayRef<ParserValue> Args, @@ -604,7 +638,8 @@ private: /// \brief Variadic operator marshaller function. class VariadicOperatorMatcherDescriptor : public MatcherDescriptor { public: - typedef DynTypedMatcher::VariadicOperator VarOp; + using VarOp = DynTypedMatcher::VariadicOperator; + VariadicOperatorMatcherDescriptor(unsigned MinCount, unsigned MaxCount, VarOp Op, StringRef MatcherName) : MinCount(MinCount), MaxCount(MaxCount), Op(Op), @@ -615,7 +650,9 @@ public: Diagnostics *Error) const override { if (Args.size() < MinCount || MaxCount < Args.size()) { const std::string MaxStr = - (MaxCount == UINT_MAX ? "" : Twine(MaxCount)).str(); + (MaxCount == std::numeric_limits<unsigned>::max() ? "" + : Twine(MaxCount)) + .str(); Error->addError(NameRange, Error->ET_RegistryWrongArgCount) << ("(" + Twine(MinCount) + ", " + MaxStr + ")") << Args.size(); return VariantMatcher(); @@ -637,10 +674,12 @@ public: bool isVariadic() const override { return true; } unsigned getNumArgs() const override { return 0; } + void getArgKinds(ast_type_traits::ASTNodeKind ThisKind, unsigned ArgNo, std::vector<ArgKind> &Kinds) const override { Kinds.push_back(ThisKind); } + bool isConvertibleTo(ast_type_traits::ASTNodeKind Kind, unsigned *Specificity, ast_type_traits::ASTNodeKind *LeastDerivedKind) const override { if (Specificity) @@ -649,6 +688,7 @@ public: *LeastDerivedKind = Kind; return true; } + bool isPolymorphic() const override { return true; } private: |