Author: Stephen Kelly Date: 2021-02-07T13:43:04Z New Revision: 79fedadd6af84701e8c873c8d7b507e323d15a5e
URL: https://github.com/llvm/llvm-project/commit/79fedadd6af84701e8c873c8d7b507e323d15a5e DIFF: https://github.com/llvm/llvm-project/commit/79fedadd6af84701e8c873c8d7b507e323d15a5e.diff LOG: [ASTMatchers] Add static constructor for ArgKinds of Matchers It will soon be possible to store a node kind in an ArgKind, which will also be contructed with an ASTNodeKind. The desired Kind must be expicit. Added: Modified: clang/include/clang/ASTMatchers/Dynamic/VariantValue.h clang/lib/ASTMatchers/Dynamic/Marshallers.h clang/lib/ASTMatchers/Dynamic/Registry.cpp clang/lib/ASTMatchers/Dynamic/VariantValue.cpp Removed: ################################################################################ diff --git a/clang/include/clang/ASTMatchers/Dynamic/VariantValue.h b/clang/include/clang/ASTMatchers/Dynamic/VariantValue.h index fa033f49bc90..abfb29707924 100644 --- a/clang/include/clang/ASTMatchers/Dynamic/VariantValue.h +++ b/clang/include/clang/ASTMatchers/Dynamic/VariantValue.h @@ -44,12 +44,14 @@ class ArgKind { ArgKind(Kind K) : K(K) { assert(K != AK_Matcher); } /// Constructor for matcher types. - ArgKind(ASTNodeKind MatcherKind) : K(AK_Matcher), MatcherKind(MatcherKind) {} + static ArgKind MakeMatcherArg(ASTNodeKind MatcherKind) { + return ArgKind{AK_Matcher, MatcherKind}; + } Kind getArgKind() const { return K; } ASTNodeKind getMatcherKind() const { assert(K == AK_Matcher); - return MatcherKind; + return NodeKind; } /// Determines if this type can be converted to \p To. @@ -62,7 +64,7 @@ class ArgKind { bool operator<(const ArgKind &Other) const { if (K == AK_Matcher && Other.K == AK_Matcher) - return MatcherKind < Other.MatcherKind; + return NodeKind < Other.NodeKind; return K < Other.K; } @@ -70,8 +72,9 @@ class ArgKind { std::string asString() const; private: + ArgKind(Kind K, ASTNodeKind NK) : K(K), NodeKind(NK) {} Kind K; - ASTNodeKind MatcherKind; + ASTNodeKind NodeKind; }; using ast_matchers::internal::DynTypedMatcher; diff --git a/clang/lib/ASTMatchers/Dynamic/Marshallers.h b/clang/lib/ASTMatchers/Dynamic/Marshallers.h index 690b52162e2b..411062392dad 100644 --- a/clang/lib/ASTMatchers/Dynamic/Marshallers.h +++ b/clang/lib/ASTMatchers/Dynamic/Marshallers.h @@ -93,7 +93,7 @@ template <class T> struct ArgTypeTraits<ast_matchers::internal::Matcher<T>> { } static ArgKind getKind() { - return ArgKind(ASTNodeKind::getFromNodeKind<T>()); + return ArgKind::MakeMatcherArg(ASTNodeKind::getFromNodeKind<T>()); } static llvm::Optional<std::string> getBestGuess(const VariantValue &) { @@ -343,7 +343,8 @@ inline bool isRetKindConvertibleTo(ArrayRef<ASTNodeKind> RetKinds, ASTNodeKind Kind, unsigned *Specificity, ASTNodeKind *LeastDerivedKind) { for (const ASTNodeKind &NodeKind : RetKinds) { - if (ArgKind(NodeKind).isConvertibleTo(Kind, Specificity)) { + if (ArgKind::MakeMatcherArg(NodeKind).isConvertibleTo( + ArgKind::MakeMatcherArg(Kind), Specificity)) { if (LeastDerivedKind) *LeastDerivedKind = NodeKind; return true; @@ -904,7 +905,7 @@ class VariadicOperatorMatcherDescriptor : public MatcherDescriptor { void getArgKinds(ASTNodeKind ThisKind, unsigned ArgNo, std::vector<ArgKind> &Kinds) const override { - Kinds.push_back(ThisKind); + Kinds.push_back(ArgKind::MakeMatcherArg(ThisKind)); } bool isConvertibleTo(ASTNodeKind Kind, unsigned *Specificity, @@ -976,7 +977,7 @@ class MapAnyOfMatcherDescriptor : public MatcherDescriptor { void getArgKinds(ASTNodeKind ThisKind, unsigned, std::vector<ArgKind> &Kinds) const override { - Kinds.push_back(ThisKind); + Kinds.push_back(ArgKind::MakeMatcherArg(ThisKind)); } bool isConvertibleTo(ASTNodeKind Kind, unsigned *Specificity, diff --git a/clang/lib/ASTMatchers/Dynamic/Registry.cpp b/clang/lib/ASTMatchers/Dynamic/Registry.cpp index 775f51b419a1..0887eb7e0881 100644 --- a/clang/lib/ASTMatchers/Dynamic/Registry.cpp +++ b/clang/lib/ASTMatchers/Dynamic/Registry.cpp @@ -599,7 +599,10 @@ std::vector<ArgKind> Registry::getAcceptedCompletionTypes( // Starting with the above seed of acceptable top-level matcher types, compute // the acceptable type set for the argument indicated by each context element. - std::set<ArgKind> TypeSet(std::begin(InitialTypes), std::end(InitialTypes)); + std::set<ArgKind> TypeSet; + for (auto IT : InitialTypes) { + TypeSet.insert(ArgKind::MakeMatcherArg(IT)); + } for (const auto &CtxEntry : Context) { MatcherCtor Ctor = CtxEntry.first; unsigned ArgNumber = CtxEntry.second; diff --git a/clang/lib/ASTMatchers/Dynamic/VariantValue.cpp b/clang/lib/ASTMatchers/Dynamic/VariantValue.cpp index d1ecb1e00b91..d367ad0e3233 100644 --- a/clang/lib/ASTMatchers/Dynamic/VariantValue.cpp +++ b/clang/lib/ASTMatchers/Dynamic/VariantValue.cpp @@ -22,7 +22,7 @@ namespace dynamic { std::string ArgKind::asString() const { switch (getArgKind()) { case AK_Matcher: - return (Twine("Matcher<") + MatcherKind.asStringRef() + ">").str(); + return (Twine("Matcher<") + NodeKind.asStringRef() + ">").str(); case AK_Boolean: return "boolean"; case AK_Double: @@ -44,7 +44,7 @@ bool ArgKind::isConvertibleTo(ArgKind To, unsigned *Specificity) const { return true; } unsigned Distance; - if (!MatcherKind.isBaseOf(To.MatcherKind, &Distance)) + if (!NodeKind.isBaseOf(To.NodeKind, &Distance)) return false; if (Specificity) @@ -107,8 +107,8 @@ class VariantMatcher::SinglePayload : public VariantMatcher::Payload { } bool isConvertibleTo(ASTNodeKind Kind, unsigned *Specificity) const override { - return ArgKind(Matcher.getSupportedKind()) - .isConvertibleTo(Kind, Specificity); + return ArgKind::MakeMatcherArg(Matcher.getSupportedKind()) + .isConvertibleTo(ArgKind::MakeMatcherArg(Kind), Specificity); } private: @@ -167,8 +167,9 @@ class VariantMatcher::PolymorphicPayload : public VariantMatcher::Payload { unsigned MaxSpecificity = 0; for (const DynTypedMatcher &Matcher : Matchers) { unsigned ThisSpecificity; - if (ArgKind(Matcher.getSupportedKind()) - .isConvertibleTo(Kind, &ThisSpecificity)) { + if (ArgKind::MakeMatcherArg(Matcher.getSupportedKind()) + .isConvertibleTo(ArgKind::MakeMatcherArg(Kind), + &ThisSpecificity)) { MaxSpecificity = std::max(MaxSpecificity, ThisSpecificity); } } _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits