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:
Stephen Kelly 2018-08-30 23:11:09 +00:00
parent 5fb9dc51dc
commit fc934cd916
2 changed files with 59 additions and 2 deletions

View File

@ -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.

View File

@ -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