Skip to content

Commit d5771ce

Browse files
sigitorintaro
authored andcommitted
Added extension specialization to libSyntax
1 parent aed3193 commit d5771ce

File tree

5 files changed

+65
-5
lines changed

5 files changed

+65
-5
lines changed

lib/Parse/ParseDecl.cpp

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2416,9 +2416,11 @@ Parser::parseDecl(ParseDeclOptions Flags,
24162416
DeclParsingContext.setCreateSyntax(SyntaxKind::ImportDecl);
24172417
DeclResult = parseDeclImport(Flags, Attributes);
24182418
break;
2419-
case tok::kw_extension:
2419+
case tok::kw_extension: {
2420+
DeclParsingContext.setCreateSyntax(SyntaxKind::ExtensionDecl);
24202421
DeclResult = parseDeclExtension(Flags, Attributes);
24212422
break;
2423+
}
24222424
case tok::kw_let:
24232425
case tok::kw_var: {
24242426
// Collect all modifiers into a modifier list.
@@ -3063,6 +3065,7 @@ Parser::parseDeclExtension(ParseDeclOptions Flags, DeclAttributes &Attributes) {
30633065
trailingWhereClause);
30643066
ext->getAttrs() = Attributes;
30653067

3068+
SyntaxParsingContext BlockContext(SyntaxContext, SyntaxKind::MemberDeclBlock);
30663069
SourceLoc LBLoc, RBLoc;
30673070
if (parseToken(tok::l_brace, LBLoc, diag::expected_lbrace_extension)) {
30683071
LBLoc = PreviousLoc;

lib/Syntax/Status.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -68,9 +68,9 @@
6868
* IfConfigDecl
6969
* PatternBindingDecl
7070
* VarDecl
71+
* ExtensionDecl
7172

7273
### In-progress (UnknownDecl):
73-
* ExtensionDecl (SR-6572)
7474

7575
### Not-started (UnknownDecl):
7676
* EnumCaseDecl

test/Syntax/Outputs/round_trip_parse_gen.swift.withkinds

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -311,4 +311,22 @@ func statementTests<FunctionSignature><ParameterClause>() </ParameterClause></Fu
311311

312312
for <ValueBindingPattern>var <IdentifierPattern>i </IdentifierPattern></ValueBindingPattern>in <IdentifierExpr>foo </IdentifierExpr><WhereClause>where <MemberAccessExpr><IdentifierExpr>i</IdentifierExpr>.foo </MemberAccessExpr></WhereClause><CodeBlock>{}</CodeBlock></ForInStmt><ForInStmt>
313313
for case <IsTypePattern>is <SimpleTypeIdentifier>Int </SimpleTypeIdentifier></IsTypePattern>in <IdentifierExpr>foo </IdentifierExpr><CodeBlock>{}</CodeBlock></ForInStmt>
314-
}</CodeBlock></FunctionDecl>
314+
}</CodeBlock></FunctionDecl><ExtensionDecl>
315+
316+
// MARK: - ExtensionDecl
317+
318+
extension <SimpleTypeIdentifier>ext </SimpleTypeIdentifier><MemberDeclBlock>{<VariableDecl>
319+
var <PatternBinding><IdentifierPattern>s</IdentifierPattern><TypeAnnotation>: <SimpleTypeIdentifier>Int </SimpleTypeIdentifier></TypeAnnotation><AccessorBlock>{<ReturnStmt>
320+
return <IntegerLiteralExpr>42</IntegerLiteralExpr></ReturnStmt>
321+
}</AccessorBlock></PatternBinding></VariableDecl>
322+
}</MemberDeclBlock></ExtensionDecl><ExtensionDecl><Attribute>
323+
324+
@available(*, unavailable)</Attribute><DeclModifier>
325+
fileprivate </DeclModifier>extension <SimpleTypeIdentifier>ext </SimpleTypeIdentifier><MemberDeclBlock>{}</MemberDeclBlock></ExtensionDecl><ExtensionDecl>
326+
327+
extension <SimpleTypeIdentifier>ext </SimpleTypeIdentifier><TypeInheritanceClause>: <InheritedType><SimpleTypeIdentifier>extProtocol </SimpleTypeIdentifier></InheritedType></TypeInheritanceClause><MemberDeclBlock>{}</MemberDeclBlock></ExtensionDecl><ExtensionDecl>
328+
329+
extension <SimpleTypeIdentifier>ext </SimpleTypeIdentifier><GenericWhereClause>where <SameTypeRequirement><SimpleTypeIdentifier>A </SimpleTypeIdentifier>== <SimpleTypeIdentifier>Int</SimpleTypeIdentifier>, </SameTypeRequirement><ConformanceRequirement><SimpleTypeIdentifier>B</SimpleTypeIdentifier>: <SimpleTypeIdentifier>Numeric </SimpleTypeIdentifier></ConformanceRequirement></GenericWhereClause><MemberDeclBlock>{}</MemberDeclBlock></ExtensionDecl><ExtensionDecl>
330+
331+
extension <MemberTypeIdentifier><MemberTypeIdentifier><SimpleTypeIdentifier>ext</SimpleTypeIdentifier>.a</MemberTypeIdentifier>.b </MemberTypeIdentifier><MemberDeclBlock>{}</MemberDeclBlock></ExtensionDecl>
332+

test/Syntax/round_trip_parse_gen.swift

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -312,3 +312,21 @@ func statementTests() {
312312
for var i in foo where i.foo {}
313313
for case is Int in foo {}
314314
}
315+
316+
// MARK: - ExtensionDecl
317+
318+
extension ext {
319+
var s: Int {
320+
return 42
321+
}
322+
}
323+
324+
@available(*, unavailable)
325+
fileprivate extension ext {}
326+
327+
extension ext : extProtocol {}
328+
329+
extension ext where A == Int, B: Numeric {}
330+
331+
extension ext.a.b {}
332+

utils/gyb_syntax_support/DeclNodes.py

Lines changed: 23 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -117,7 +117,7 @@
117117
# generic-parameter-clause?
118118
# type-inheritance-clause?
119119
# generic-where-clause?
120-
# '{' class-members ''
120+
# '{' class-members '}'
121121
# class-name -> identifier
122122
Node('ClassDecl', kind='Decl',
123123
children=[
@@ -141,7 +141,7 @@
141141
# generic-parameter-clause?
142142
# type-inheritance-clause?
143143
# generic-where-clause?
144-
# '{' struct-members ''
144+
# '{' struct-members '}'
145145
# struct-name -> identifier
146146
Node('StructDecl', kind='Decl',
147147
children=[
@@ -175,6 +175,27 @@
175175
Child('Members', kind='MemberDeclBlock'),
176176
]),
177177

178+
# extension-declaration -> attributes? access-level-modifier?
179+
# 'extension' extended-type
180+
# type-inheritance-clause?
181+
# generic-where-clause?
182+
# '{' extension-members '}'
183+
# extension-name -> identifier
184+
Node('ExtensionDecl', kind='Decl',
185+
children=[
186+
Child('Attributes', kind='AttributeList',
187+
is_optional=True),
188+
Child('AccessLevelModifier', kind='DeclModifier',
189+
is_optional=True),
190+
Child('ExtensionKeyword', kind='ExtensionToken'),
191+
Child('ExtendedType', kind='Type'),
192+
Child('InheritanceClause', kind='TypeInheritanceClause',
193+
is_optional=True),
194+
Child('GenericWhereClause', kind='GenericWhereClause',
195+
is_optional=True),
196+
Child('Members', kind='MemberDeclBlock'),
197+
]),
198+
178199
Node('MemberDeclBlock', kind='Syntax',
179200
children=[
180201
Child('LeftBrace', kind='LeftBraceToken'),

0 commit comments

Comments
 (0)