Skip to content

Commit 312eb81

Browse files
chloestefantsovaCommit Bot
authored and
Commit Bot
committed
[parser][analyzer][cfe] Add parsing support for enhanced enums
Part of #47453. Change-Id: I3a722cbcca6323b751eb3b2429bb9ffb642972b7 Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/217011 Reviewed-by: Brian Wilkerson <[email protected]> Reviewed-by: Konstantin Shcheglov <[email protected]> Reviewed-by: Johnni Winther <[email protected]> Commit-Queue: Chloe Stefantsova <[email protected]>
1 parent b878f6e commit 312eb81

File tree

227 files changed

+3699
-1523
lines changed

Some content is hidden

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

227 files changed

+3699
-1523
lines changed

pkg/_fe_analyzer_shared/lib/src/messages/codes_generated.dart

+21
Original file line numberDiff line numberDiff line change
@@ -2767,6 +2767,16 @@ const MessageCode messageEnumDeclarationEmpty = const MessageCode(
27672767
analyzerCodes: <String>["EMPTY_ENUM_BODY"],
27682768
problemMessage: r"""An enum declaration can't be empty.""");
27692769

2770+
// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
2771+
const Code<Null> codeEnumDeclaresFactory = messageEnumDeclaresFactory;
2772+
2773+
// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
2774+
const MessageCode messageEnumDeclaresFactory = const MessageCode(
2775+
"EnumDeclaresFactory",
2776+
problemMessage: r"""Enums can't declare factory constructors.""",
2777+
correctionMessage:
2778+
r"""Try removing the factory constructor declaration.""");
2779+
27702780
// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
27712781
const Code<Null> codeEnumInClass = messageEnumInClass;
27722782

@@ -5660,6 +5670,17 @@ Message _withArgumentsInternalProblemNotFoundIn(String name, String name2) {
56605670
arguments: {'name': name, 'name2': name2});
56615671
}
56625672

5673+
// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
5674+
const Code<Null> codeInternalProblemOmittedTypeNameInConstructorReference =
5675+
messageInternalProblemOmittedTypeNameInConstructorReference;
5676+
5677+
// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
5678+
const MessageCode messageInternalProblemOmittedTypeNameInConstructorReference =
5679+
const MessageCode("InternalProblemOmittedTypeNameInConstructorReference",
5680+
severity: Severity.internalProblem,
5681+
problemMessage:
5682+
r"""Unsupported omission of the type name in a constructor reference outside of an enum element declaration.""");
5683+
56635684
// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
56645685
const Code<Null> codeInternalProblemPreviousTokenNotFound =
56655686
messageInternalProblemPreviousTokenNotFound;

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

+3
Original file line numberDiff line numberDiff line change
@@ -14,4 +14,7 @@ enum DeclarationKind {
1414

1515
/// An extension declaration.
1616
Extension,
17+
18+
/// An enum.
19+
Enum,
1720
}

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

+77-5
Original file line numberDiff line numberDiff line change
@@ -636,8 +636,66 @@ class ForwardingListener implements Listener {
636636
}
637637

638638
@override
639-
void endEnum(Token enumKeyword, Token leftBrace, int count) {
640-
listener?.endEnum(enumKeyword, leftBrace, count);
639+
void endEnum(Token enumKeyword, Token leftBrace, int memberCount) {
640+
listener?.endEnum(enumKeyword, leftBrace, memberCount);
641+
}
642+
643+
@override
644+
void endEnumConstructor(Token? getOrSet, Token beginToken, Token beginParam,
645+
Token? beginInitializers, Token endToken) {
646+
listener?.endEnumConstructor(
647+
getOrSet, beginToken, beginParam, beginInitializers, endToken);
648+
}
649+
650+
@override
651+
void handleEnumElement(Token beginToken) {
652+
listener?.handleEnumElement(beginToken);
653+
}
654+
655+
@override
656+
void handleEnumElements(Token elementsEndToken, int elementsCount) {
657+
listener?.handleEnumElements(elementsEndToken, elementsCount);
658+
}
659+
660+
@override
661+
void handleEnumHeader(Token enumKeyword, Token leftBrace) {
662+
listener?.handleEnumHeader(enumKeyword, leftBrace);
663+
}
664+
665+
@override
666+
void endEnumFactoryMethod(
667+
Token beginToken, Token factoryKeyword, Token endToken) {
668+
listener?.endEnumFactoryMethod(beginToken, factoryKeyword, endToken);
669+
}
670+
671+
@override
672+
void endEnumFields(
673+
Token? abstractToken,
674+
Token? externalToken,
675+
Token? staticToken,
676+
Token? covariantToken,
677+
Token? lateToken,
678+
Token? varFinalOrConst,
679+
int count,
680+
Token beginToken,
681+
Token endToken) {
682+
listener?.endClassFields(
683+
abstractToken,
684+
externalToken,
685+
staticToken,
686+
covariantToken,
687+
lateToken,
688+
varFinalOrConst,
689+
count,
690+
beginToken,
691+
endToken);
692+
}
693+
694+
@override
695+
void endEnumMethod(Token? getOrSet, Token beginToken, Token beginParam,
696+
Token? beginInitializers, Token endToken) {
697+
listener?.endEnumMethod(
698+
getOrSet, beginToken, beginParam, beginInitializers, endToken);
641699
}
642700

643701
@override
@@ -1173,9 +1231,13 @@ class ForwardingListener implements Listener {
11731231
}
11741232

11751233
@override
1176-
void handleClassOrMixinImplements(
1177-
Token? implementsKeyword, int interfacesCount) {
1178-
listener?.handleClassOrMixinImplements(implementsKeyword, interfacesCount);
1234+
void handleEnumNoWithClause() {
1235+
listener?.handleEnumNoWithClause();
1236+
}
1237+
1238+
@override
1239+
void handleImplements(Token? implementsKeyword, int interfacesCount) {
1240+
listener?.handleImplements(implementsKeyword, interfacesCount);
11791241
}
11801242

11811243
@override
@@ -1190,6 +1252,11 @@ class ForwardingListener implements Listener {
11901252
listener?.handleClassWithClause(withKeyword);
11911253
}
11921254

1255+
@override
1256+
void handleEnumWithClause(Token withKeyword) {
1257+
listener?.handleEnumWithClause(withKeyword);
1258+
}
1259+
11931260
@override
11941261
void handleCommentReference(
11951262
Token? newKeyword, Token? prefix, Token? period, Token token) {
@@ -1547,6 +1614,11 @@ class ForwardingListener implements Listener {
15471614
listener?.handleNoTypeArguments(token);
15481615
}
15491616

1617+
@override
1618+
void handleNoTypeNameInConstructorReference(Token token) {
1619+
listener?.handleNoTypeNameInConstructorReference(token);
1620+
}
1621+
15501622
@override
15511623
void handleNoTypeVariables(Token token) {
15521624
listener?.handleNoTypeVariables(token);

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

+107-10
Original file line numberDiff line numberDiff line change
@@ -137,12 +137,11 @@ class Listener implements UnescapeErrorListener {
137137
logEvent("ClassExtends");
138138
}
139139

140-
/// Handle an implements clause in a class or mixin declaration.
140+
/// Handle an implements clause in a class, mixin or enum declaration.
141141
/// Substructures:
142142
/// - implemented types
143-
void handleClassOrMixinImplements(
144-
Token? implementsKeyword, int interfacesCount) {
145-
logEvent("ClassImplements");
143+
void handleImplements(Token? implementsKeyword, int interfacesCount) {
144+
logEvent("Implements");
146145
}
147146

148147
/// Handle a show clause in an extension declaration.
@@ -306,12 +305,55 @@ class Listener implements UnescapeErrorListener {
306305
void beginEnum(Token enumKeyword) {}
307306

308307
/// Handle the end of an enum declaration. Substructures:
308+
/// - [memberCount] times:
309+
/// - Enum member
310+
void endEnum(Token enumKeyword, Token leftBrace, int memberCount) {
311+
logEvent("Enum");
312+
}
313+
314+
/// Handle the end of an enum constructor declaration. Substructures:
315+
/// - metadata
316+
/// - return type
317+
/// - method name (identifier, possibly qualified)
318+
/// - type variables
319+
/// - formal parameters
320+
/// - initializers
321+
/// - async marker
322+
/// - body
323+
void endEnumConstructor(Token? getOrSet, Token beginToken, Token beginParam,
324+
Token? beginInitializers, Token endToken) {
325+
// TODO(danrubel): push implementation into subclasses
326+
endClassMethod(
327+
getOrSet, beginToken, beginParam, beginInitializers, endToken);
328+
}
329+
330+
/// Handle the enum elements. Substructures:
331+
/// - [elementsCount] times:
332+
/// - Enum element
333+
void handleEnumElements(Token elementsEndToken, int elementsCount) {
334+
logEvent("EnumElements");
335+
}
336+
337+
/// Handle the header of an enum declaration. Substructures:
309338
/// - Metadata
310339
/// - Enum name (identifier)
311-
/// - [count] times:
312-
/// - Enum value (identifier)
313-
void endEnum(Token enumKeyword, Token leftBrace, int count) {
314-
logEvent("Enum");
340+
/// - type variables
341+
/// - with clause
342+
/// - implemented types
343+
void handleEnumHeader(Token enumKeyword, Token leftBrace) {
344+
logEvent("EnumHeader");
345+
}
346+
347+
/// Handle the enum element. Substructures:
348+
/// - Metadata
349+
/// - Enum value (identifier)
350+
void handleEnumElement(Token beginToken) {
351+
logEvent("EnumElement");
352+
}
353+
354+
void endEnumFactoryMethod(
355+
Token beginToken, Token factoryKeyword, Token endToken) {
356+
endClassFactoryMethod(beginToken, factoryKeyword, endToken);
315357
}
316358

317359
void beginExport(Token token) {}
@@ -448,6 +490,42 @@ class Listener implements UnescapeErrorListener {
448490
lateToken, varFinalOrConst, count, beginToken, endToken);
449491
}
450492

493+
/// Handle the end of an enum field declaration. Substructures:
494+
/// - Metadata
495+
/// - Modifiers
496+
/// - Type
497+
/// - Variable declarations (count times)
498+
///
499+
/// Started by [beginFields].
500+
void endEnumFields(
501+
Token? abstractToken,
502+
Token? externalToken,
503+
Token? staticToken,
504+
Token? covariantToken,
505+
Token? lateToken,
506+
Token? varFinalOrConst,
507+
int count,
508+
Token beginToken,
509+
Token endToken) {
510+
endClassFields(abstractToken, externalToken, staticToken, covariantToken,
511+
lateToken, varFinalOrConst, count, beginToken, endToken);
512+
}
513+
514+
/// Handle the end of an enum method declaration. Substructures:
515+
/// - metadata
516+
/// - return type
517+
/// - method name (identifier, possibly qualified)
518+
/// - type variables
519+
/// - formal parameters
520+
/// - initializers
521+
/// - async marker
522+
/// - body
523+
void endEnumMethod(Token? getOrSet, Token beginToken, Token beginParam,
524+
Token? beginInitializers, Token endToken) {
525+
endClassMethod(
526+
getOrSet, beginToken, beginParam, beginInitializers, endToken);
527+
}
528+
451529
/// Marks that the grammar term `forInitializerStatement` has been parsed and
452530
/// it was an empty statement.
453531
void handleForInitializerEmptyStatement(Token token) {
@@ -609,18 +687,33 @@ class Listener implements UnescapeErrorListener {
609687
logEvent("FunctionTypeAlias");
610688
}
611689

612-
/// Handle the end of a with clause (e.g. "with B, C").
690+
/// Handle the end of a class with clause (e.g. "with B, C").
613691
/// Substructures:
614692
/// - mixin types (TypeList)
615693
void handleClassWithClause(Token withKeyword) {
616694
logEvent("ClassWithClause");
617695
}
618696

619-
/// Handle the absence of a with clause.
697+
/// Handle the absence of a class with clause.
620698
void handleClassNoWithClause() {
621699
logEvent("ClassNoWithClause");
622700
}
623701

702+
/// Handle the end of an enum with clause (e.g. "with B, C").
703+
/// Substructures:
704+
/// - mixin types (TypeList)
705+
///
706+
/// This method is separated from [handleClassWithClause] to simplify
707+
/// handling the different objects in the context.
708+
void handleEnumWithClause(Token withKeyword) {
709+
logEvent("EnumWithClause");
710+
}
711+
712+
/// Handle the absence of an enum with clause.
713+
void handleEnumNoWithClause() {
714+
logEvent("EnumNoWithClause");
715+
}
716+
624717
/// Handle the beginning of a named mixin application.
625718
/// [beginToken] may be the same as [name], or may point to modifiers
626719
/// (or extraneous modifiers in the case of recovery) preceding [name].
@@ -1567,6 +1660,10 @@ class Listener implements UnescapeErrorListener {
15671660
logEvent("NoConstructorReferenceContinuationAfterTypeArguments");
15681661
}
15691662

1663+
void handleNoTypeNameInConstructorReference(Token token) {
1664+
logEvent("NoTypeNameInConstructorReference");
1665+
}
1666+
15701667
void handleNoType(Token lastConsumed) {
15711668
logEvent("NoType");
15721669
}

0 commit comments

Comments
 (0)