[clang] 79fedad - [ASTMatchers] Add static constructor for ArgKinds of Matchers
Stephen Kelly via cfe-commits
cfe-commits at lists.llvm.org
Sun Feb 7 06:00:42 PST 2021
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);
}
}
More information about the cfe-commits
mailing list