Skip to content

Commit b9c2370

Browse files
committed
Implement support for 'if let foo {' syntax
1 parent d1bb98b commit b9c2370

File tree

1 file changed

+12
-1
lines changed

1 file changed

+12
-1
lines changed

lib/Parse/ParseStmt.cpp

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1618,12 +1618,23 @@ Parser::parseStmtConditionElement(SmallVectorImpl<StmtConditionElement> &result,
16181618
ThePattern = makeParserResult(AP);
16191619
}
16201620

1621-
// Conditional bindings must have an initializer.
1621+
// Conditional bindings can have the format:
1622+
// `let newBinding = <expr>`, or
1623+
// `let newBinding`, which is shorthand for `let newBinding = newBinding`
16221624
ParserResult<Expr> Init;
16231625
if (Tok.is(tok::equal)) {
16241626
SyntaxParsingContext InitCtxt(SyntaxContext, SyntaxKind::InitializerClause);
16251627
consumeToken();
16261628
Init = parseExprBasic(diag::expected_expr_conditional_var);
1629+
} else if (!ThePattern.isNull() && !ThePattern.getPtrOrNull()->getBoundName().empty()) {
1630+
auto bindingName = new DeclNameRef(ThePattern.getPtrOrNull()->getBoundName());
1631+
auto loc = new DeclNameLoc(ThePattern.getPtrOrNull()->getEndLoc());
1632+
auto declRefExpr = new (Context) UnresolvedDeclRefExpr(*bindingName,
1633+
DeclRefKind::Ordinary,
1634+
*loc);
1635+
1636+
declRefExpr->setImplicit();
1637+
Init = makeParserResult(declRefExpr);
16271638
} else {
16281639
diagnose(Tok, diag::conditional_var_initializer_required);
16291640
}

0 commit comments

Comments
 (0)