Skip to content

Commit 73debb4

Browse files
committed
[Syntax] Factor out the detail for a declaration modifier.
1 parent d7ea96b commit 73debb4

File tree

6 files changed

+39
-27
lines changed

6 files changed

+39
-27
lines changed

lib/Parse/ParseDecl.cpp

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2033,13 +2033,20 @@ static AttrOptionSwitch<R>
20332033
parseSingleAttrOption(Parser &P, SourceLoc Loc, SourceRange &AttrRange,
20342034
StringRef AttrName, DeclAttrKind DK) {
20352035
bool isModifier = DeclAttribute::isDeclModifier(DK);
2036-
if (!P.consumeIf(tok::l_paren)) {
2036+
if (!P.Tok.is(tok::l_paren)) {
20372037
AttrRange = SourceRange(Loc);
20382038
// Create an AttrOptionSwitch with an empty value. The calls on it will
20392039
// decide whether or not that's valid.
20402040
return AttrOptionSwitch<R>(StringRef(), P, Loc, AttrName, isModifier);
20412041
}
20422042

2043+
llvm::Optional<SyntaxParsingContext> ModDetailContext;
2044+
if (DK == DAK_ReferenceOwnership) {
2045+
ModDetailContext.emplace(P.SyntaxContext, SyntaxKind::DeclModifierDetail);
2046+
}
2047+
2048+
P.consumeToken(tok::l_paren);
2049+
20432050
StringRef parsedName = P.Tok.getText();
20442051
if (!P.consumeIf(tok::identifier)) {
20452052
// Once we have an example of a valid option, diagnose this with
@@ -2288,7 +2295,7 @@ bool Parser::parseNewDeclAttribute(DeclAttributes &Attributes, SourceLoc AtLoc,
22882295
.Case("public", AccessLevel::Public)
22892296
.Case("open", AccessLevel::Open);
22902297

2291-
if (!consumeIf(tok::l_paren)) {
2298+
if (!Tok.is(tok::l_paren)) {
22922299
// Normal access control attribute.
22932300
AttrRange = Loc;
22942301
DuplicateAttribute = Attributes.getAttribute<AccessControlAttr>();
@@ -2297,6 +2304,11 @@ bool Parser::parseNewDeclAttribute(DeclAttributes &Attributes, SourceLoc AtLoc,
22972304
break;
22982305
}
22992306

2307+
SyntaxParsingContext ModDetailContext(
2308+
SyntaxContext, SyntaxKind::DeclModifierDetail);
2309+
2310+
consumeToken(tok::l_paren);
2311+
23002312
// Parse the subject.
23012313
if (Tok.isContextualKeyword("set")) {
23022314
consumeToken();

test/Syntax/Inputs/serialize_class_decl.json

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,8 +26,6 @@
2626
"trailingTrivia": " ",
2727
"presence": "Present"
2828
},
29-
null,
30-
null,
3129
null
3230
],
3331
"presence": "Present"

test/Syntax/Inputs/serialize_distributed_actor.json

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -26,8 +26,6 @@
2626
"trailingTrivia": " ",
2727
"presence": "Present"
2828
},
29-
null,
30-
null,
3129
null
3230
],
3331
"presence": "Present"
@@ -92,8 +90,6 @@
9290
"trailingTrivia": " ",
9391
"presence": "Present"
9492
},
95-
null,
96-
null,
9793
null
9894
],
9995
"presence": "Present"

unittests/Syntax/DeclSyntaxTests.cpp

Lines changed: 14 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,8 @@ DeclModifierSyntax getCannedDeclModifier(const RC<SyntaxArena> &Arena) {
1818
auto LParen = Factory.makeLeftParenToken("", "");
1919
auto Set = Factory.makeIdentifier("set", "", "");
2020
auto RParen = Factory.makeRightParenToken("", "");
21-
return Factory.makeDeclModifier(Private, LParen, Set, RParen);
21+
return Factory.makeDeclModifier(
22+
Private, Factory.makeDeclModifierDetail(LParen, Set, RParen));
2223
}
2324

2425
TEST(DeclSyntaxTests, DeclModifierMakeAPIs) {
@@ -45,12 +46,13 @@ TEST(DeclSyntaxTests, DeclModifierGetAPIs) {
4546
auto LParen = Factory.makeLeftParenToken("", "");
4647
auto Set = Factory.makeIdentifier("set", "", "");
4748
auto RParen = Factory.makeRightParenToken("", "");
48-
auto Mod = Factory.makeDeclModifier(Private, LParen, Set, RParen);
49+
auto Mod = Factory.makeDeclModifier(
50+
Private, Factory.makeDeclModifierDetail(LParen, Set, RParen));
4951

5052
ASSERT_EQ(Private.getRaw(), Mod.getName().getRaw());
51-
ASSERT_EQ(LParen.getRaw(), Mod.getDetailLeftParen()->getRaw());
52-
ASSERT_EQ(Set.getRaw(), Mod.getDetail()->getRaw());
53-
ASSERT_EQ(RParen.getRaw(), Mod.getDetailRightParen()->getRaw());
53+
ASSERT_EQ(LParen.getRaw(), Mod.getDetail()->getLeftParen().getRaw());
54+
ASSERT_EQ(Set.getRaw(), Mod.getDetail()->getDetail().getRaw());
55+
ASSERT_EQ(RParen.getRaw(), Mod.getDetail()->getRightParen().getRaw());
5456
}
5557

5658
TEST(DeclSyntaxTests, DeclModifierWithAPIs) {
@@ -65,9 +67,7 @@ TEST(DeclSyntaxTests, DeclModifierWithAPIs) {
6567
llvm::raw_svector_ostream OS(Scratch);
6668
Factory.makeBlankDeclModifier()
6769
.withName(Private)
68-
.withDetailLeftParen(LParen)
69-
.withDetail(Set)
70-
.withDetailRightParen(RParen)
70+
.withDetail(Factory.makeDeclModifierDetail(LParen, Set, RParen))
7171
.print(OS);
7272
ASSERT_EQ(OS.str().str(), "private(set)");
7373
}
@@ -509,11 +509,15 @@ ModifierListSyntax getCannedModifiers(const RC<SyntaxArena> &Arena) {
509509
auto NoArgument = TokenSyntax::missingToken(tok::identifier, "", Arena);
510510
auto NoRParen = TokenSyntax::missingToken(tok::r_paren, ")", Arena);
511511
auto Public =
512-
Factory.makeDeclModifier(PublicID, NoLParen, NoArgument, NoRParen);
512+
Factory.makeDeclModifier(
513+
PublicID,
514+
Factory.makeDeclModifierDetail(NoLParen, NoArgument, NoRParen));
513515

514516
auto StaticKW = Factory.makeStaticKeyword("", " ");
515517
auto Static =
516-
Factory.makeDeclModifier(StaticKW, NoLParen, NoArgument, NoRParen);
518+
Factory.makeDeclModifier(
519+
StaticKW,
520+
Factory.makeDeclModifierDetail(NoLParen, NoArgument, NoRParen));
517521

518522
return Factory.makeBlankModifierList().appending(Public).appending(Static);
519523
}

utils/gyb_syntax_support/DeclNodes.py

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -162,6 +162,14 @@
162162
Child('LineNumber', kind='IntegerLiteralToken'),
163163
]),
164164

165+
Node('DeclModifierDetail', kind='Syntax',
166+
traits=['Parenthesized'],
167+
children=[
168+
Child('LeftParen', kind='LeftParenToken'),
169+
Child('Detail', kind='IdentifierToken'),
170+
Child('RightParen', kind='RightParenToken'),
171+
]),
172+
165173
Node('DeclModifier', kind='Syntax',
166174
children=[
167175
Child('Name', kind='Token', classification='Attribute',
@@ -174,9 +182,7 @@
174182
'actor', 'async', 'distributed', 'isolated',
175183
'nonisolated', '_const', '_local'
176184
]),
177-
Child('DetailLeftParen', kind='LeftParenToken', is_optional=True),
178-
Child('Detail', kind='IdentifierToken', is_optional=True),
179-
Child('DetailRightParen', kind='RightParenToken', is_optional=True),
185+
Child('Detail', kind='DeclModifierDetail', is_optional=True),
180186
]),
181187

182188
Node('InheritedType', kind='Syntax',
@@ -500,11 +506,7 @@
500506
Node('AccessLevelModifier', kind='Syntax',
501507
children=[
502508
Child('Name', kind='IdentifierToken'),
503-
Child('LeftParen', kind='LeftParenToken',
504-
is_optional=True),
505-
Child('Modifier', kind='IdentifierToken',
506-
is_optional=True),
507-
Child('RightParen', kind='RightParenToken',
509+
Child('Modifier', kind='DeclModifierDetail',
508510
is_optional=True),
509511
]),
510512

utils/gyb_syntax_support/NodeSerializationCodes.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -240,7 +240,7 @@
240240
'DifferentiabilityParams': 235,
241241
'DifferentiabilityParamList': 236,
242242
'DifferentiabilityParam': 237,
243-
# removed: 'DifferentiableAttributeFuncSpecifier': 238,
243+
'DeclModifierDetail': 238,
244244
'FunctionDeclName': 239,
245245
'PoundFilePathExpr': 240,
246246
'DerivativeRegistrationAttributeArguments': 241,

0 commit comments

Comments
 (0)