Skip to content

Commit 2f1372b

Browse files
kallentuCommit Queue
authored andcommitted
[analyzer/cfe] Parse final class modifier.
Change-Id: Ia554c4f8f9617cc883a472eeb819aab2fd849077 Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/278090 Reviewed-by: Johnni Winther <[email protected]> Reviewed-by: Konstantin Shcheglov <[email protected]> Commit-Queue: Kallen Tu <[email protected]>
1 parent 6e4c0c2 commit 2f1372b

File tree

344 files changed

+2556
-1698
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

344 files changed

+2556
-1698
lines changed

pkg/_fe_analyzer_shared/lib/src/parser/forwarding_listener.dart

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,7 @@ class ForwardingListener implements Listener {
7575
Token? sealedToken,
7676
Token? baseToken,
7777
Token? interfaceToken,
78+
Token? finalToken,
7879
Token? augmentToken,
7980
Token? mixinToken,
8081
Token name) {
@@ -86,6 +87,7 @@ class ForwardingListener implements Listener {
8687
sealedToken,
8788
baseToken,
8889
interfaceToken,
90+
finalToken,
8991
augmentToken,
9092
mixinToken,
9193
name);
@@ -397,10 +399,16 @@ class ForwardingListener implements Listener {
397399
}
398400

399401
@override
400-
void beginMixinDeclaration(Token? augmentToken, Token? sealedToken,
401-
Token? baseToken, Token? interfaceToken, Token mixinKeyword, Token name) {
402+
void beginMixinDeclaration(
403+
Token? augmentToken,
404+
Token? sealedToken,
405+
Token? baseToken,
406+
Token? interfaceToken,
407+
Token? finalToken,
408+
Token mixinKeyword,
409+
Token name) {
402410
listener?.beginMixinDeclaration(augmentToken, sealedToken, baseToken,
403-
interfaceToken, mixinKeyword, name);
411+
interfaceToken, finalToken, mixinKeyword, name);
404412
}
405413

406414
@override
@@ -417,6 +425,7 @@ class ForwardingListener implements Listener {
417425
Token? sealedToken,
418426
Token? baseToken,
419427
Token? interfaceToken,
428+
Token? finalToken,
420429
Token? augmentToken,
421430
Token? mixinToken,
422431
Token name) {
@@ -428,6 +437,7 @@ class ForwardingListener implements Listener {
428437
sealedToken,
429438
baseToken,
430439
interfaceToken,
440+
finalToken,
431441
augmentToken,
432442
mixinToken,
433443
name);

pkg/_fe_analyzer_shared/lib/src/parser/listener.dart

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -141,6 +141,7 @@ class Listener implements UnescapeErrorListener {
141141
Token? sealedToken,
142142
Token? baseToken,
143143
Token? interfaceToken,
144+
Token? finalToken,
144145
Token? augmentToken,
145146
Token? mixinToken,
146147
Token name) {}
@@ -207,6 +208,7 @@ class Listener implements UnescapeErrorListener {
207208
Token? sealedToken,
208209
Token? baseToken,
209210
Token? interfaceToken,
211+
Token? finalToken,
210212
Token mixinKeyword,
211213
Token name) {}
212214

@@ -794,6 +796,7 @@ class Listener implements UnescapeErrorListener {
794796
Token? sealedToken,
795797
Token? baseToken,
796798
Token? interfaceToken,
799+
Token? finalToken,
797800
Token? augmentToken,
798801
Token? mixinToken,
799802
Token name) {}

pkg/_fe_analyzer_shared/lib/src/parser/modifier_context.dart

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -128,7 +128,6 @@ class ModifierContext {
128128
reportTopLevelModifierError(externalToken!, keyword);
129129
}
130130
reportExtraneousModifier(covariantToken);
131-
reportExtraneousModifier(finalToken);
132131
reportExtraneousModifier(lateToken);
133132
reportExtraneousModifier(requiredToken);
134133
reportExtraneousModifier(staticToken);
@@ -160,7 +159,6 @@ class ModifierContext {
160159
reportTopLevelModifierError(externalToken, keyword);
161160
reportExtraneousModifier(abstractToken);
162161
reportExtraneousModifier(covariantToken);
163-
reportExtraneousModifier(finalToken);
164162
reportExtraneousModifier(lateToken);
165163
reportExtraneousModifier(requiredToken);
166164
reportExtraneousModifier(staticToken);

pkg/_fe_analyzer_shared/lib/src/parser/parser_impl.dart

Lines changed: 22 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -528,19 +528,25 @@ class Parser {
528528
/* sealedToken = */ null,
529529
/* baseToken = */ null,
530530
/* interfaceToken = */ null,
531+
/* finalToken = */ null,
531532
directiveState);
532533
}
533534
Token start = token;
535+
Token? finalToken;
534536
// Skip modifiers to find a top level keyword or identifier
535537
if (next.isModifier) {
536538
if (optional('var', next) ||
537539
optional('late', next) ||
538-
((optional('const', next) || optional('final', next)) &&
539-
// Ignore `const class` and `final class` so that it is reported
540-
// below as an invalid modifier on a class.
540+
(optional('const', next) &&
541+
// Ignore `const class` so that it is reported below as an invalid
542+
// modifier on a class.
541543
!optional('class', next.next!))) {
542544
directiveState?.checkDeclaration();
543545
return parseTopLevelMemberImpl(token);
546+
} else if (optional('final', next) &&
547+
(optional('class', next.next!) || optional('mixin', next.next!))) {
548+
// Take note of the final class modifier while parsing modifiers.
549+
finalToken = next;
544550
}
545551
while (token.next!.isModifier) {
546552
token = token.next!;
@@ -594,6 +600,7 @@ class Parser {
594600
/* sealedToken = */ sealedToken,
595601
/* baseToken = */ baseToken,
596602
/* interfaceToken = */ interfaceToken,
603+
/* finalToken = */ finalToken,
597604
directiveState);
598605
} else if (next.isKeywordOrIdentifier) {
599606
// TODO(danrubel): improve parseTopLevelMember
@@ -634,6 +641,7 @@ class Parser {
634641
Token? sealedToken,
635642
Token? baseToken,
636643
Token? interfaceToken,
644+
Token? finalToken,
637645
DirectiveContext? directiveState) {
638646
assert(keyword.isTopLevelKeyword);
639647
final String? value = keyword.stringValue;
@@ -646,6 +654,7 @@ class Parser {
646654
sealedToken,
647655
baseToken,
648656
interfaceToken,
657+
finalToken,
649658
null,
650659
directiveState);
651660
} else if (identical(value, 'enum')) {
@@ -716,13 +725,14 @@ class Parser {
716725
sealedToken,
717726
baseToken,
718727
null,
728+
null,
719729
keyword,
720730
directiveState);
721731
}
722732
context.parseMixinModifiers(start, keyword);
723733
directiveState?.checkDeclaration();
724734
return parseMixin(context.augmentToken, sealedToken, baseToken,
725-
interfaceToken, keyword);
735+
interfaceToken, finalToken, keyword);
726736
} else if (identical(value, 'extension')) {
727737
context.parseTopLevelKeywordModifiers(start, keyword);
728738
directiveState?.checkDeclaration();
@@ -755,6 +765,7 @@ class Parser {
755765
Token? sealedToken,
756766
Token? baseToken,
757767
Token? interfaceToken,
768+
Token? finalToken,
758769
Token? mixinToken,
759770
DirectiveContext? directiveState) {
760771
directiveState?.checkDeclaration();
@@ -773,6 +784,7 @@ class Parser {
773784
sealedToken,
774785
baseToken,
775786
interfaceToken,
787+
finalToken,
776788
augmentToken,
777789
mixinToken,
778790
classKeyword);
@@ -2534,6 +2546,7 @@ class Parser {
25342546
Token? sealedToken,
25352547
Token? baseToken,
25362548
Token? interfaceToken,
2549+
Token? finalToken,
25372550
Token? augmentToken,
25382551
Token? mixinToken,
25392552
Token classKeyword) {
@@ -2557,6 +2570,7 @@ class Parser {
25572570
sealedToken,
25582571
baseToken,
25592572
interfaceToken,
2573+
finalToken,
25602574
augmentToken,
25612575
mixinToken,
25622576
name);
@@ -2570,6 +2584,7 @@ class Parser {
25702584
sealedToken,
25712585
baseToken,
25722586
interfaceToken,
2587+
finalToken,
25732588
augmentToken,
25742589
mixinToken,
25752590
name);
@@ -2791,10 +2806,10 @@ class Parser {
27912806
/// '{' [ClassMember]* '}'
27922807
/// ;
27932808
///
2794-
/// mixinModifiers: 'sealed' | 'base' | 'interface'
2809+
/// mixinModifiers: 'sealed' | 'base' | 'interface' | 'final'
27952810
/// ```
27962811
Token parseMixin(Token? augmentToken, Token? sealedToken, Token? baseToken,
2797-
Token? interfaceToken, Token mixinKeyword) {
2812+
Token? interfaceToken, Token? finalToken, Token mixinKeyword) {
27982813
assert(optional('mixin', mixinKeyword));
27992814
listener.beginClassOrMixinOrNamedMixinApplicationPrelude(mixinKeyword);
28002815
Token name = ensureIdentifier(
@@ -2803,7 +2818,7 @@ class Parser {
28032818
name, /* inDeclaration = */ true, /* allowsVariance = */ true)
28042819
.parseVariables(name, this);
28052820
listener.beginMixinDeclaration(augmentToken, sealedToken, baseToken,
2806-
interfaceToken, mixinKeyword, name);
2821+
interfaceToken, finalToken, mixinKeyword, name);
28072822
Token token = parseMixinHeaderOpt(headerStart, mixinKeyword);
28082823
if (!optional('{', token.next!)) {
28092824
// Recovery

pkg/analyzer/lib/src/dart/ast/ast.dart

Lines changed: 26 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1823,7 +1823,7 @@ class ChildEntity {
18231823
/// '{' [ClassMember]* '}'
18241824
///
18251825
/// classModifiers ::= 'sealed'
1826-
/// | 'abstract' ('base' | 'interface')?
1826+
/// | 'abstract' ('base' | 'interface' | 'final')?
18271827
/// | 'abstract'? 'base'? 'mixin'
18281828
///
18291829
class ClassDeclarationImpl extends NamedCompilationUnitMemberImpl
@@ -1848,6 +1848,9 @@ class ClassDeclarationImpl extends NamedCompilationUnitMemberImpl
18481848
/// The 'interface' keyword, or `null` if the keyword was absent.
18491849
final Token? interfaceKeyword;
18501850

1851+
/// The 'final' keyword, or `null` if the keyword was absent.
1852+
final Token? finalKeyword;
1853+
18511854
/// The 'augment' keyword, or `null` if the keyword was absent.
18521855
final Token? augmentKeyword;
18531856

@@ -1909,6 +1912,7 @@ class ClassDeclarationImpl extends NamedCompilationUnitMemberImpl
19091912
required this.sealedKeyword,
19101913
required this.baseKeyword,
19111914
required this.interfaceKeyword,
1915+
required this.finalKeyword,
19121916
required this.augmentKeyword,
19131917
required this.mixinKeyword,
19141918
required this.classKeyword,
@@ -1956,6 +1960,7 @@ class ClassDeclarationImpl extends NamedCompilationUnitMemberImpl
19561960
sealedKeyword ??
19571961
baseKeyword ??
19581962
interfaceKeyword ??
1963+
finalKeyword ??
19591964
augmentKeyword ??
19601965
mixinKeyword ??
19611966
classKeyword;
@@ -2000,6 +2005,7 @@ class ClassDeclarationImpl extends NamedCompilationUnitMemberImpl
20002005
..addToken('sealedKeyword', sealedKeyword)
20012006
..addToken('baseKeyword', baseKeyword)
20022007
..addToken('interfaceKeyword', interfaceKeyword)
2008+
..addToken('finalKeyword', finalKeyword)
20032009
..addToken('augmentKeyword', augmentKeyword)
20042010
..addToken('mixinKeyword', mixinKeyword)
20052011
..addToken('classKeyword', classKeyword)
@@ -2046,7 +2052,7 @@ abstract class ClassMemberImpl extends DeclarationImpl implements ClassMember {
20462052
/// mixinApplication
20472053
///
20482054
/// classModifiers ::= 'sealed'
2049-
/// | 'abstract' ('base' | 'interface')?
2055+
/// | 'abstract' ('base' | 'interface' | 'final')?
20502056
/// | 'abstract'? 'base'? 'mixin'
20512057
///
20522058
/// mixinApplication ::=
@@ -2086,6 +2092,10 @@ class ClassTypeAliasImpl extends TypeAliasImpl implements ClassTypeAlias {
20862092
/// an interface class.
20872093
final Token? interfaceKeyword;
20882094

2095+
/// The token for the 'final' keyword, or `null` if this is not defining a
2096+
/// final class.
2097+
final Token? finalKeyword;
2098+
20892099
/// The token for the 'augment' keyword, or `null` if this is not defining an
20902100
/// augmentation class.
20912101
final Token? augmentKeyword;
@@ -2126,6 +2136,7 @@ class ClassTypeAliasImpl extends TypeAliasImpl implements ClassTypeAlias {
21262136
required this.sealedKeyword,
21272137
required this.baseKeyword,
21282138
required this.interfaceKeyword,
2139+
required this.finalKeyword,
21292140
required this.augmentKeyword,
21302141
required this.mixinKeyword,
21312142
required NamedTypeImpl superclass,
@@ -2154,6 +2165,7 @@ class ClassTypeAliasImpl extends TypeAliasImpl implements ClassTypeAlias {
21542165
sealedKeyword ??
21552166
baseKeyword ??
21562167
interfaceKeyword ??
2168+
finalKeyword ??
21572169
augmentKeyword ??
21582170
mixinKeyword ??
21592171
typedefKeyword;
@@ -2199,6 +2211,7 @@ class ClassTypeAliasImpl extends TypeAliasImpl implements ClassTypeAlias {
21992211
..addToken('sealedKeyword', sealedKeyword)
22002212
..addToken('baseKeyword', baseKeyword)
22012213
..addToken('interfaceKeyword', interfaceKeyword)
2214+
..addToken('finalKeyword', finalKeyword)
22022215
..addToken('augmentKeyword', augmentKeyword)
22032216
..addToken('mixinKeyword', mixinKeyword)
22042217
..addNode('superclass', superclass)
@@ -9023,7 +9036,7 @@ class MethodInvocationImpl extends InvocationExpressionImpl
90239036
/// [TypeParameterList]? [RequiresClause]? [ImplementsClause]?
90249037
/// '{' [ClassMember]* '}'
90259038
///
9026-
/// mixinModifiers ::= 'sealed' | 'base' | 'interface'
9039+
/// mixinModifiers ::= 'sealed' | 'base' | 'interface' | 'final'
90279040
class MixinDeclarationImpl extends NamedCompilationUnitMemberImpl
90289041
implements MixinDeclaration {
90299042
/// Return the 'augment' keyword, or `null` if the keyword was absent.
@@ -9039,6 +9052,9 @@ class MixinDeclarationImpl extends NamedCompilationUnitMemberImpl
90399052
/// Return the 'interface' keyword, or `null` if the keyword was absent.
90409053
final Token? interfaceKeyword;
90419054

9055+
/// Return the 'final' keyword, or `null` if the keyword was absent.
9056+
final Token? finalKeyword;
9057+
90429058
@override
90439059
final Token mixinKeyword;
90449060

@@ -9082,6 +9098,7 @@ class MixinDeclarationImpl extends NamedCompilationUnitMemberImpl
90829098
required this.sealedKeyword,
90839099
required this.baseKeyword,
90849100
required this.interfaceKeyword,
9101+
required this.finalKeyword,
90859102
required this.mixinKeyword,
90869103
required super.name,
90879104
required TypeParameterListImpl? typeParameters,
@@ -9108,7 +9125,11 @@ class MixinDeclarationImpl extends NamedCompilationUnitMemberImpl
91089125

91099126
@override
91109127
Token get firstTokenAfterCommentAndMetadata {
9111-
return sealedKeyword ?? baseKeyword ?? interfaceKeyword ?? mixinKeyword;
9128+
return sealedKeyword ??
9129+
baseKeyword ??
9130+
interfaceKeyword ??
9131+
finalKeyword ??
9132+
mixinKeyword;
91129133
}
91139134

91149135
@override
@@ -9140,6 +9161,7 @@ class MixinDeclarationImpl extends NamedCompilationUnitMemberImpl
91409161
..addToken('sealedKeyword', sealedKeyword)
91419162
..addToken('baseKeyword', baseKeyword)
91429163
..addToken('interfaceKeyword', interfaceKeyword)
9164+
..addToken('finalKeyword', finalKeyword)
91439165
..addToken('mixinKeyword', mixinKeyword)
91449166
..addToken('name', name)
91459167
..addNode('typeParameters', typeParameters)

0 commit comments

Comments
 (0)