Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(416)

Unified Diff: pkg/front_end/lib/src/fasta/parser/parser.dart

Issue 2929383002: Various semantic checks on field initializers. (Closed)
Patch Set: Created 3 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « pkg/front_end/lib/src/fasta/kernel/body_builder.dart ('k') | pkg/front_end/messages.yaml » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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;
« no previous file with comments | « pkg/front_end/lib/src/fasta/kernel/body_builder.dart ('k') | pkg/front_end/messages.yaml » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698