[ASTMatchers] Use provided target NodeKind instead of inferring it from the matchers.
Individual matchers might not be convertible to each other's kind, but they might still all be convertible to the target kind. All the callers already know the target kind, so just pass it down. llvm-svn: 242534
This commit is contained in:
parent
2bec8500ef
commit
b063f5c7e1
|
@ -281,6 +281,7 @@ public:
|
|||
};
|
||||
static DynTypedMatcher
|
||||
constructVariadic(VariadicOperator Op,
|
||||
ast_type_traits::ASTNodeKind SupportedKind,
|
||||
std::vector<DynTypedMatcher> InnerMatchers);
|
||||
|
||||
/// \brief Get a "true" matcher for \p NodeKind.
|
||||
|
@ -1137,7 +1138,8 @@ public:
|
|||
|
||||
template <typename T> operator Matcher<T>() const {
|
||||
return DynTypedMatcher::constructVariadic(
|
||||
Op, getMatchers<T>(llvm::index_sequence_for<Ps...>()))
|
||||
Op, ast_type_traits::ASTNodeKind::getFromNodeKind<T>(),
|
||||
getMatchers<T>(llvm::index_sequence_for<Ps...>()))
|
||||
.template unconditionalConvertTo<T>();
|
||||
}
|
||||
|
||||
|
@ -1191,8 +1193,10 @@ BindableMatcher<T> makeAllOfComposite(
|
|||
std::vector<DynTypedMatcher> DynMatchers(PI(InnerMatchers.begin()),
|
||||
PI(InnerMatchers.end()));
|
||||
return BindableMatcher<T>(
|
||||
DynTypedMatcher::constructVariadic(DynTypedMatcher::VO_AllOf,
|
||||
std::move(DynMatchers))
|
||||
DynTypedMatcher::constructVariadic(
|
||||
DynTypedMatcher::VO_AllOf,
|
||||
ast_type_traits::ASTNodeKind::getFromNodeKind<T>(),
|
||||
std::move(DynMatchers))
|
||||
.template unconditionalConvertTo<T>());
|
||||
}
|
||||
|
||||
|
|
|
@ -110,15 +110,15 @@ static llvm::ManagedStatic<TrueMatcherImpl> TrueMatcherInstance;
|
|||
|
||||
DynTypedMatcher DynTypedMatcher::constructVariadic(
|
||||
DynTypedMatcher::VariadicOperator Op,
|
||||
ast_type_traits::ASTNodeKind SupportedKind,
|
||||
std::vector<DynTypedMatcher> InnerMatchers) {
|
||||
assert(InnerMatchers.size() > 0 && "Array must not be empty.");
|
||||
assert(std::all_of(InnerMatchers.begin(), InnerMatchers.end(),
|
||||
[&InnerMatchers](const DynTypedMatcher &M) {
|
||||
return InnerMatchers[0].canConvertTo(M.SupportedKind);
|
||||
}) &&
|
||||
"SupportedKind must be convertible to a common type!");
|
||||
[SupportedKind](const DynTypedMatcher &M) {
|
||||
return M.canConvertTo(SupportedKind);
|
||||
}) &&
|
||||
"InnerMatchers must be convertible to SupportedKind!");
|
||||
|
||||
auto SupportedKind = InnerMatchers[0].SupportedKind;
|
||||
// We must relax the restrict kind here.
|
||||
// The different operators might deal differently with a mismatch.
|
||||
// Make it the same as SupportedKind, since that is the broadest type we are
|
||||
|
|
|
@ -72,7 +72,7 @@ VariantMatcher::MatcherOps::constructVariadicOperator(
|
|||
return llvm::None;
|
||||
DynMatchers.push_back(*Inner);
|
||||
}
|
||||
return DynTypedMatcher::constructVariadic(Op, DynMatchers);
|
||||
return DynTypedMatcher::constructVariadic(Op, NodeKind, DynMatchers);
|
||||
}
|
||||
|
||||
VariantMatcher::Payload::~Payload() {}
|
||||
|
|
|
@ -453,6 +453,16 @@ TEST(AllOf, AllOverloadsWork) {
|
|||
hasArgument(3, integerLiteral(equals(4)))))));
|
||||
}
|
||||
|
||||
TEST(ConstructVariadic, MismatchedTypes_Regression) {
|
||||
EXPECT_TRUE(
|
||||
matches("const int a = 0;",
|
||||
internal::DynTypedMatcher::constructVariadic(
|
||||
internal::DynTypedMatcher::VO_AnyOf,
|
||||
ast_type_traits::ASTNodeKind::getFromNodeKind<QualType>(),
|
||||
{isConstQualified(), arrayType()})
|
||||
.convertTo<QualType>()));
|
||||
}
|
||||
|
||||
TEST(DeclarationMatcher, MatchAnyOf) {
|
||||
DeclarationMatcher YOrZDerivedFromX =
|
||||
recordDecl(anyOf(hasName("Y"), allOf(isDerivedFrom("X"), hasName("Z"))));
|
||||
|
|
Loading…
Reference in New Issue