Skip to content

Commit 102f1ac

Browse files
committed
Introduce SwitchExprSyntax
This replaces SwitchStmtSyntax, and will be wrapped in an ExpressionStmtSyntax when used as a statement.
1 parent 03f302a commit 102f1ac

File tree

2 files changed

+67
-64
lines changed

2 files changed

+67
-64
lines changed

gyb_syntax_support/ExprNodes.py

Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -307,6 +307,73 @@
307307
is_optional=True),
308308
]),
309309

310+
# switch-expr -> identifier? ':'? 'switch' expr '{'
311+
# switch-case-list '}' ';'?
312+
#
313+
# This node represents both a 'switch' expression, as well as a 'switch'
314+
# statement when wrapped in a ExpressionStmt node.
315+
Node('SwitchExpr', name_for_diagnostics="'switch' statement", kind='Expr',
316+
traits=['Braced'],
317+
children=[
318+
Child('SwitchKeyword', kind='SwitchToken'),
319+
Child('Expression', kind='Expr'),
320+
Child('LeftBrace', kind='LeftBraceToken'),
321+
Child('Cases', kind='SwitchCaseList',
322+
collection_element_name='Case'),
323+
Child('RightBrace', kind='RightBraceToken',
324+
requires_leading_newline=True),
325+
]),
326+
327+
# switch-case-list -> switch-case switch-case-list?
328+
Node('SwitchCaseList', name_for_diagnostics=None, kind='SyntaxCollection',
329+
element='Syntax', element_name='SwitchCase',
330+
element_choices=['SwitchCase', 'IfConfigDecl'],
331+
elements_separated_by_newline=True),
332+
333+
# switch-case -> unknown-attr? switch-case-label stmt-list
334+
# | unknown-attr? switch-default-label stmt-list
335+
Node('SwitchCase', name_for_diagnostics='switch case', kind='Syntax',
336+
traits=['WithStatements'],
337+
parser_function='parseSwitchCase',
338+
children=[
339+
Child('UnknownAttr', kind='Attribute', is_optional=True),
340+
Child('Label', kind='Syntax', name_for_diagnostics='label',
341+
node_choices=[
342+
Child('Default', kind='SwitchDefaultLabel'),
343+
Child('Case', kind='SwitchCaseLabel'),
344+
]),
345+
Child('Statements', kind='CodeBlockItemList',
346+
collection_element_name='Statement',
347+
is_indented=True),
348+
]),
349+
350+
# switch-case-label -> 'case' case-item-list ':'
351+
Node('SwitchCaseLabel', name_for_diagnostics=None, kind='Syntax',
352+
children=[
353+
Child('CaseKeyword', kind='CaseToken'),
354+
Child('CaseItems', kind='CaseItemList',
355+
collection_element_name='CaseItem'),
356+
Child('Colon', kind='ColonToken'),
357+
]),
358+
359+
# switch-default-label -> 'default' ':'
360+
Node('SwitchDefaultLabel', name_for_diagnostics=None, kind='Syntax',
361+
children=[
362+
Child('DefaultKeyword', kind='DefaultToken'),
363+
Child('Colon', kind='ColonToken'),
364+
]),
365+
366+
# case-item -> pattern where-clause? ','?
367+
Node('CaseItem', name_for_diagnostics=None, kind='Syntax',
368+
traits=['WithTrailingComma'],
369+
children=[
370+
Child('Pattern', kind='Pattern'),
371+
Child('WhereClause', kind='WhereClause',
372+
is_optional=True),
373+
Child('TrailingComma', kind='CommaToken',
374+
is_optional=True),
375+
]),
376+
310377
# ? expr :
311378
# Ternary expression without the condition and the second choice.
312379
# NOTE: This appears only in SequenceExpr.

gyb_syntax_support/StmtNodes.py

Lines changed: 0 additions & 64 deletions
Original file line numberDiff line numberDiff line change
@@ -42,12 +42,6 @@
4242
Child('Expression', kind='Expr'),
4343
]),
4444

45-
# switch-case-list -> switch-case switch-case-list?
46-
Node('SwitchCaseList', name_for_diagnostics=None, kind='SyntaxCollection',
47-
element='Syntax', element_name='SwitchCase',
48-
element_choices=['SwitchCase', 'IfConfigDecl'],
49-
elements_separated_by_newline=True),
50-
5145
# repeat-while-stmt -> label? ':'? 'repeat' code-block 'while' expr ';'?
5246
Node('RepeatWhileStmt', name_for_diagnostics="'repeat' statement", kind='Stmt',
5347
traits=['WithCodeBlock'],
@@ -99,20 +93,6 @@
9993
Child('Body', kind='CodeBlock', name_for_diagnostics='body'),
10094
]),
10195

102-
# switch-stmt -> identifier? ':'? 'switch' expr '{'
103-
# switch-case-list '}' ';'?
104-
Node('SwitchStmt', name_for_diagnostics="'switch' statement", kind='Stmt',
105-
traits=['Braced'],
106-
children=[
107-
Child('SwitchKeyword', kind='SwitchToken'),
108-
Child('Expression', kind='Expr'),
109-
Child('LeftBrace', kind='LeftBraceToken'),
110-
Child('Cases', kind='SwitchCaseList',
111-
collection_element_name='Case'),
112-
Child('RightBrace', kind='RightBraceToken',
113-
requires_leading_newline=True),
114-
]),
115-
11696
# catch-clause-list -> catch-clause catch-clause-list?
11797
Node('CatchClauseList', name_for_diagnostics="'catch' clause",
11898
kind='SyntaxCollection', element='CatchClause'),
@@ -271,41 +251,6 @@
271251
Child('Expression', kind='Expr'),
272252
]),
273253

274-
# switch-case -> unknown-attr? switch-case-label stmt-list
275-
# | unknown-attr? switch-default-label stmt-list
276-
Node('SwitchCase', name_for_diagnostics='switch case', kind='Syntax',
277-
traits=['WithStatements'],
278-
parser_function='parseSwitchCase',
279-
children=[
280-
Child('UnknownAttr', kind='Attribute', is_optional=True),
281-
Child('Label', kind='Syntax', name_for_diagnostics='label',
282-
node_choices=[
283-
Child('Default', kind='SwitchDefaultLabel'),
284-
Child('Case', kind='SwitchCaseLabel'),
285-
]),
286-
Child('Statements', kind='CodeBlockItemList',
287-
collection_element_name='Statement',
288-
is_indented=True),
289-
]),
290-
291-
# switch-default-label -> 'default' ':'
292-
Node('SwitchDefaultLabel', name_for_diagnostics=None, kind='Syntax',
293-
children=[
294-
Child('DefaultKeyword', kind='DefaultToken'),
295-
Child('Colon', kind='ColonToken'),
296-
]),
297-
298-
# case-item -> pattern where-clause? ','?
299-
Node('CaseItem', name_for_diagnostics=None, kind='Syntax',
300-
traits=['WithTrailingComma'],
301-
children=[
302-
Child('Pattern', kind='Pattern'),
303-
Child('WhereClause', kind='WhereClause',
304-
is_optional=True),
305-
Child('TrailingComma', kind='CommaToken',
306-
is_optional=True),
307-
]),
308-
309254
# catch-item -> pattern? where-clause? ','?
310255
Node('CatchItem', name_for_diagnostics=None, kind='Syntax',
311256
traits=['WithTrailingComma'],
@@ -317,15 +262,6 @@
317262
is_optional=True),
318263
]),
319264

320-
# switch-case-label -> 'case' case-item-list ':'
321-
Node('SwitchCaseLabel', name_for_diagnostics=None, kind='Syntax',
322-
children=[
323-
Child('CaseKeyword', kind='CaseToken'),
324-
Child('CaseItems', kind='CaseItemList',
325-
collection_element_name='CaseItem'),
326-
Child('Colon', kind='ColonToken'),
327-
]),
328-
329265
# catch-clause 'catch' case-item-list? code-block
330266
Node('CatchClause', name_for_diagnostics="'catch' clause", kind='Syntax',
331267
traits=['WithCodeBlock'],

0 commit comments

Comments
 (0)