Skip to content

Commit cd293d6

Browse files
authored
Merge pull request #13097 from nkcsgexi/lib-syntax-tuple-expr
2 parents 371e1b8 + 0363215 commit cd293d6

File tree

5 files changed

+42
-4
lines changed

5 files changed

+42
-4
lines changed

lib/Parse/ParseExpr.cpp

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1682,11 +1682,17 @@ ParserResult<Expr> Parser::parseExprPostfix(Diag<> ID, bool isExprBasic) {
16821682
break;
16831683
}
16841684

1685-
case tok::l_paren:
1685+
case tok::l_paren: {
1686+
// Build a tuple expression syntax node.
1687+
// AST differentiates paren and tuple expression where the former allows
1688+
// only one element without label. However, libSyntax tree doesn't have this
1689+
// differentiation. A tuple expression node in libSyntax can have a single
1690+
// element without label.
1691+
SyntaxParsingContext TupleContext(SyntaxContext, SyntaxKind::TupleExpr);
16861692
Result = parseExprList(tok::l_paren, tok::r_paren,
1687-
SyntaxKind::FunctionCallArgumentList);
1693+
SyntaxKind::TupleElementList);
16881694
break;
1689-
1695+
}
16901696
case tok::l_square:
16911697
Result = parseExprCollection();
16921698
break;

lib/Parse/Parser.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -841,6 +841,8 @@ static SyntaxKind getListElementKind(SyntaxKind ListKind) {
841841
return SyntaxKind::ArrayElement;
842842
case SyntaxKind::DictionaryElementList:
843843
return SyntaxKind::DictionaryElement;
844+
case SyntaxKind::TupleElementList:
845+
return SyntaxKind::TupleElement;
844846
default:
845847
return SyntaxKind::Unknown;
846848
}

test/Syntax/Outputs/round_trip_parse_gen.swift.withkinds

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,10 @@ class C {
3838

3939
func foo2() <CodeBlock>{<SequenceExpr><DiscardAssignmentExpr>
4040
_ </DiscardAssignmentExpr><AssignmentExpr>= </AssignmentExpr><TernaryExpr><BooleanLiteralExpr>true </BooleanLiteralExpr>? <IntegerLiteralExpr>1 </IntegerLiteralExpr>: <IntegerLiteralExpr>0</IntegerLiteralExpr></TernaryExpr></SequenceExpr><SequenceExpr><DiscardAssignmentExpr>
41-
_ </DiscardAssignmentExpr><AssignmentExpr>= </AssignmentExpr><TernaryExpr>(<FunctionCallArgument><SequenceExpr><TernaryExpr><BooleanLiteralExpr>true </BooleanLiteralExpr>? <IntegerLiteralExpr>1 </IntegerLiteralExpr>: <IntegerLiteralExpr>0</IntegerLiteralExpr></TernaryExpr></SequenceExpr></FunctionCallArgument>) ? (<FunctionCallArgument><SequenceExpr><TernaryExpr><BooleanLiteralExpr>true </BooleanLiteralExpr>? <IntegerLiteralExpr>1 </IntegerLiteralExpr>: <IntegerLiteralExpr>0</IntegerLiteralExpr></TernaryExpr></SequenceExpr></FunctionCallArgument>) : (<FunctionCallArgument><SequenceExpr><TernaryExpr><BooleanLiteralExpr>true </BooleanLiteralExpr>? <IntegerLiteralExpr>1 </IntegerLiteralExpr>: <IntegerLiteralExpr>0</IntegerLiteralExpr></TernaryExpr></SequenceExpr></FunctionCallArgument>)</TernaryExpr></SequenceExpr>
41+
_ </DiscardAssignmentExpr><AssignmentExpr>= </AssignmentExpr><TernaryExpr><TupleExpr>(<TupleElement><SequenceExpr><TernaryExpr><BooleanLiteralExpr>true </BooleanLiteralExpr>? <IntegerLiteralExpr>1 </IntegerLiteralExpr>: <IntegerLiteralExpr>0</IntegerLiteralExpr></TernaryExpr></SequenceExpr></TupleElement>) </TupleExpr>? <TupleExpr>(<TupleElement><SequenceExpr><TernaryExpr><BooleanLiteralExpr>true </BooleanLiteralExpr>? <IntegerLiteralExpr>1 </IntegerLiteralExpr>: <IntegerLiteralExpr>0</IntegerLiteralExpr></TernaryExpr></SequenceExpr></TupleElement>) </TupleExpr>: <TupleExpr>(<TupleElement><SequenceExpr><TernaryExpr><BooleanLiteralExpr>true </BooleanLiteralExpr>? <IntegerLiteralExpr>1 </IntegerLiteralExpr>: <IntegerLiteralExpr>0</IntegerLiteralExpr></TernaryExpr></SequenceExpr></TupleElement>)</TupleExpr></TernaryExpr></SequenceExpr><SequenceExpr><DiscardAssignmentExpr>
42+
_ </DiscardAssignmentExpr><AssignmentExpr>= </AssignmentExpr><TupleExpr>(<TupleElement><IntegerLiteralExpr>1</IntegerLiteralExpr>, </TupleElement><TupleElement><IntegerLiteralExpr>2</IntegerLiteralExpr></TupleElement>)</TupleExpr></SequenceExpr><SequenceExpr><DiscardAssignmentExpr>
43+
_ </DiscardAssignmentExpr><AssignmentExpr>= </AssignmentExpr><TupleExpr>(<TupleElement>first: <IntegerLiteralExpr>1</IntegerLiteralExpr>, </TupleElement><TupleElement>second: <IntegerLiteralExpr>2</IntegerLiteralExpr></TupleElement>)</TupleExpr></SequenceExpr><SequenceExpr><DiscardAssignmentExpr>
44+
_ </DiscardAssignmentExpr><AssignmentExpr>= </AssignmentExpr><TupleExpr>(<TupleElement><IntegerLiteralExpr>1</IntegerLiteralExpr></TupleElement>)</TupleExpr></SequenceExpr><SequenceExpr><DiscardAssignmentExpr>
45+
_ </DiscardAssignmentExpr><AssignmentExpr>= </AssignmentExpr><TupleExpr>(<TupleElement>first: <IntegerLiteralExpr>1</IntegerLiteralExpr></TupleElement>)</TupleExpr></SequenceExpr>
4246
}</CodeBlock>
4347
}

test/Syntax/round_trip_parse_gen.swift

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,5 +39,9 @@ class C {
3939
func foo2() {
4040
_ = true ? 1 : 0
4141
_ = (true ? 1 : 0) ? (true ? 1 : 0) : (true ? 1 : 0)
42+
_ = (1, 2)
43+
_ = (first: 1, second: 2)
44+
_ = (1)
45+
_ = (first: 1)
4246
}
4347
}

utils/gyb_syntax_support/ExprNodes.py

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,9 @@
1919
Node('FunctionCallArgumentList', kind='SyntaxCollection',
2020
element='FunctionCallArgument'),
2121

22+
Node('TupleElementList', kind='SyntaxCollection',
23+
element='TupleElement'),
24+
2225
Node('ArrayElementList', kind='SyntaxCollection',
2326
element='ArrayElement'),
2427

@@ -131,6 +134,13 @@
131134
Child('RightParen', kind='RightParenToken'),
132135
]),
133136

137+
Node('TupleExpr', kind='Expr',
138+
children=[
139+
Child('LeftParen', kind='LeftParenToken'),
140+
Child('ElementList', kind='TupleElementList'),
141+
Child('RightParen', kind='RightParenToken'),
142+
]),
143+
134144
# Array literal, e.g. [1, 2, 3]
135145
Node('ArrayExpr', kind='Expr',
136146
children=[
@@ -159,6 +169,18 @@
159169
is_optional=True),
160170
]),
161171

172+
# An element inside a tuple element list
173+
Node('TupleElement', kind='Syntax',
174+
children=[
175+
Child('Label', kind='IdentifierToken',
176+
is_optional=True),
177+
Child('Colon', kind='ColonToken',
178+
is_optional=True),
179+
Child('Expression', kind='Expr'),
180+
Child('TrailingComma', kind='CommaToken',
181+
is_optional=True),
182+
]),
183+
162184
# element inside an array expression: expression ','?
163185
Node('ArrayElement', kind='Syntax',
164186
children=[

0 commit comments

Comments
 (0)