Skip to content

Commit 5e41098

Browse files
ftchirounkcsgexi
authored andcommitted
libSyntax: specialize class declaration syntax node. (#13485)
1 parent c27b366 commit 5e41098

File tree

5 files changed

+62
-10
lines changed

5 files changed

+62
-10
lines changed

lib/Parse/ParseDecl.cpp

+2
Original file line numberDiff line numberDiff line change
@@ -2316,6 +2316,7 @@ Parser::parseDecl(ParseDeclOptions Flags,
23162316

23172317
consumeToken(tok::kw_class);
23182318
// Otherwise this is the start of a class declaration.
2319+
DeclParsingContext.setCreateSyntax(SyntaxKind::ClassDecl);
23192320
DeclResult = parseDeclClass(ClassLoc, Flags, Attributes);
23202321
break;
23212322
}
@@ -5480,6 +5481,7 @@ ParserResult<ClassDecl> Parser::parseDeclClass(SourceLoc ClassLoc,
54805481

54815482
CD->setGenericParams(GenericParams);
54825483

5484+
SyntaxParsingContext BlockContext(SyntaxContext, SyntaxKind::MemberDeclBlock);
54835485
SourceLoc LBLoc, RBLoc;
54845486
if (parseToken(tok::l_brace, LBLoc, diag::expected_lbrace_class)) {
54855487
LBLoc = PreviousLoc;

lib/Syntax/Status.md

+1-1
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,7 @@
6161

6262
### Done:
6363
* TopLevelCodeDecl
64+
* ClassDecl
6465
* StructDecl
6566
* FuncDecl
6667
* ProtocolDecl
@@ -71,7 +72,6 @@
7172
### In-progress (UnknownDecl):
7273
* PatternBindingDecl
7374
* VarDecl
74-
* ClassDecl (SR-6571)
7575
* ExtensionDecl (SR-6572)
7676

7777
### Not-started (UnknownDecl):

test/Syntax/Outputs/round_trip_parse_gen.swift.withkinds

+21-8
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,8 @@ import <AccessPathComponent>A.</AccessPathComponent><AccessPathComponent>B.</Acc
99
@objc </Attribute>import typealias <AccessPathComponent>A.</AccessPathComponent><AccessPathComponent>B</AccessPathComponent></ImportDecl><ImportDecl>
1010
import struct <AccessPathComponent>A.</AccessPathComponent><AccessPathComponent>B</AccessPathComponent></ImportDecl><IfConfigDecl>
1111

12-
#if <IdentifierExpr>Blah</IdentifierExpr>
13-
class C {<FunctionDecl>
12+
#if <IdentifierExpr>Blah</IdentifierExpr><ClassDecl>
13+
class C <MemberDeclBlock>{<FunctionDecl>
1414
func bar<FunctionSignature><ParameterClause>(<FunctionParameter>_ a: <SimpleTypeIdentifier>Int</SimpleTypeIdentifier></FunctionParameter>) </ParameterClause></FunctionSignature><CodeBlock>{}</CodeBlock></FunctionDecl><FunctionDecl>
1515
func bar1<FunctionSignature><ParameterClause>(<FunctionParameter>_ a: <SimpleTypeIdentifier>Float</SimpleTypeIdentifier></FunctionParameter>) </ParameterClause><ReturnClause>-> <SimpleTypeIdentifier>Float </SimpleTypeIdentifier></ReturnClause></FunctionSignature><CodeBlock>{ <ReturnStmt>return <SequenceExpr><PrefixOperatorExpr>-<FloatLiteralExpr>0.6 </FloatLiteralExpr></PrefixOperatorExpr><BinaryOperatorExpr>+ </BinaryOperatorExpr><FloatLiteralExpr>0.1 </FloatLiteralExpr><BinaryOperatorExpr>- </BinaryOperatorExpr><FloatLiteralExpr>0.3 </FloatLiteralExpr></SequenceExpr></ReturnStmt>}</CodeBlock></FunctionDecl><FunctionDecl>
1616
func bar2<FunctionSignature><ParameterClause>(<FunctionParameter>a: <SimpleTypeIdentifier>Int</SimpleTypeIdentifier>, </FunctionParameter><FunctionParameter>b: <SimpleTypeIdentifier>Int</SimpleTypeIdentifier>, </FunctionParameter><FunctionParameter>c:<SimpleTypeIdentifier>Int</SimpleTypeIdentifier></FunctionParameter>) </ParameterClause><ReturnClause>-> <SimpleTypeIdentifier>Int </SimpleTypeIdentifier></ReturnClause></FunctionSignature><CodeBlock>{ <ReturnStmt>return <IntegerLiteralExpr>1 </IntegerLiteralExpr></ReturnStmt>}</CodeBlock></FunctionDecl><FunctionDecl>
@@ -64,7 +64,7 @@ class C {<FunctionDecl>
6464
_ </DiscardAssignmentExpr><AssignmentExpr>= </AssignmentExpr><IdentifierExpr>a </IdentifierExpr><AsExpr>as <SimpleTypeIdentifier>Bool </SimpleTypeIdentifier></AsExpr><BinaryOperatorExpr>|| </BinaryOperatorExpr><IdentifierExpr>a </IdentifierExpr><AsExpr>as! <SimpleTypeIdentifier>Bool </SimpleTypeIdentifier></AsExpr><BinaryOperatorExpr>|| </BinaryOperatorExpr><IdentifierExpr>a </IdentifierExpr><AsExpr>as? <SimpleTypeIdentifier>Bool</SimpleTypeIdentifier></AsExpr></SequenceExpr><SequenceExpr><DiscardAssignmentExpr>
6565
_ </DiscardAssignmentExpr><AssignmentExpr>= </AssignmentExpr><IdentifierExpr>a </IdentifierExpr><IsExpr>is <SimpleTypeIdentifier>Bool</SimpleTypeIdentifier></IsExpr></SequenceExpr>
6666
}</CodeBlock></FunctionDecl>
67-
}
67+
}</MemberDeclBlock></ClassDecl>
6868

6969
#endif</IfConfigDecl><IfConfigDecl>
7070

@@ -83,7 +83,20 @@ typealias H <TypeInitializerClause>= <FunctionType>() rethrows -> <TupleType>()<
8383
typealias I <TypeInitializerClause>= <FunctionType>(<TupleTypeElement><CompositionType><CompositionTypeElement><SimpleTypeIdentifier>A </SimpleTypeIdentifier>& </CompositionTypeElement><CompositionTypeElement><SimpleTypeIdentifier>B<GenericArgumentClause><<GenericArgument><SimpleTypeIdentifier>C</SimpleTypeIdentifier></GenericArgument>></GenericArgumentClause></SimpleTypeIdentifier></CompositionTypeElement></CompositionType></TupleTypeElement>) -> <CompositionType><CompositionTypeElement><SimpleTypeIdentifier>C </SimpleTypeIdentifier>& </CompositionTypeElement><CompositionTypeElement><SimpleTypeIdentifier>D</SimpleTypeIdentifier></CompositionTypeElement></CompositionType></FunctionType></TypeInitializerClause></TypealiasDecl><TypealiasDecl><Attribute>
8484

8585
@objc </Attribute><DeclModifier>private </DeclModifier>typealias T<GenericParameterClause><<GenericParameter>a,</GenericParameter><GenericParameter>b</GenericParameter>> </GenericParameterClause><TypeInitializerClause>= <SimpleTypeIdentifier>Int</SimpleTypeIdentifier></TypeInitializerClause></TypealiasDecl><TypealiasDecl><Attribute>
86-
@objc </Attribute><DeclModifier>private </DeclModifier>typealias T<GenericParameterClause><<GenericParameter>a,</GenericParameter><GenericParameter>b</GenericParameter>></GenericParameterClause></TypealiasDecl><StructDecl>
86+
@objc </Attribute><DeclModifier>private </DeclModifier>typealias T<GenericParameterClause><<GenericParameter>a,</GenericParameter><GenericParameter>b</GenericParameter>></GenericParameterClause></TypealiasDecl><ClassDecl>
87+
88+
class Foo <MemberDeclBlock>{
89+
let bar: <SimpleTypeIdentifier>Int</SimpleTypeIdentifier>
90+
}</MemberDeclBlock></ClassDecl><ClassDecl>
91+
92+
class Bar<TypeInheritanceClause>: <InheritedType><SimpleTypeIdentifier>Foo </SimpleTypeIdentifier></InheritedType></TypeInheritanceClause><MemberDeclBlock>{
93+
var foo: <SimpleTypeIdentifier>Int </SimpleTypeIdentifier>= <IntegerLiteralExpr>42</IntegerLiteralExpr>
94+
}</MemberDeclBlock></ClassDecl><ClassDecl>
95+
96+
class C<GenericParameterClause><<GenericParameter>A, </GenericParameter><GenericParameter>B</GenericParameter>> </GenericParameterClause><GenericWhereClause>where <ConformanceRequirement><SimpleTypeIdentifier>A</SimpleTypeIdentifier>: <SimpleTypeIdentifier>Foo</SimpleTypeIdentifier>, </ConformanceRequirement><SameTypeRequirement><SimpleTypeIdentifier>B </SimpleTypeIdentifier>== <SimpleTypeIdentifier>Bar </SimpleTypeIdentifier></SameTypeRequirement></GenericWhereClause><MemberDeclBlock>{}</MemberDeclBlock></ClassDecl><ClassDecl><Attribute>
97+
98+
@available(*, unavailable)</Attribute><DeclModifier>
99+
private </DeclModifier>class C <MemberDeclBlock>{}</MemberDeclBlock></ClassDecl><StructDecl>
87100

88101
struct foo <MemberDeclBlock>{<StructDecl>
89102
struct foo <MemberDeclBlock>{<StructDecl>
@@ -97,12 +110,12 @@ struct foo <MemberDeclBlock>{<StructDecl>
97110

98111
struct foo <MemberDeclBlock>{<StructDecl><Attribute>
99112
@available(*, unavailable)</Attribute>
100-
struct foo <MemberDeclBlock>{}</MemberDeclBlock></StructDecl><DeclModifier>
101-
public </DeclModifier>class foo {<FunctionDecl><Attribute>
113+
struct foo <MemberDeclBlock>{}</MemberDeclBlock></StructDecl><ClassDecl><DeclModifier>
114+
public </DeclModifier>class foo <MemberDeclBlock>{<FunctionDecl><Attribute>
102115
@available(*, unavailable)</Attribute><Attribute>
103116
@objc(fooObjc)</Attribute><DeclModifier>
104117
private </DeclModifier><DeclModifier>static </DeclModifier>func foo<FunctionSignature><ParameterClause>() </ParameterClause></FunctionSignature><CodeBlock>{}</CodeBlock></FunctionDecl>
105-
}
118+
}</MemberDeclBlock></ClassDecl>
106119
}</MemberDeclBlock></StructDecl><StructDecl>
107120

108121
struct S<GenericParameterClause><<GenericParameter>A, </GenericParameter><GenericParameter>B, </GenericParameter><GenericParameter>C, </GenericParameter><GenericParameter><Attribute>@objc </Attribute>D</GenericParameter>> </GenericParameterClause><GenericWhereClause>where <ConformanceRequirement><SimpleTypeIdentifier>A</SimpleTypeIdentifier>:<SimpleTypeIdentifier>B</SimpleTypeIdentifier>, </ConformanceRequirement><SameTypeRequirement><SimpleTypeIdentifier>B</SimpleTypeIdentifier>==<SimpleTypeIdentifier>C</SimpleTypeIdentifier>, </SameTypeRequirement><ConformanceRequirement><SimpleTypeIdentifier>A </SimpleTypeIdentifier>: <SimpleTypeIdentifier>C</SimpleTypeIdentifier>, </ConformanceRequirement><SameTypeRequirement><MemberTypeIdentifier><SimpleTypeIdentifier>B</SimpleTypeIdentifier>.C </MemberTypeIdentifier>== <MemberTypeIdentifier><SimpleTypeIdentifier>D</SimpleTypeIdentifier>.A</MemberTypeIdentifier>, </SameTypeRequirement><ConformanceRequirement><MemberTypeIdentifier><SimpleTypeIdentifier>A</SimpleTypeIdentifier>.B</MemberTypeIdentifier>: <MemberTypeIdentifier><SimpleTypeIdentifier>C</SimpleTypeIdentifier>.D </MemberTypeIdentifier></ConformanceRequirement></GenericWhereClause><MemberDeclBlock>{}</MemberDeclBlock></StructDecl><StructDecl><DeclModifier>
@@ -177,4 +190,4 @@ func closure<FunctionSignature><ParameterClause>() </ParameterClause></FunctionS
177190

178191
#if <IdentifierExpr>blah</IdentifierExpr><ElseDirectiveClause>
179192
#else</ElseDirectiveClause>
180-
#endif</IfConfigDecl>
193+
#endif</IfConfigDecl>

test/Syntax/round_trip_parse_gen.swift

+14-1
Original file line numberDiff line numberDiff line change
@@ -85,6 +85,19 @@ typealias I = (A & B<C>) -> C & D
8585
@objc private typealias T<a,b> = Int
8686
@objc private typealias T<a,b>
8787

88+
class Foo {
89+
let bar: Int
90+
}
91+
92+
class Bar: Foo {
93+
var foo: Int = 42
94+
}
95+
96+
class C<A, B> where A: Foo, B == Bar {}
97+
98+
@available(*, unavailable)
99+
private class C {}
100+
88101
struct foo {
89102
struct foo {
90103
struct foo {
@@ -177,4 +190,4 @@ func closure() {
177190

178191
#if blah
179192
#else
180-
#endif
193+
#endif

utils/gyb_syntax_support/DeclNodes.py

+24
Original file line numberDiff line numberDiff line change
@@ -112,6 +112,30 @@
112112
Child('InheritedTypeCollection', kind='InheritedTypeList'),
113113
]),
114114

115+
# class-declaration -> attributes? access-level-modifier?
116+
# 'class' class-name
117+
# generic-parameter-clause?
118+
# type-inheritance-clause?
119+
# generic-where-clause?
120+
# '{' class-members ''
121+
# class-name -> identifier
122+
Node('ClassDecl', kind='Decl',
123+
children=[
124+
Child('Attributes', kind='AttributeList',
125+
is_optional=True),
126+
Child('AccessLevelModifier', kind='DeclModifier',
127+
is_optional=True),
128+
Child('ClassKeyword', kind='ClassToken'),
129+
Child('Identifier', kind='IdentifierToken'),
130+
Child('GenericParameterClause', kind='GenericParameterClause',
131+
is_optional=True),
132+
Child('InheritanceClause', kind='TypeInheritanceClause',
133+
is_optional=True),
134+
Child('GenericWhereClause', kind='GenericWhereClause',
135+
is_optional=True),
136+
Child('Members', kind='MemberDeclBlock'),
137+
]),
138+
115139
# struct-declaration -> attributes? access-level-modifier?
116140
# 'struct' struct-name
117141
# generic-parameter-clause?

0 commit comments

Comments
 (0)