Skip to content

Commit 0363215

Browse files
committed
libSyntax: Support tuple expression.
Tuple expression essentially has the same underlying structure as function call arguments in libSyntax. However, we separate them as different libSyntax kinds for better usability. Different from AST, libSyntax currently allows single-child, label-free tuple expressions (represented as ParenExpr in AST). This is subject to change if we need to adopt the same differentiation in libSyntax in the future.
1 parent 36a08ec commit 0363215

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)