Revert "Revert "[SyntaxParse] Parse generic parameter clause and generic where clause""

This reverts commit 1584e87aa7.
This commit is contained in:
Rintaro Ishizaki
2019-09-20 15:26:04 -07:00
parent 6f35362e88
commit 0569cbfb28
33 changed files with 634 additions and 364 deletions

View File

@@ -11,22 +11,39 @@ GENERIC_NODES = [
]),
Node('GenericRequirementList', kind='SyntaxCollection',
element='Syntax',
element='GenericRequirement',
element_name='GenericRequirement'),
# generic-requirement ->
# (same-type-requrement|conformance-requirement|layout-requirement) ','?
Node('GenericRequirement', kind='Syntax',
traits=['WithTrailingComma'],
children=[
Child('Body', kind='Syntax',
node_choices=[
Child('SameTypeRequirement',
kind='SameTypeRequirement'),
Child('ConformanceRequirement',
kind='ConformanceRequirement'),
Child('LayoutRequirement',
kind='LayoutRequirement'),
]),
Child('TrailingComma', kind='CommaToken',
is_optional=True),
]),
# same-type-requirement -> type-identifier == type
Node('SameTypeRequirement', kind='Syntax',
traits=['WithTrailingComma'],
children=[
Child('LeftTypeIdentifier', kind='Type'),
Child('EqualityToken', kind='Token',
token_choices=[
'SpacedBinaryOperatorToken',
'UnspacedBinaryOperatorToken',
'PrefixOperatorToken',
'PostfixOperatorToken',
]),
Child('RightTypeIdentifier', kind='Type'),
Child('TrailingComma', kind='CommaToken',
is_optional=True),
]),
Node('GenericParameterList', kind='SyntaxCollection',
@@ -55,17 +72,41 @@ GENERIC_NODES = [
Child('LeftAngleBracket', kind='LeftAngleToken'),
Child('GenericParameterList', kind='GenericParameterList',
collection_element_name='GenericParameter'),
Child('ObsoletedWhereClause', kind='GenericWhereClause',
is_optional=True),
Child('RightAngleBracket', kind='RightAngleToken'),
]),
# conformance-requirement -> type-identifier : type-identifier
Node('ConformanceRequirement', kind='Syntax',
traits=['WithTrailingComma'],
children=[
Child('LeftTypeIdentifier', kind='Type'),
Child('Colon', kind='ColonToken'),
Child('RightTypeIdentifier', kind='Type'),
Child('TrailingComma', kind='CommaToken',
is_optional=True),
]),
# layout-requirement -> type ':' layout-constraint
Node('LayoutRequirement', kind='Syntax',
children=[
Child('LeftTypeIdentifier', kind='Type'),
Child('Colon', kind='ColonToken'),
Child('LayoutConstraint', kind='LayoutConstraint'),
]),
# layout-constraint ->
# identifier ('(' integer-literal (',' integer-literal)? ')')?
Node('LayoutConstraint', kind='Syntax',
children=[
Child('Name', kind='IdentifierToken'),
Child('LeftParen', kind='LeftParenToken',
is_optional=True),
Child('Size', kind='IntegerLiteralToken',
is_optional=True),
Child('Comma', kind='CommaToken',
is_optional=True),
Child('Alignment', kind='IntegerLiteralToken',
is_optional=True),
Child('RightParen', kind='RightParenToken',
is_optional=True),
]),
]