Skip to content

Commit a2d932d

Browse files
authored
Merge pull request #24050 from nkcsgexi/synthesize-r-brace
2 parents 388c21a + 746a88a commit a2d932d

File tree

4 files changed

+18
-3
lines changed

4 files changed

+18
-3
lines changed

lib/Parse/ParseDecl.cpp

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3504,7 +3504,10 @@ bool Parser::parseDeclList(SourceLoc LBLoc, SourceLoc &RBLoc,
35043504
}
35053505
}
35063506
}
3507-
parseMatchingToken(tok::r_brace, RBLoc, ErrorDiag, LBLoc);
3507+
if (parseMatchingToken(tok::r_brace, RBLoc, ErrorDiag, LBLoc)) {
3508+
// Synthesize an r_brace syntax node if the token is absent
3509+
SyntaxContext->synthesize(tok::r_brace, RBLoc);
3510+
}
35083511

35093512
// Increase counter.
35103513
if (auto *stat = Context.Stats) {

test/Syntax/Outputs/round_trip_invalid.swift.withkinds

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,4 +13,10 @@ let <PatternBinding><IdentifierPattern>strings</IdentifierPattern><TypeAnnotatio
1313

1414
// Function body without closing brace token.
1515
func foo<FunctionSignature><ParameterClause>() </ParameterClause></FunctionSignature><CodeBlock>{<VariableDecl>
16-
var <PatternBinding><IdentifierPattern>a </IdentifierPattern><InitializerClause>= <IntegerLiteralExpr>2</IntegerLiteralExpr></InitializerClause></PatternBinding></VariableDecl></CodeBlock></FunctionDecl>
16+
var <PatternBinding><IdentifierPattern>a </IdentifierPattern><InitializerClause>= <IntegerLiteralExpr>2</IntegerLiteralExpr></InitializerClause></PatternBinding></VariableDecl><ClassDecl>
17+
18+
class C <MemberDeclBlock>{<MemberDeclListItem><StructDecl>
19+
struct S <MemberDeclBlock>{<MemberDeclListItem><EnumDecl>
20+
enum E <MemberDeclBlock>{<MemberDeclListItem><ProtocolDecl>
21+
protocol P <MemberDeclBlock>{<MemberDeclListItem><ExtensionDecl>
22+
extension <SimpleTypeIdentifier>P </SimpleTypeIdentifier><MemberDeclBlock>{</MemberDeclBlock></ExtensionDecl></MemberDeclListItem></MemberDeclBlock></ProtocolDecl></MemberDeclListItem></MemberDeclBlock></EnumDecl></MemberDeclListItem></MemberDeclBlock></StructDecl></MemberDeclListItem></MemberDeclBlock></ClassDecl></CodeBlock></FunctionDecl>

test/Syntax/round_trip_invalid.swift

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,3 +14,9 @@ let strings: [Strin[g]?
1414
// Function body without closing brace token.
1515
func foo() {
1616
var a = 2
17+
18+
class C {
19+
struct S {
20+
enum E {
21+
protocol P {
22+
extension P {

utils/gyb_syntax_support/DeclNodes.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -282,7 +282,7 @@
282282
element='MemberDeclListItem'),
283283

284284
# member-decl = decl ';'?
285-
Node('MemberDeclListItem', kind='Syntax',
285+
Node('MemberDeclListItem', kind='Syntax', omit_when_empty=True,
286286
description='''
287287
A member declaration of a type consisting of a declaration and an \
288288
optional semicolon;

0 commit comments

Comments
 (0)