Allow binding to NamedValue resulting from let expression
Subscribers: cfe-commits Differential Revision: https://reviews.llvm.org/D51259 llvm-svn: 341142
This commit is contained in:
parent
5fb9dc51dc
commit
fc934cd916
|
@ -339,8 +339,27 @@ bool Parser::parseIdentifierPrefixImpl(VariantValue *Value) {
|
|||
if (const VariantValue NamedValue =
|
||||
NamedValues ? NamedValues->lookup(NameToken.Text)
|
||||
: VariantValue()) {
|
||||
*Value = NamedValue;
|
||||
return true;
|
||||
|
||||
if (Tokenizer->nextTokenKind() != TokenInfo::TK_Period) {
|
||||
*Value = NamedValue;
|
||||
return true;
|
||||
}
|
||||
|
||||
std::string BindID;
|
||||
if (!parseBindID(BindID))
|
||||
return false;
|
||||
|
||||
assert(NamedValue.isMatcher());
|
||||
llvm::Optional<DynTypedMatcher> Result =
|
||||
NamedValue.getMatcher().getSingleMatcher();
|
||||
if (Result.hasValue()) {
|
||||
llvm::Optional<DynTypedMatcher> Bound = Result->tryBind(BindID);
|
||||
if (Bound.hasValue()) {
|
||||
*Value = VariantMatcher::SingleMatcher(*Bound);
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
// If the syntax is correct and the name is not a matcher either, report
|
||||
// unknown named value.
|
||||
|
|
|
@ -359,6 +359,44 @@ TEST(ParserTest, CompletionNamedValues) {
|
|||
Comps[2].MatcherDecl);
|
||||
}
|
||||
|
||||
TEST(ParserTest, ParseBindOnLet) {
|
||||
|
||||
auto NamedValues = getTestNamedValues();
|
||||
|
||||
Diagnostics Error;
|
||||
|
||||
{
|
||||
llvm::Optional<DynTypedMatcher> TopLevelLetBinding(
|
||||
Parser::parseMatcherExpression("hasParamA.bind(\"parmABinding\")",
|
||||
nullptr, &NamedValues, &Error));
|
||||
EXPECT_EQ("", Error.toStringFull());
|
||||
auto M = TopLevelLetBinding->unconditionalConvertTo<Decl>();
|
||||
|
||||
EXPECT_TRUE(matchAndVerifyResultTrue(
|
||||
"void foo(int a);", M,
|
||||
llvm::make_unique<VerifyIdIsBoundTo<FunctionDecl>>("parmABinding")));
|
||||
EXPECT_TRUE(matchAndVerifyResultFalse(
|
||||
"void foo(int b);", M,
|
||||
llvm::make_unique<VerifyIdIsBoundTo<FunctionDecl>>("parmABinding")));
|
||||
}
|
||||
|
||||
{
|
||||
llvm::Optional<DynTypedMatcher> NestedLetBinding(
|
||||
Parser::parseMatcherExpression(
|
||||
"functionDecl(hasParamA.bind(\"parmABinding\"))", nullptr,
|
||||
&NamedValues, &Error));
|
||||
EXPECT_EQ("", Error.toStringFull());
|
||||
auto M = NestedLetBinding->unconditionalConvertTo<Decl>();
|
||||
|
||||
EXPECT_TRUE(matchAndVerifyResultTrue(
|
||||
"void foo(int a);", M,
|
||||
llvm::make_unique<VerifyIdIsBoundTo<FunctionDecl>>("parmABinding")));
|
||||
EXPECT_TRUE(matchAndVerifyResultFalse(
|
||||
"void foo(int b);", M,
|
||||
llvm::make_unique<VerifyIdIsBoundTo<FunctionDecl>>("parmABinding")));
|
||||
}
|
||||
}
|
||||
|
||||
} // end anonymous namespace
|
||||
} // end namespace dynamic
|
||||
} // end namespace ast_matchers
|
||||
|
|
Loading…
Reference in New Issue