Skip to content

Commit fda8dfc

Browse files
committed
libSyntax: specialize protocol declaration syntax.
1 parent 7d01093 commit fda8dfc

File tree

4 files changed

+39
-7
lines changed

4 files changed

+39
-7
lines changed

lib/Parse/ParseDecl.cpp

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2470,10 +2470,11 @@ Parser::parseDecl(ParseDeclOptions Flags,
24702470
case tok::kw_precedencegroup:
24712471
DeclResult = parseDeclPrecedenceGroup(Flags, Attributes);
24722472
break;
2473-
case tok::kw_protocol:
2473+
case tok::kw_protocol: {
2474+
DeclParsingContext.setCreateSyntax(SyntaxKind::ProtocolDecl);
24742475
DeclResult = parseDeclProtocol(Flags, Attributes);
24752476
break;
2476-
2477+
}
24772478
case tok::kw_func:
24782479
// Collect all modifiers into a modifier list.
24792480
DeclParsingContext.collectNodesInPlace(SyntaxKind::ModifierList);
@@ -5564,6 +5565,7 @@ parseDeclProtocol(ParseDeclOptions Flags, DeclAttributes &Attributes) {
55645565

55655566
// Parse the body.
55665567
{
5568+
SyntaxParsingContext BlockContext(SyntaxContext, SyntaxKind::MemberDeclBlock);
55675569
SourceLoc LBraceLoc;
55685570
SourceLoc RBraceLoc;
55695571
if (parseToken(tok::l_brace, LBraceLoc, diag::expected_lbrace_protocol)) {

test/Syntax/Outputs/round_trip_parse_gen.swift.withkinds

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -90,9 +90,9 @@ struct S<GenericParameterClause><<GenericParameter>A, </GenericParameter><Generi
9090

9191
private </DeclModifier>struct S<GenericParameterClause><<GenericParameter>A, </GenericParameter><GenericParameter>B</GenericParameter>></GenericParameterClause><TypeInheritanceClause>: <InheritedType><SimpleTypeIdentifier>Base </SimpleTypeIdentifier></InheritedType></TypeInheritanceClause><GenericWhereClause>where <ConformanceRequirement><SimpleTypeIdentifier>A</SimpleTypeIdentifier>: <SimpleTypeIdentifier>B </SimpleTypeIdentifier></ConformanceRequirement></GenericWhereClause><MemberDeclBlock>{<StructDecl><DeclModifier>
9292
private </DeclModifier>struct S<TypeInheritanceClause>: <InheritedType><SimpleTypeIdentifier>A</SimpleTypeIdentifier>, </InheritedType><InheritedType><SimpleTypeIdentifier>B </SimpleTypeIdentifier></InheritedType></TypeInheritanceClause><MemberDeclBlock>{}</MemberDeclBlock></StructDecl>
93-
}</MemberDeclBlock></StructDecl>
93+
}</MemberDeclBlock></StructDecl><ProtocolDecl>
9494

95-
protocol P<TypeInheritanceClause>: <InheritedType>class </InheritedType></TypeInheritanceClause>{}<FunctionDecl>
95+
protocol P<TypeInheritanceClause>: <InheritedType>class </InheritedType></TypeInheritanceClause><MemberDeclBlock>{}</MemberDeclBlock></ProtocolDecl><FunctionDecl>
9696

9797
func foo<FunctionSignature>(<FunctionParameter>_ _: <SimpleTypeIdentifier>Int</SimpleTypeIdentifier>,</FunctionParameter><FunctionParameter>
9898
a b: <SimpleTypeIdentifier>Int </SimpleTypeIdentifier>= <SequenceExpr><IntegerLiteralExpr>3 </IntegerLiteralExpr><BinaryOperatorExpr>+ </BinaryOperatorExpr><IntegerLiteralExpr>2</IntegerLiteralExpr></SequenceExpr>,</FunctionParameter><FunctionParameter>
@@ -112,4 +112,11 @@ private </DeclModifier><DeclModifier>static </DeclModifier><DeclModifier>overrid
112112
func rootView<FunctionSignature>() -> <SimpleTypeIdentifier>Label </SimpleTypeIdentifier></FunctionSignature><CodeBlock>{}</CodeBlock></FunctionDecl><FunctionDecl><DeclModifier>
113113
static </DeclModifier>func ==<FunctionSignature>() -> <SimpleTypeIdentifier>bool </SimpleTypeIdentifier></FunctionSignature><CodeBlock>{}</CodeBlock></FunctionDecl><FunctionDecl><DeclModifier>
114114
static </DeclModifier>func !=<GenericParameterClause><<GenericParameter>a, </GenericParameter><GenericParameter>b, </GenericParameter><GenericParameter>c</GenericParameter>></GenericParameterClause><FunctionSignature>() -> <SimpleTypeIdentifier>bool </SimpleTypeIdentifier></FunctionSignature><CodeBlock>{}</CodeBlock></FunctionDecl>
115-
}</MemberDeclBlock></StructDecl>
115+
}</MemberDeclBlock></StructDecl><ProtocolDecl><Attribute>
116+
117+
@objc</Attribute><DeclModifier>
118+
private </DeclModifier>protocol foo <TypeInheritanceClause>: <InheritedType><SimpleTypeIdentifier>bar </SimpleTypeIdentifier></InheritedType></TypeInheritanceClause><GenericWhereClause>where <SameTypeRequirement><SimpleTypeIdentifier>A</SimpleTypeIdentifier>==<SimpleTypeIdentifier>B </SimpleTypeIdentifier></SameTypeRequirement></GenericWhereClause><MemberDeclBlock>{}</MemberDeclBlock></ProtocolDecl><ProtocolDecl>
119+
protocol foo <MemberDeclBlock>{ <FunctionDecl>func foo<FunctionSignature>() </FunctionSignature></FunctionDecl>}</MemberDeclBlock></ProtocolDecl><ProtocolDecl><DeclModifier>
120+
private </DeclModifier>protocol foo<MemberDeclBlock>{}</MemberDeclBlock></ProtocolDecl><ProtocolDecl><Attribute>
121+
@objc</Attribute><DeclModifier>
122+
public </DeclModifier>protocol foo <GenericWhereClause>where <ConformanceRequirement><SimpleTypeIdentifier>A</SimpleTypeIdentifier>:<SimpleTypeIdentifier>B </SimpleTypeIdentifier></ConformanceRequirement></GenericWhereClause><MemberDeclBlock>{}</MemberDeclBlock></ProtocolDecl>

test/Syntax/round_trip_parse_gen.swift

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -112,4 +112,11 @@ private static override func foo<a, b, c>(a b: Int, c: Int) throws -> [Int] wher
112112
func rootView() -> Label {}
113113
static func ==() -> bool {}
114114
static func !=<a, b, c>() -> bool {}
115-
}
115+
}
116+
117+
@objc
118+
private protocol foo : bar where A==B {}
119+
protocol foo { func foo() }
120+
private protocol foo{}
121+
@objc
122+
public protocol foo where A:B {}

utils/gyb_syntax_support/DeclNodes.py

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -121,6 +121,21 @@
121121
Child('Members', kind='MemberDeclBlock'),
122122
]),
123123

124+
Node('ProtocolDecl', kind='Decl',
125+
children=[
126+
Child('Attributes', kind='AttributeList',
127+
is_optional=True),
128+
Child('AccessLevelModifier', kind='DeclModifier',
129+
is_optional=True),
130+
Child('ProtocolKeyword', kind='ProtocolToken'),
131+
Child('Identifier', kind='IdentifierToken'),
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+
124139
Node('MemberDeclBlock', kind='Syntax',
125140
children=[
126141
Child('LeftBrace', kind='LeftBraceToken'),
@@ -221,7 +236,8 @@
221236
Child('Signature', kind='FunctionSignature'),
222237
Child('GenericWhereClause', kind='GenericWhereClause',
223238
is_optional=True),
224-
Child('Body', kind='CodeBlock'),
239+
# the body is not necessary inside a protocol definition
240+
Child('Body', kind='CodeBlock', is_optional=True),
225241
]),
226242

227243
# else-if-directive-clause-list -> else-if-directive-clause

0 commit comments

Comments
 (0)