Skip to content

Commit 76ced56

Browse files
authored
Merge pull request #24440 from benlangmuir/syntax-custom-attr
Syntax: add Syntax support for property delegate attributes
2 parents a0892f9 + a7fe27a commit 76ced56

File tree

5 files changed

+45
-7
lines changed

5 files changed

+45
-7
lines changed

lib/Parse/ParseDecl.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1834,6 +1834,8 @@ bool Parser::parseDeclAttribute(DeclAttributes &Attributes, SourceLoc AtLoc) {
18341834
else if (Tok.isContextualKeyword("unknown")) {
18351835
diagnose(Tok, diag::unknown_attribute, "unknown");
18361836
} else {
1837+
// Change the context to create a custom attribute syntax.
1838+
SyntaxContext->setCreateSyntax(SyntaxKind::CustomAttribute);
18371839
// Parse a custom attribute.
18381840
auto type = parseType(diag::expected_type);
18391841
if (type.hasCodeCompletion() || type.isNull()) {
@@ -1857,8 +1859,6 @@ bool Parser::parseDeclAttribute(DeclAttributes &Attributes, SourceLoc AtLoc) {
18571859
PatternBindingInitializer *initContext = nullptr;
18581860

18591861
if (Tok.isFollowingLParen()) {
1860-
SyntaxParsingContext InitCtx(SyntaxContext,
1861-
SyntaxKind::InitializerClause);
18621862

18631863
// If we have no local context to parse the initial value into, create one
18641864
// for the PBD we'll eventually create. This allows us to have reasonable

test/Syntax/Outputs/round_trip_parse_gen.swift.withkinds

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -549,9 +549,9 @@ struct ReadModify <MemberDeclBlock>{<MemberDeclListItem><VariableDecl>
549549
var <PatternBinding><IdentifierPattern>rm1</IdentifierPattern><TypeAnnotation>: <TupleType>(<TupleTypeElement><SimpleTypeIdentifier>String</SimpleTypeIdentifier>, </TupleTypeElement><TupleTypeElement><SimpleTypeIdentifier>String</SimpleTypeIdentifier></TupleTypeElement>) </TupleType></TypeAnnotation><AccessorBlock>{<AccessorDecl>
550550
_read <CodeBlock>{ <YieldStmt>yield <YieldList>(<IdentifierExpr>st0</IdentifierExpr>) </YieldList></YieldStmt>}</CodeBlock></AccessorDecl>
551551
}</AccessorBlock></PatternBinding></VariableDecl></MemberDeclListItem>
552-
}</MemberDeclBlock></StructDecl><StructDecl><Attribute>
552+
}</MemberDeclBlock></StructDecl><StructDecl><CustomAttribute>
553553

554-
@_alignment(16) </Attribute><DeclModifier>public </DeclModifier>struct float3 <MemberDeclBlock>{ <MemberDeclListItem><VariableDecl><DeclModifier>public </DeclModifier>var <PatternBinding><IdentifierPattern>x</IdentifierPattern>, </PatternBinding><PatternBinding><IdentifierPattern>y</IdentifierPattern>, </PatternBinding><PatternBinding><IdentifierPattern>z</IdentifierPattern><TypeAnnotation>: <SimpleTypeIdentifier>Float </SimpleTypeIdentifier></TypeAnnotation></PatternBinding></VariableDecl></MemberDeclListItem>}</MemberDeclBlock></StructDecl><PoundSourceLocation>
554+
@<SimpleTypeIdentifier>custom </SimpleTypeIdentifier></CustomAttribute><Attribute>@_alignment(16) </Attribute><DeclModifier>public </DeclModifier>struct float3 <MemberDeclBlock>{ <MemberDeclListItem><VariableDecl><DeclModifier>public </DeclModifier>var <PatternBinding><IdentifierPattern>x</IdentifierPattern>, </PatternBinding><PatternBinding><IdentifierPattern>y</IdentifierPattern>, </PatternBinding><PatternBinding><IdentifierPattern>z</IdentifierPattern><TypeAnnotation>: <SimpleTypeIdentifier>Float </SimpleTypeIdentifier></TypeAnnotation></PatternBinding></VariableDecl></MemberDeclListItem>}</MemberDeclBlock></StructDecl><PoundSourceLocation>
555555

556556
#sourceLocation(<PoundSourceLocationArgs>file: "otherFile.swift", line: 5</PoundSourceLocationArgs>)</PoundSourceLocation><FunctionDecl>
557557

@@ -567,4 +567,12 @@ func foo<FunctionSignature><ParameterClause>() </ParameterClause></FunctionSigna
567567

568568
public </DeclModifier>func anyFoo<FunctionSignature><ParameterClause>() </ParameterClause><ReturnClause>-> <SomeType>some <SimpleTypeIdentifier>Foo </SimpleTypeIdentifier></SomeType></ReturnClause></FunctionSignature><CodeBlock>{}</CodeBlock></FunctionDecl><FunctionDecl><DeclModifier>
569569
public </DeclModifier>func qoo<FunctionSignature><ParameterClause>() </ParameterClause><ReturnClause>-> <SomeType>some <CompositionType><CompositionTypeElement><SimpleTypeIdentifier>O </SimpleTypeIdentifier>& </CompositionTypeElement><CompositionTypeElement><SimpleTypeIdentifier>O2 </SimpleTypeIdentifier></CompositionTypeElement></CompositionType></SomeType></ReturnClause></FunctionSignature><CodeBlock>{}</CodeBlock></FunctionDecl><FunctionDecl>
570-
func zlop<FunctionSignature><ParameterClause>() </ParameterClause><ReturnClause>-> <SomeType>some <CompositionType><CompositionTypeElement><SimpleTypeIdentifier>C </SimpleTypeIdentifier>& </CompositionTypeElement><CompositionTypeElement><SimpleTypeIdentifier>AnyObject </SimpleTypeIdentifier>& </CompositionTypeElement><CompositionTypeElement><SimpleTypeIdentifier>P </SimpleTypeIdentifier></CompositionTypeElement></CompositionType></SomeType></ReturnClause></FunctionSignature><CodeBlock>{}</CodeBlock></FunctionDecl>
570+
func zlop<FunctionSignature><ParameterClause>() </ParameterClause><ReturnClause>-> <SomeType>some <CompositionType><CompositionTypeElement><SimpleTypeIdentifier>C </SimpleTypeIdentifier>& </CompositionTypeElement><CompositionTypeElement><SimpleTypeIdentifier>AnyObject </SimpleTypeIdentifier>& </CompositionTypeElement><CompositionTypeElement><SimpleTypeIdentifier>P </SimpleTypeIdentifier></CompositionTypeElement></CompositionType></SomeType></ReturnClause></FunctionSignature><CodeBlock>{}</CodeBlock></FunctionDecl><FunctionDecl><CustomAttribute>
571+
572+
@<SimpleTypeIdentifier>custom</SimpleTypeIdentifier>(<FunctionCallArgument><IdentifierExpr>a</IdentifierExpr>, </FunctionCallArgument><FunctionCallArgument><IdentifierExpr>b</IdentifierExpr>,</FunctionCallArgument><FunctionCallArgument><IdentifierExpr>c</IdentifierExpr></FunctionCallArgument>)</CustomAttribute>
573+
func foo<FunctionSignature><ParameterClause>() </ParameterClause></FunctionSignature><CodeBlock>{}</CodeBlock></FunctionDecl><FunctionDecl><CustomAttribute>
574+
575+
@<SimpleTypeIdentifier>custom_attr</SimpleTypeIdentifier></CustomAttribute><CustomAttribute>
576+
@<SimpleTypeIdentifier>custom</SimpleTypeIdentifier>(<FunctionCallArgument>A: <IdentifierExpr>a</IdentifierExpr>, </FunctionCallArgument><FunctionCallArgument>B: <IdentifierExpr>b</IdentifierExpr>, </FunctionCallArgument><FunctionCallArgument>C:<IdentifierExpr>c</IdentifierExpr></FunctionCallArgument>)</CustomAttribute>
577+
func foo<FunctionSignature><ParameterClause>() </ParameterClause></FunctionSignature><CodeBlock>{}</CodeBlock></FunctionDecl>
578+

test/Syntax/round_trip_parse_gen.swift

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -551,7 +551,7 @@ struct ReadModify {
551551
}
552552
}
553553

554-
@_alignment(16) public struct float3 { public var x, y, z: Float }
554+
@custom @_alignment(16) public struct float3 { public var x, y, z: Float }
555555

556556
#sourceLocation(file: "otherFile.swift", line: 5)
557557

@@ -568,3 +568,11 @@ func foo() {}
568568
public func anyFoo() -> some Foo {}
569569
public func qoo() -> some O & O2 {}
570570
func zlop() -> some C & AnyObject & P {}
571+
572+
@custom(a, b,c)
573+
func foo() {}
574+
575+
@custom_attr
576+
@custom(A: a, B: b, C:c)
577+
func foo() {}
578+

utils/gyb_syntax_support/AttributeNodes.py

Lines changed: 22 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,23 @@
1010
Node('NonEmptyTokenList', kind='SyntaxCollection',
1111
element='Token', omit_when_empty=True),
1212

13+
Node('CustomAttribute', kind='Syntax',
14+
description='''
15+
A custom `@` attribute.
16+
''',
17+
children=[
18+
Child('AtSignToken', kind='AtSignToken',
19+
description='The `@` sign.'),
20+
Child('AttributeName', kind='Type', classification='Attribute',
21+
description='The name of the attribute.'),
22+
Child('LeftParen', kind='LeftParenToken',
23+
is_optional=True),
24+
Child('ArgumentList', kind='FunctionCallArgumentList',
25+
collection_element_name='Argument', is_optional=True),
26+
Child('RightParen', kind='RightParenToken',
27+
is_optional=True),
28+
]),
29+
1330
# attribute -> '@' identifier '('?
1431
# ( identifier
1532
# | string-literal
@@ -62,7 +79,11 @@
6279

6380
# attribute-list -> attribute attribute-list?
6481
Node('AttributeList', kind='SyntaxCollection',
65-
element='Attribute'),
82+
element='Syntax', element_name='Attribute',
83+
element_choices=[
84+
'Attribute',
85+
'CustomAttribute',
86+
]),
6687

6788
# The argument of '@_specialize(...)'
6889
# specialize-attr-spec-list -> labeled-specialize-entry

utils/gyb_syntax_support/NodeSerializationCodes.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -233,6 +233,7 @@
233233
'DeclName': 228,
234234
'PoundAssertStmt': 229,
235235
'SomeType': 230,
236+
'CustomAttribute': 231,
236237
}
237238

238239

0 commit comments

Comments
 (0)