Skip to content

Commit 8fbe69f

Browse files
committed
Add Layout Requirements To AST
Layout Requirements aren't a fully-exposed part of the language, but we do need some representation for them.
1 parent 26bcec5 commit 8fbe69f

File tree

3 files changed

+24
-3
lines changed

3 files changed

+24
-3
lines changed

lib/Parse/ParseGeneric.cpp

+3-1
Original file line numberDiff line numberDiff line change
@@ -298,10 +298,11 @@ ParserStatus Parser::parseGenericWhereClause(
298298
if (Tok.is(tok::colon)) {
299299
// A conformance-requirement.
300300
SourceLoc ColonLoc = consumeToken();
301-
BodyContext->setCreateSyntax(SyntaxKind::ConformanceRequirement);
302301
if (Tok.is(tok::identifier) &&
303302
getLayoutConstraint(Context.getIdentifier(Tok.getText()), Context)
304303
->isKnownLayout()) {
304+
BodyContext->setCreateSyntax(SyntaxKind::LayoutRequirement);
305+
305306
// Parse a layout constraint.
306307
Identifier LayoutName;
307308
auto LayoutLoc = consumeIdentifier(LayoutName,
@@ -323,6 +324,7 @@ ParserStatus Parser::parseGenericWhereClause(
323324
LayoutConstraintLoc(Layout, LayoutLoc)));
324325
}
325326
} else {
327+
BodyContext->setCreateSyntax(SyntaxKind::ConformanceRequirement);
326328
// Parse the protocol or composition.
327329
ParserResult<TypeRepr> Protocol = parseType();
328330
Status |= Protocol;

utils/gyb_syntax_support/GenericNodes.py

+20-1
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@
1515
element_name='GenericRequirement'),
1616

1717
# generic-requirement ->
18-
# (same-type-requirement|conformance-requirement) ','?
18+
# (same-type-requirement|conformance-requirement|layout-requirement) ','?
1919
Node('GenericRequirement', kind='Syntax',
2020
traits=['WithTrailingComma'],
2121
children=[
@@ -25,6 +25,8 @@
2525
kind='SameTypeRequirement'),
2626
Child('ConformanceRequirement',
2727
kind='ConformanceRequirement'),
28+
Child('LayoutRequirement',
29+
kind='LayoutRequirement'),
2830
]),
2931
Child('TrailingComma', kind='CommaToken',
3032
is_optional=True),
@@ -44,6 +46,23 @@
4446
Child('RightTypeIdentifier', kind='Type'),
4547
]),
4648

49+
# layout-requirement -> type-name : layout-constraint
50+
# layout-constraint -> identifier '('? integer-literal? ','? integer-literal? ')'?
51+
Node('LayoutRequirement', kind='Syntax',
52+
children=[
53+
Child('TypeIdentifier', kind='Type'),
54+
Child('Colon', kind='ColonToken'),
55+
Child('LayoutConstraint', kind='IdentifierToken'),
56+
Child('LeftParen', kind='LeftParenToken',
57+
is_optional=True),
58+
Child('Size', kind='IntegerLiteralToken', is_optional=True),
59+
Child('Comma', kind='CommaToken',
60+
is_optional=True),
61+
Child('Alignment', kind='IntegerLiteralToken', is_optional=True),
62+
Child('RightParen', kind='RightParenToken',
63+
is_optional=True),
64+
]),
65+
4766
Node('GenericParameterList', kind='SyntaxCollection',
4867
element='GenericParameter'),
4968

utils/gyb_syntax_support/NodeSerializationCodes.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -166,7 +166,7 @@
166166
'AvailabilityVersionRestriction': 161,
167167
'VersionTuple': 162,
168168
'CodeBlockItemList': 163,
169-
# removed: 'FunctionCallArgumentList': 164,
169+
'LayoutRequirement': 164,
170170
'TupleExprElementList': 165,
171171
'ArrayElementList': 166,
172172
'DictionaryElementList': 167,

0 commit comments

Comments
 (0)