Skip to content

Commit 796c51c

Browse files
authored
libSyntax: specialize closure expression. (#13421)
1 parent 015bef1 commit 796c51c

File tree

4 files changed

+23
-9
lines changed

4 files changed

+23
-9
lines changed

lib/Parse/ParseExpr.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2642,7 +2642,7 @@ parseClosureSignatureIfPresent(SmallVectorImpl<CaptureListEntry> &captureList,
26422642

26432643
ParserResult<Expr> Parser::parseExprClosure() {
26442644
assert(Tok.is(tok::l_brace) && "Not at a left brace?");
2645-
2645+
SyntaxParsingContext ClosureContext(SyntaxContext, SyntaxKind::ClosureExpr);
26462646
// We may be parsing this closure expr in a matching pattern context. If so,
26472647
// reset our state to not be in a pattern for any recursive pattern parses.
26482648
llvm::SaveAndRestore<decltype(InVarOrLetPattern)>

test/Syntax/Outputs/round_trip_parse_gen.swift.withkinds

Lines changed: 11 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -128,25 +128,28 @@ func tryfoo<FunctionSignature><ParameterClause>() </ParameterClause></FunctionSi
128128
try! <MemberAccessExpr><IdentifierExpr>foo</IdentifierExpr>().bar</MemberAccessExpr>().foo().bar()</TryExpr>
129129
}</CodeBlock></FunctionDecl><FunctionDecl>
130130

131-
func closure<FunctionSignature><ParameterClause>() </ParameterClause></FunctionSignature><CodeBlock>{
131+
func closure<FunctionSignature><ParameterClause>() </ParameterClause></FunctionSignature><CodeBlock>{<ClosureExpr>
132132
{<ClosureSignature><ClosureCaptureSignature>[<ClosureCaptureItem>weak <IdentifierExpr>a</IdentifierExpr>,</ClosureCaptureItem><ClosureCaptureItem>
133133
unowned(safe) self,</ClosureCaptureItem><ClosureCaptureItem>
134134
b = <IntegerLiteralExpr>3</IntegerLiteralExpr>,</ClosureCaptureItem><ClosureCaptureItem>
135135
unowned(unsafe) c = <MemberAccessExpr><IdentifierExpr>foo</IdentifierExpr>().bar</MemberAccessExpr></ClosureCaptureItem>] </ClosureCaptureSignature>in</ClosureSignature>
136-
}
137-
{<ClosureSignature><ClosureCaptureSignature>[] </ClosureCaptureSignature>in </ClosureSignature>}
136+
}</ClosureExpr><ClosureExpr>
137+
{<ClosureSignature><ClosureCaptureSignature>[] </ClosureCaptureSignature>in </ClosureSignature>}</ClosureExpr><ClosureExpr>
138138

139139
{ <ClosureSignature><ClosureCaptureSignature>[] </ClosureCaptureSignature><ClosureParam>a, </ClosureParam><ClosureParam>b, </ClosureParam><ClosureParam>_ </ClosureParam><ReturnClause>-> <SimpleTypeIdentifier>Int </SimpleTypeIdentifier></ReturnClause>in</ClosureSignature><ReturnStmt>
140140
return <IntegerLiteralExpr>2</IntegerLiteralExpr></ReturnStmt>
141-
}
141+
}</ClosureExpr><ClosureExpr>
142142
{ <ClosureSignature><ClosureCaptureSignature>[] </ClosureCaptureSignature><ParameterClause>(<FunctionParameter>a: <SimpleTypeIdentifier>Int</SimpleTypeIdentifier>, </FunctionParameter><FunctionParameter>b: <SimpleTypeIdentifier>Int</SimpleTypeIdentifier>, </FunctionParameter><FunctionParameter>_: <SimpleTypeIdentifier>Int</SimpleTypeIdentifier></FunctionParameter>) </ParameterClause><ReturnClause>-> <SimpleTypeIdentifier>Int </SimpleTypeIdentifier></ReturnClause>in</ClosureSignature><ReturnStmt>
143143
return <IntegerLiteralExpr>2</IntegerLiteralExpr></ReturnStmt>
144-
}
144+
}</ClosureExpr><ClosureExpr>
145145
{ <ClosureSignature><ClosureCaptureSignature>[] </ClosureCaptureSignature><ClosureParam>a, </ClosureParam><ClosureParam>b, </ClosureParam><ClosureParam>_ </ClosureParam>throws <ReturnClause>-> <SimpleTypeIdentifier>Int </SimpleTypeIdentifier></ReturnClause>in</ClosureSignature><ReturnStmt>
146146
return <IntegerLiteralExpr>2</IntegerLiteralExpr></ReturnStmt>
147-
}
147+
}</ClosureExpr><ClosureExpr>
148148
{ <ClosureSignature><ClosureCaptureSignature>[] </ClosureCaptureSignature><ParameterClause>(<FunctionParameter>a: <SimpleTypeIdentifier>Int</SimpleTypeIdentifier>, </FunctionParameter><FunctionParameter>_ b: <SimpleTypeIdentifier>Int</SimpleTypeIdentifier></FunctionParameter>) </ParameterClause>throws <ReturnClause>-> <SimpleTypeIdentifier>Int </SimpleTypeIdentifier></ReturnClause>in</ClosureSignature><ReturnStmt>
149149
return <IntegerLiteralExpr>2</IntegerLiteralExpr></ReturnStmt>
150-
}
151-
{ <ClosureSignature><ClosureParam>a, </ClosureParam><ClosureParam>b </ClosureParam>in </ClosureSignature>}
150+
}</ClosureExpr><ClosureExpr>
151+
{ <ClosureSignature><ClosureParam>a, </ClosureParam><ClosureParam>b </ClosureParam>in </ClosureSignature>}</ClosureExpr><ClosureExpr>
152+
{}</ClosureExpr><ClosureExpr>
153+
{ <ClosureSignature><ClosureParam>s1, </ClosureParam><ClosureParam>s2 </ClosureParam>in </ClosureSignature><SequenceExpr><IdentifierExpr>s1 </IdentifierExpr><BinaryOperatorExpr>> </BinaryOperatorExpr><IdentifierExpr>s2 </IdentifierExpr></SequenceExpr>}</ClosureExpr><ClosureExpr>
154+
{ <SequenceExpr>$0 <BinaryOperatorExpr>> </BinaryOperatorExpr>$1 </SequenceExpr>}</ClosureExpr>
152155
}</CodeBlock></FunctionDecl>

test/Syntax/round_trip_parse_gen.swift

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -149,4 +149,7 @@ func closure() {
149149
return 2
150150
}
151151
{ a, b in }
152+
{}
153+
{ s1, s2 in s1 > s2 }
154+
{ $0 > $1 }
152155
}

utils/gyb_syntax_support/ExprNodes.py

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -307,4 +307,12 @@
307307
Child('Output', kind='ReturnClause', is_optional=True),
308308
Child('InTok', kind='InToken'),
309309
]),
310+
311+
Node('ClosureExpr', kind='Expr',
312+
children=[
313+
Child('LeftBrace', kind='LeftBraceToken'),
314+
Child('Signature', kind='ClosureSignature', is_optional=True),
315+
Child('Statements', kind='StmtList'),
316+
Child('RightBrace', kind='RightBraceToken'),
317+
]),
310318
]

0 commit comments

Comments
 (0)