mirror of
https://github.com/apple/swift.git
synced 2025-12-14 20:36:38 +01:00
Strange as it sounds, we parse @foo public in item position as a decl that has a hanging attribute and access control modifier. We need to be able to stick... something in the tree here so we don't just drop these tokens on the floor.
72 lines
2.8 KiB
Python
72 lines
2.8 KiB
Python
from .Child import Child
|
|
from .Node import Node # noqa: I201
|
|
|
|
COMMON_NODES = [
|
|
Node('Decl', kind='Syntax'),
|
|
Node('Expr', kind='Syntax'),
|
|
Node('Stmt', kind='Syntax'),
|
|
Node('Type', kind='Syntax'),
|
|
Node('Pattern', kind='Syntax'),
|
|
Node('UnknownDecl', kind='Decl'),
|
|
Node('UnknownExpr', kind='Expr'),
|
|
Node('UnknownStmt', kind='Stmt'),
|
|
Node('UnknownType', kind='Type'),
|
|
Node('UnknownPattern', kind='Pattern'),
|
|
Node('Missing', kind='Syntax'),
|
|
Node('MissingDecl', kind='Decl', children=[
|
|
Child('Attributes', kind='AttributeList',
|
|
collection_element_name='Attribute', is_optional=True),
|
|
Child('Modifiers', kind='ModifierList',
|
|
collection_element_name='Modifier', is_optional=True),
|
|
]),
|
|
Node('MissingExpr', kind='Expr'),
|
|
Node('MissingStmt', kind='Stmt'),
|
|
Node('MissingType', kind='Type'),
|
|
Node('MissingPattern', kind='Pattern'),
|
|
|
|
# code-block-item = (decl | stmt | expr) ';'?
|
|
Node('CodeBlockItem', kind='Syntax', omit_when_empty=True,
|
|
description="""
|
|
A CodeBlockItem is any Syntax node that appears on its own line inside
|
|
a CodeBlock.
|
|
""",
|
|
children=[
|
|
Child('Item', kind='Syntax',
|
|
description="The underlying node inside the code block.",
|
|
node_choices=[
|
|
Child('Decl', kind='Decl'),
|
|
Child('Stmt', kind='Stmt'),
|
|
Child('Expr', kind='Expr'),
|
|
Child('TokenList', kind='TokenList'),
|
|
Child('NonEmptyTokenList', kind='NonEmptyTokenList'),
|
|
]),
|
|
Child('Semicolon', kind='SemicolonToken',
|
|
description="""
|
|
If present, the trailing semicolon at the end of the item.
|
|
""",
|
|
is_optional=True),
|
|
Child('ErrorTokens', kind='Syntax', is_optional=True),
|
|
]),
|
|
|
|
# code-block-item-list -> code-block-item code-block-item-list?
|
|
Node('CodeBlockItemList', kind='SyntaxCollection',
|
|
element='CodeBlockItem', elements_separated_by_newline=True),
|
|
|
|
# code-block -> '{' stmt-list '}'
|
|
Node('CodeBlock', kind='Syntax',
|
|
traits=['Braced', 'WithStatements'],
|
|
children=[
|
|
Child('LeftBrace', kind='LeftBraceToken'),
|
|
Child('Statements', kind='CodeBlockItemList',
|
|
collection_element_name='Statement', is_indented=True),
|
|
Child('RightBrace', kind='RightBraceToken',
|
|
requires_leading_newline=True),
|
|
]),
|
|
|
|
Node('GarbageNodes', kind='SyntaxCollection', element='Syntax',
|
|
description='''
|
|
A collection of syntax nodes that occurred in the source code but
|
|
could not be used to form a valid syntax tree.
|
|
'''),
|
|
]
|