mirror of
https://github.com/apple/swift.git
synced 2025-12-14 20:36:38 +01:00
* Create Swift libSyntax API This patch is an initial implementation of the Swift libSyntax API. It aims to provide all features of the C++ API but exposed to Swift. It currently resides in SwiftExperimental and will likely exist in a molten state for a while. * Only build SwiftSyntax on macOS
296 lines
10 KiB
Python
296 lines
10 KiB
Python
from Child import Child
|
|
from Node import Node # noqa: I201
|
|
|
|
STMT_NODES = [
|
|
# continue-stmt -> 'continue' label? ';'?
|
|
Node('ContinueStmt', kind='Stmt',
|
|
children=[
|
|
Child('ContinueKeyword', kind='ContinueToken'),
|
|
Child('Label', kind='IdentifierToken',
|
|
is_optional=True),
|
|
Child('Semicolon', kind='SemicolonToken',
|
|
is_optional=True),
|
|
]),
|
|
|
|
# while-stmt -> label? ':'? 'while' condition-list code-block ';'?
|
|
Node('WhileStmt', kind='Stmt',
|
|
children=[
|
|
Child('LabelName', kind='IdentifierToken',
|
|
is_optional=True),
|
|
Child('LabelColon', kind='ColonToken',
|
|
is_optional=True),
|
|
Child('WhileKeyword', kind='WhileToken'),
|
|
Child('Conditions', kind='ConditionList'),
|
|
Child('Body', kind='CodeBlock'),
|
|
Child('Semicolon', kind='SemicolonToken',
|
|
is_optional=True),
|
|
]),
|
|
|
|
# defer-stmt -> 'defer' code-block ';'?
|
|
Node('DeferStmt', kind='Stmt',
|
|
children=[
|
|
Child('DeferKeyword', kind='DeferToken'),
|
|
Child('Body', kind='CodeBlock'),
|
|
Child('Semicolon', kind='SemicolonToken',
|
|
is_optional=True),
|
|
]),
|
|
|
|
# expr-stmt -> expression ';'?
|
|
Node('ExpressionStmt', kind='Stmt',
|
|
children=[
|
|
Child('Expression', kind='Expr'),
|
|
Child('Semicolon', kind='SemicolonToken',
|
|
is_optional=True),
|
|
]),
|
|
|
|
# switch-case-list -> switch-case switch-case-list?
|
|
Node('SwitchCaseList', kind='SyntaxCollection',
|
|
element='SwitchCase'),
|
|
|
|
# repeat-while-stmt -> label? ':'? 'repeat' code-block 'while' expr ';'?
|
|
Node('RepeatWhileStmt', kind='Stmt',
|
|
children=[
|
|
Child('LabelName', kind='IdentifierToken',
|
|
is_optional=True),
|
|
Child('LabelColon', kind='ColonToken',
|
|
is_optional=True),
|
|
Child('RepeatKeyword', kind='RepeatToken'),
|
|
Child('Body', kind='CodeBlock'),
|
|
Child('WhileKeyword', kind='WhileToken'),
|
|
Child('Condition', kind='Expr'),
|
|
Child('Semicolon', kind='SemicolonToken',
|
|
is_optional=True),
|
|
]),
|
|
|
|
# guard-stmt -> 'guard' condition-list 'else' code-block ';'?
|
|
Node('GuardStmt', kind='Stmt',
|
|
children=[
|
|
Child('GuardKeyword', kind='GuardToken'),
|
|
Child('Conditions', kind='ConditionList'),
|
|
Child('ElseKeyword', kind='ElseToken'),
|
|
Child('Body', kind='CodeBlock'),
|
|
Child('Semicolon', kind='SemicolonToken',
|
|
is_optional=True),
|
|
]),
|
|
|
|
Node('ExprList', kind='SyntaxCollection',
|
|
element='Expr',
|
|
element_name='Expression'),
|
|
|
|
Node('WhereClause', kind='Syntax',
|
|
children=[
|
|
Child('WhereKeyword', kind='WhereToken'),
|
|
Child('Expressions', kind='ExprList'),
|
|
]),
|
|
|
|
# for-in-stmt -> label? ':'? 'for' 'case'? pattern 'in' expr 'where'?
|
|
# expr code-block ';'?
|
|
Node('ForInStmt', kind='Stmt',
|
|
children=[
|
|
Child('LabelName', kind='IdentifierToken',
|
|
is_optional=True),
|
|
Child('LabelColon', kind='ColonToken',
|
|
is_optional=True),
|
|
Child('ForKeyword', kind='ForToken'),
|
|
Child('CaseKeyword', kind='CaseToken',
|
|
is_optional=True),
|
|
Child('ItemPattern', kind='Pattern'),
|
|
Child('InKeyword', kind='InToken'),
|
|
Child('CollectionExpr', kind='Expr'),
|
|
Child('WhereClause', kind='WhereClause',
|
|
is_optional=True),
|
|
Child('Body', kind='CodeBlock'),
|
|
Child('Semicolon', kind='SemicolonToken',
|
|
is_optional=True),
|
|
]),
|
|
|
|
# switch-stmt -> identifier? ':'? 'switch' expr '{'
|
|
# switch-case-list '}' ';'?
|
|
Node('SwitchStmt', kind='Stmt',
|
|
children=[
|
|
Child('LabelName', kind='IdentifierToken',
|
|
is_optional=True),
|
|
Child('LabelColon', kind='ColonToken',
|
|
is_optional=True),
|
|
Child('SwitchKeyword', kind='SwitchToken'),
|
|
Child('Expression', kind='Expr'),
|
|
Child('OpenBrace', kind='LeftBraceToken'),
|
|
Child('Cases', kind='SwitchCaseList'),
|
|
Child('CloseBrace', kind='RightBraceToken'),
|
|
Child('Semicolon', kind='SemicolonToken',
|
|
is_optional=True),
|
|
]),
|
|
|
|
# catch-clause-list -> catch-clause catch-clause-list?
|
|
Node('CatchClauseList', kind='SyntaxCollection',
|
|
element='CatchClause'),
|
|
|
|
# do-stmt -> identifier? ':'? 'do' code-block catch-clause-list ';'?
|
|
Node('DoStmt', kind='Stmt',
|
|
children=[
|
|
Child('LabelName', kind='IdentifierToken',
|
|
is_optional=True),
|
|
Child('LabelColon', kind='ColonToken',
|
|
is_optional=True),
|
|
Child('DoKeyword', kind='DoToken'),
|
|
Child('Body', kind='CodeBlock'),
|
|
Child('CatchClauses', kind='CatchClauseList'),
|
|
Child('Semicolon', kind='SemicolonToken',
|
|
is_optional=True),
|
|
]),
|
|
|
|
# return-stmt -> 'return' expr? ';'?
|
|
Node('ReturnStmt', kind='Stmt',
|
|
children=[
|
|
Child('ReturnKeyword', kind='ReturnToken'),
|
|
Child('Expression', kind='Expr',
|
|
is_optional=True),
|
|
Child('Semicolon', kind='SemicolonToken',
|
|
is_optional=True),
|
|
]),
|
|
|
|
# fallthrough-stmt -> 'fallthrough' ';'?
|
|
Node('FallthroughStmt', kind='Stmt',
|
|
children=[
|
|
Child('FallthroughKeyword', kind='FallthroughToken'),
|
|
Child('Semicolon', kind='SemicolonToken',
|
|
is_optional=True),
|
|
]),
|
|
|
|
# break-stmt -> 'break' identifier? ';'?
|
|
Node('BreakStmt', kind='Stmt',
|
|
children=[
|
|
Child('BreakKeyword', kind='BreakToken'),
|
|
Child('Label', kind='IdentifierToken',
|
|
is_optional=True),
|
|
Child('Semicolon', kind='SemicolonToken',
|
|
is_optional=True),
|
|
]),
|
|
|
|
# code-block -> '{' stmt-list '}'
|
|
Node('CodeBlock', kind='Syntax',
|
|
children=[
|
|
Child('OpenBrace', kind='LeftBraceToken'),
|
|
Child('Statments', kind='StmtList'),
|
|
Child('CloseBrace', kind='RightBraceToken'),
|
|
]),
|
|
|
|
# case-item-list -> case-item case-item-list?
|
|
Node('CaseItemList', kind='SyntaxCollection',
|
|
element='CaseItem'),
|
|
|
|
Node('Condition', kind='Syntax',
|
|
children=[
|
|
Child('Condition', kind='Syntax'),
|
|
Child('TrailingComma', kind='CommaToken',
|
|
is_optional=True),
|
|
]),
|
|
|
|
# condition-list -> condition
|
|
# | condition ','? condition-list
|
|
# condition -> expression
|
|
# | availability-condition
|
|
# | case-condition
|
|
# | optional-binding-condition
|
|
Node('ConditionList', kind='SyntaxCollection',
|
|
element='Condition'),
|
|
|
|
# A declaration in statement position.
|
|
# struct Foo {};
|
|
Node('DeclarationStmt', kind='Stmt',
|
|
children=[
|
|
Child('Declaration', kind='Decl'),
|
|
Child('Semicolon', kind='SemicolonToken',
|
|
is_optional=True),
|
|
]),
|
|
|
|
# throw-stmt -> 'throw' expr ';'?
|
|
Node('ThrowStmt', kind='Stmt',
|
|
children=[
|
|
Child('ThrowKeyword', kind='ThrowToken'),
|
|
Child('Expression', kind='Expr'),
|
|
Child('Semicolon', kind='SemicolonToken',
|
|
is_optional=True),
|
|
]),
|
|
|
|
# if-stmt -> identifier? ':'? 'if' condition-list code-block
|
|
# else-clause ';'?
|
|
Node('IfStmt', kind='Stmt',
|
|
children=[
|
|
Child('LabelName', kind='IdentifierToken',
|
|
is_optional=True),
|
|
Child('LabelColon', kind='ColonToken',
|
|
is_optional=True),
|
|
Child('IfKeyword', kind='IfToken'),
|
|
Child('Conditions', kind='ConditionList'),
|
|
Child('Body', kind='CodeBlock'),
|
|
Child('ElseClause', kind='Syntax',
|
|
is_optional=True),
|
|
Child('Semicolon', kind='SemicolonToken',
|
|
is_optional=True),
|
|
]),
|
|
|
|
# else-if-continuation -> label? ':'? 'while' condition-list code-block ';'
|
|
Node('ElseIfContinuation', kind='Syntax',
|
|
children=[
|
|
Child('IfStatement', kind='IfStmt'),
|
|
]),
|
|
|
|
# else-clause -> 'else' code-block
|
|
Node('ElseBlock', kind='Syntax',
|
|
children=[
|
|
Child('ElseKeyword', kind='ElseToken'),
|
|
Child('Body', kind='CodeBlock'),
|
|
Child('Semicolon', kind='SemicolonToken',
|
|
is_optional=True),
|
|
]),
|
|
|
|
# stmt-list -> stmt stmt-list?
|
|
Node('StmtList', kind='SyntaxCollection',
|
|
element='Stmt'),
|
|
|
|
# switch-case -> switch-case-label stmt-list
|
|
# | default-label stmt-list
|
|
Node('SwitchCase', kind='Syntax',
|
|
children=[
|
|
Child('Label', kind='Syntax'),
|
|
Child('Body', kind='StmtList'),
|
|
]),
|
|
|
|
# switch-default-label -> 'default' ':'
|
|
Node('SwitchDefaultLabel', kind='Syntax',
|
|
children=[
|
|
Child('DefaultKeyword', kind='DefaultToken'),
|
|
Child('Colon', kind='ColonToken'),
|
|
]),
|
|
|
|
# case-item -> pattern where-clause? ','?
|
|
Node('CaseItem', kind='Syntax',
|
|
children=[
|
|
Child('Pattern', kind='Pattern'),
|
|
Child('WhereClause', kind='WhereClause',
|
|
is_optional=True),
|
|
Child('Comma', kind='CommaToken',
|
|
is_optional=True),
|
|
]),
|
|
|
|
# switch-case-label -> 'case' case-item-list ':'
|
|
Node('SwitchCaseLabel', kind='Syntax',
|
|
children=[
|
|
Child('CaseKeyword', kind='CaseToken'),
|
|
Child('CaseItems', kind='CaseItemList'),
|
|
Child('Colon', kind='ColonToken'),
|
|
]),
|
|
|
|
# catch-clause 'catch' pattern? where-clause? code-block
|
|
Node('CatchClause', kind='Syntax',
|
|
children=[
|
|
Child('CatchKeyword', kind='CatchToken'),
|
|
Child('Pattern', kind='Pattern',
|
|
is_optional=True),
|
|
Child('WhereClause', kind='WhereClause',
|
|
is_optional=True),
|
|
Child('Body', kind='CodeBlock'),
|
|
]),
|
|
]
|