Skip to content

Commit be452ed

Browse files
committed
Introduce SwitchExprSyntax
This replaces SwitchStmtSyntax, and will be wrapped in an ExpressionStmtSyntax when used as a statement.
1 parent 67f8d52 commit be452ed

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
@@ -300,6 +300,73 @@
300300
is_optional=True),
301301
]),
302302

303+
# switch-expr -> identifier? ':'? 'switch' expr '{'
304+
# switch-case-list '}' ';'?
305+
#
306+
# This node represents both a 'switch' expression, as well as a 'switch'
307+
# statement when wrapped in a ExpressionStmt node.
308+
Node('SwitchExpr', name_for_diagnostics="'switch' statement", kind='Expr',
309+
traits=['Braced'],
310+
children=[
311+
Child('SwitchKeyword', kind='KeywordToken', token_choices=['KeywordToken|switch']),
312+
Child('Expression', kind='Expr'),
313+
Child('LeftBrace', kind='LeftBraceToken'),
314+
Child('Cases', kind='SwitchCaseList',
315+
collection_element_name='Case'),
316+
Child('RightBrace', kind='RightBraceToken',
317+
requires_leading_newline=True),
318+
]),
319+
320+
# switch-case-list -> switch-case switch-case-list?
321+
Node('SwitchCaseList', name_for_diagnostics=None, kind='SyntaxCollection',
322+
element='Syntax', element_name='SwitchCase',
323+
element_choices=['SwitchCase', 'IfConfigDecl'],
324+
elements_separated_by_newline=True),
325+
326+
# switch-case -> unknown-attr? switch-case-label stmt-list
327+
# | unknown-attr? switch-default-label stmt-list
328+
Node('SwitchCase', name_for_diagnostics='switch case', kind='Syntax',
329+
traits=['WithStatements'],
330+
parser_function='parseSwitchCase',
331+
children=[
332+
Child('UnknownAttr', kind='Attribute', is_optional=True),
333+
Child('Label', kind='Syntax', name_for_diagnostics='label',
334+
node_choices=[
335+
Child('Default', kind='SwitchDefaultLabel'),
336+
Child('Case', kind='SwitchCaseLabel'),
337+
]),
338+
Child('Statements', kind='CodeBlockItemList',
339+
collection_element_name='Statement',
340+
is_indented=True),
341+
]),
342+
343+
# switch-case-label -> 'case' case-item-list ':'
344+
Node('SwitchCaseLabel', name_for_diagnostics=None, kind='Syntax',
345+
children=[
346+
Child('CaseKeyword', kind='KeywordToken', token_choices=['KeywordToken|case']),
347+
Child('CaseItems', kind='CaseItemList',
348+
collection_element_name='CaseItem'),
349+
Child('Colon', kind='ColonToken'),
350+
]),
351+
352+
# switch-default-label -> 'default' ':'
353+
Node('SwitchDefaultLabel', name_for_diagnostics=None, kind='Syntax',
354+
children=[
355+
Child('DefaultKeyword', kind='KeywordToken', token_choices=['KeywordToken|default']),
356+
Child('Colon', kind='ColonToken'),
357+
]),
358+
359+
# case-item -> pattern where-clause? ','?
360+
Node('CaseItem', name_for_diagnostics=None, kind='Syntax',
361+
traits=['WithTrailingComma'],
362+
children=[
363+
Child('Pattern', kind='Pattern'),
364+
Child('WhereClause', kind='WhereClause',
365+
is_optional=True),
366+
Child('TrailingComma', kind='CommaToken',
367+
is_optional=True),
368+
]),
369+
303370
# ? expr :
304371
# Ternary expression without the condition and the second choice.
305372
# 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('Body', kind='CodeBlock'),
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='KeywordToken', token_choices=['KeywordToken|switch']),
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'),
@@ -239,41 +219,6 @@
239219
Child('Expression', kind='Expr'),
240220
]),
241221

242-
# switch-case -> unknown-attr? switch-case-label stmt-list
243-
# | unknown-attr? switch-default-label stmt-list
244-
Node('SwitchCase', name_for_diagnostics='switch case', kind='Syntax',
245-
traits=['WithStatements'],
246-
parser_function='parseSwitchCase',
247-
children=[
248-
Child('UnknownAttr', kind='Attribute', is_optional=True),
249-
Child('Label', kind='Syntax', name_for_diagnostics='label',
250-
node_choices=[
251-
Child('Default', kind='SwitchDefaultLabel'),
252-
Child('Case', kind='SwitchCaseLabel'),
253-
]),
254-
Child('Statements', kind='CodeBlockItemList',
255-
collection_element_name='Statement',
256-
is_indented=True),
257-
]),
258-
259-
# switch-default-label -> 'default' ':'
260-
Node('SwitchDefaultLabel', name_for_diagnostics=None, kind='Syntax',
261-
children=[
262-
Child('DefaultKeyword', kind='KeywordToken', token_choices=['KeywordToken|default']),
263-
Child('Colon', kind='ColonToken'),
264-
]),
265-
266-
# case-item -> pattern where-clause? ','?
267-
Node('CaseItem', name_for_diagnostics=None, kind='Syntax',
268-
traits=['WithTrailingComma'],
269-
children=[
270-
Child('Pattern', kind='Pattern'),
271-
Child('WhereClause', kind='WhereClause',
272-
is_optional=True),
273-
Child('TrailingComma', kind='CommaToken',
274-
is_optional=True),
275-
]),
276-
277222
# catch-item -> pattern? where-clause? ','?
278223
Node('CatchItem', name_for_diagnostics=None, kind='Syntax',
279224
traits=['WithTrailingComma'],
@@ -285,15 +230,6 @@
285230
is_optional=True),
286231
]),
287232

288-
# switch-case-label -> 'case' case-item-list ':'
289-
Node('SwitchCaseLabel', name_for_diagnostics=None, kind='Syntax',
290-
children=[
291-
Child('CaseKeyword', kind='KeywordToken', token_choices=['KeywordToken|case']),
292-
Child('CaseItems', kind='CaseItemList',
293-
collection_element_name='CaseItem'),
294-
Child('Colon', kind='ColonToken'),
295-
]),
296-
297233
# catch-clause 'catch' case-item-list? code-block
298234
Node('CatchClause', name_for_diagnostics="'catch' clause", kind='Syntax',
299235
traits=['WithCodeBlock'],

0 commit comments

Comments
 (0)