| Index: pkg/front_end/lib/src/fasta/parser/parser.dart
|
| diff --git a/pkg/front_end/lib/src/fasta/parser/parser.dart b/pkg/front_end/lib/src/fasta/parser/parser.dart
|
| index deb86f89dd882089b397436f05b859962a81ff0b..5ac645576724d077fea9a372776fc326cb3c3042 100644
|
| --- a/pkg/front_end/lib/src/fasta/parser/parser.dart
|
| +++ b/pkg/front_end/lib/src/fasta/parser/parser.dart
|
| @@ -19,6 +19,7 @@ import '../fasta_codes.dart'
|
| codeBuiltInIdentifierAsType,
|
| codeBuiltInIdentifierInDeclaration,
|
| codeCatchSyntax,
|
| + codeConstFieldWithoutInitializer,
|
| codeEmptyNamedParameterList,
|
| codeEmptyOptionalParameterList,
|
| codeEncoding,
|
| @@ -35,6 +36,7 @@ import '../fasta_codes.dart'
|
| codeExpectedString,
|
| codeExtraneousModifier,
|
| codeFactoryNotSync,
|
| + codeFinalFieldWithoutInitializer,
|
| codeFunctionTypeDefaultValue,
|
| codeGeneratorReturnsValue,
|
| codeGetterWithFormals,
|
| @@ -1329,6 +1331,15 @@ class Parser {
|
|
|
| Token parseFields(Token start, Link<Token> modifiers, Token type,
|
| Token getOrSet, Token name, bool isTopLevel) {
|
| + Token varFinalOrConst = null;
|
| + for (Token modifier in modifiers) {
|
| + if (optional("var", modifier) ||
|
| + optional("final", modifier) ||
|
| + optional("const", modifier)) {
|
| + varFinalOrConst = modifier;
|
| + break;
|
| + }
|
| + }
|
| Token token = parseModifiers(start,
|
| isTopLevel ? MemberKind.TopLevelField : MemberKind.NonStaticField,
|
| isVariable: true);
|
| @@ -1344,10 +1355,12 @@ class Parser {
|
| token = parseIdentifier(token, context);
|
|
|
| int fieldCount = 1;
|
| - token = parseFieldInitializerOpt(token);
|
| + token = parseFieldInitializerOpt(token, name, varFinalOrConst, isTopLevel);
|
| while (optional(',', token)) {
|
| + name = token.next;
|
| token = parseIdentifier(token.next, context);
|
| - token = parseFieldInitializerOpt(token);
|
| + token =
|
| + parseFieldInitializerOpt(token, name, varFinalOrConst, isTopLevel);
|
| ++fieldCount;
|
| }
|
| Token semicolon = token;
|
| @@ -1559,13 +1572,21 @@ class Parser {
|
| return listener.handleMemberName(const Link<Token>());
|
| }
|
|
|
| - Token parseFieldInitializerOpt(Token token) {
|
| + Token parseFieldInitializerOpt(
|
| + Token token, Token name, Token varFinalOrConst, bool isTopLevel) {
|
| if (optional('=', token)) {
|
| Token assignment = token;
|
| listener.beginFieldInitializer(token);
|
| token = parseExpression(token.next);
|
| listener.endFieldInitializer(assignment, token);
|
| } else {
|
| + if (varFinalOrConst != null) {
|
| + if (optional("const", varFinalOrConst)) {
|
| + reportRecoverableErrorCode(name, codeConstFieldWithoutInitializer);
|
| + } else if (isTopLevel && optional("final", varFinalOrConst)) {
|
| + reportRecoverableErrorCode(name, codeFinalFieldWithoutInitializer);
|
| + }
|
| + }
|
| listener.handleNoFieldInitializer(token);
|
| }
|
| return token;
|
|
|