@@ -2351,8 +2351,17 @@ class Parser {
23512351 reportRecoverableErrorWithToken (
23522352 getOrSet, fasta.templateExtraneousModifier);
23532353 }
2354- return parseFields (beforeStart, externalToken, null , null , lateToken,
2355- varFinalOrConst, beforeType, typeInfo, token.next, true );
2354+ return parseFields (
2355+ beforeStart,
2356+ externalToken,
2357+ null ,
2358+ null ,
2359+ lateToken,
2360+ varFinalOrConst,
2361+ beforeType,
2362+ typeInfo,
2363+ token.next,
2364+ DeclarationKind .TopLevel );
23562365 }
23572366
23582367 Token parseFields (
@@ -2365,7 +2374,7 @@ class Parser {
23652374 Token beforeType,
23662375 TypeInfo typeInfo,
23672376 Token name,
2368- bool isTopLevel ) {
2377+ DeclarationKind kind ) {
23692378 if (externalToken != null ) {
23702379 reportRecoverableError (externalToken, fasta.messageExternalField);
23712380 }
@@ -2388,26 +2397,26 @@ class Parser {
23882397 Token token = typeInfo.parseType (beforeType, this );
23892398 assert (token.next == name);
23902399
2391- IdentifierContext context = isTopLevel
2400+ IdentifierContext context = kind == DeclarationKind . TopLevel
23922401 ? IdentifierContext .topLevelVariableDeclaration
23932402 : IdentifierContext .fieldDeclaration;
23942403 name = ensureIdentifier (token, context);
23952404
23962405 int fieldCount = 1 ;
2397- token = parseFieldInitializerOpt (
2398- name, name, lateToken, varFinalOrConst, isTopLevel );
2406+ token =
2407+ parseFieldInitializerOpt ( name, name, lateToken, varFinalOrConst, kind );
23992408 while (optional (',' , token.next)) {
24002409 name = ensureIdentifier (token.next, context);
24012410 token = parseFieldInitializerOpt (
2402- name, name, lateToken, varFinalOrConst, isTopLevel );
2411+ name, name, lateToken, varFinalOrConst, kind );
24032412 ++ fieldCount;
24042413 }
24052414 Token semicolon = token.next;
24062415 if (optional (';' , semicolon)) {
24072416 token = semicolon;
24082417 } else {
24092418 // Recovery
2410- if (isTopLevel &&
2419+ if (kind == DeclarationKind . TopLevel &&
24112420 beforeType.next.isIdentifier &&
24122421 beforeType.next.lexeme == 'extension' ) {
24132422 // Looks like an extension method
@@ -2423,12 +2432,23 @@ class Parser {
24232432 token = ensureSemicolon (token);
24242433 }
24252434 }
2426- if (isTopLevel) {
2427- listener.endTopLevelFields (staticToken, covariantToken, lateToken,
2428- varFinalOrConst, fieldCount, beforeStart.next, token);
2429- } else {
2430- listener.endFields (staticToken, covariantToken, lateToken,
2431- varFinalOrConst, fieldCount, beforeStart.next, token);
2435+ switch (kind) {
2436+ case DeclarationKind .TopLevel :
2437+ listener.endTopLevelFields (staticToken, covariantToken, lateToken,
2438+ varFinalOrConst, fieldCount, beforeStart.next, token);
2439+ break ;
2440+ case DeclarationKind .Class :
2441+ listener.endClassFields (staticToken, covariantToken, lateToken,
2442+ varFinalOrConst, fieldCount, beforeStart.next, token);
2443+ break ;
2444+ case DeclarationKind .Mixin :
2445+ listener.endMixinFields (staticToken, covariantToken, lateToken,
2446+ varFinalOrConst, fieldCount, beforeStart.next, token);
2447+ break ;
2448+ case DeclarationKind .Extension :
2449+ listener.endExtensionFields (staticToken, covariantToken, lateToken,
2450+ varFinalOrConst, fieldCount, beforeStart.next, token);
2451+ break ;
24322452 }
24332453 return token;
24342454 }
@@ -2484,7 +2504,7 @@ class Parser {
24842504 }
24852505
24862506 Token parseFieldInitializerOpt (Token token, Token name, Token lateToken,
2487- Token varFinalOrConst, bool isTopLevel ) {
2507+ Token varFinalOrConst, DeclarationKind kind ) {
24882508 Token next = token.next;
24892509 if (optional ('=' , next)) {
24902510 Token assignment = next;
@@ -2498,7 +2518,7 @@ class Parser {
24982518 name,
24992519 fasta.templateConstFieldWithoutInitializer
25002520 .withArguments (name.lexeme));
2501- } else if (isTopLevel &&
2521+ } else if (kind == DeclarationKind . TopLevel &&
25022522 optional ("final" , varFinalOrConst) &&
25032523 lateToken == null ) {
25042524 reportRecoverableError (
@@ -3124,7 +3144,7 @@ class Parser {
31243144 token == beforeStart &&
31253145 next.next.isIdentifier)) {
31263146 // Recovery
3127- return recoverFromInvalidClassMember (
3147+ return recoverFromInvalidMember (
31283148 token,
31293149 beforeStart,
31303150 externalToken,
@@ -3134,7 +3154,8 @@ class Parser {
31343154 varFinalOrConst,
31353155 beforeType,
31363156 typeInfo,
3137- getOrSet);
3157+ getOrSet,
3158+ kind);
31383159 }
31393160 } else if (typeInfo == noType && varFinalOrConst == null ) {
31403161 Token next2 = next.next;
@@ -3191,7 +3212,7 @@ class Parser {
31913212 beforeType,
31923213 typeInfo,
31933214 token.next,
3194- false );
3215+ kind );
31953216 }
31963217 listener.endMember ();
31973218 return token;
@@ -6338,7 +6359,7 @@ class Parser {
63386359 /// Recover from finding an invalid class member. The metadata for the member,
63396360 /// if any, has already been parsed (and events have already been generated).
63406361 /// The member was expected to start with the token after [token] .
6341- Token recoverFromInvalidClassMember (
6362+ Token recoverFromInvalidMember (
63426363 Token token,
63436364 Token beforeStart,
63446365 Token externalToken,
@@ -6348,7 +6369,8 @@ class Parser {
63486369 Token varFinalOrConst,
63496370 Token beforeType,
63506371 TypeInfo typeInfo,
6351- Token getOrSet) {
6372+ Token getOrSet,
6373+ DeclarationKind kind) {
63526374 Token next = token.next;
63536375 String value = next.stringValue;
63546376
@@ -6397,7 +6419,7 @@ class Parser {
63976419 beforeType,
63986420 typeInfo,
63996421 token.next,
6400- false );
6422+ kind );
64016423 }
64026424
64036425 listener.endMember ();
0 commit comments