| Index: pkg/front_end/lib/src/fasta/kernel/body_builder.dart
|
| diff --git a/pkg/front_end/lib/src/fasta/kernel/body_builder.dart b/pkg/front_end/lib/src/fasta/kernel/body_builder.dart
|
| index 3fe1858773b1fd0b26d8a42c9eb85be055af76c3..59578cedf592ed68c0ea720ce38745bfcbb6d7c6 100644
|
| --- a/pkg/front_end/lib/src/fasta/kernel/body_builder.dart
|
| +++ b/pkg/front_end/lib/src/fasta/kernel/body_builder.dart
|
| @@ -5,7 +5,12 @@
|
| library fasta.body_builder;
|
|
|
| import '../fasta_codes.dart'
|
| - show FastaMessage, codeExpectedButGot, codeExpectedFunctionBody;
|
| + show
|
| + FastaMessage,
|
| + codeConstFieldWithoutInitializer,
|
| + codeExpectedButGot,
|
| + codeExpectedFunctionBody,
|
| + codeFinalFieldWithoutInitializer;
|
|
|
| import '../parser/parser.dart'
|
| show Assert, FormalParameterType, MemberKind, optional;
|
| @@ -985,6 +990,10 @@ class BodyBuilder extends ScopeListener<JumpTarget> implements BuilderHelper {
|
| scopeLookup(Scope scope, String name, Token token,
|
| {bool isQualified: false, PrefixBuilder prefix}) {
|
| Builder builder = scope.lookup(name, offsetForToken(token), uri);
|
| + if (builder != null && member.isField && builder.isInstanceMember) {
|
| + return new IncompleteError(this, token,
|
| + "Can't access 'this' in a field initializer to read '$name'.");
|
| + }
|
| if (builder == null || (!isInstanceContext && builder.isInstanceMember)) {
|
| Name n = new Name(name, library.library);
|
| if (prefix != null &&
|
| @@ -995,7 +1004,7 @@ class BodyBuilder extends ScopeListener<JumpTarget> implements BuilderHelper {
|
| "Deferred loading isn't implemented yet.", offsetForToken(token));
|
| } else if (!isQualified && isInstanceContext) {
|
| assert(builder == null);
|
| - if (constantExpressionRequired) {
|
| + if (constantExpressionRequired || member.isField) {
|
| return new UnresolvedAccessor(this, n, token);
|
| }
|
| return new ThisPropertyAccessor(this, token, n, null, null);
|
| @@ -1290,8 +1299,6 @@ class BodyBuilder extends ScopeListener<JumpTarget> implements BuilderHelper {
|
| void handleNoFieldInitializer(Token token) {
|
| debugEvent("NoFieldInitializer");
|
| if (constantExpressionRequired) {
|
| - addCompileTimeError(
|
| - token.charOffset, "const field must have initializer.");
|
| // Creating a null value to prevent the Dart VM from crashing.
|
| push(new KernelNullLiteral()..fileOffset = offsetForToken(token));
|
| } else {
|
| @@ -2826,7 +2833,9 @@ class BodyBuilder extends ScopeListener<JumpTarget> implements BuilderHelper {
|
|
|
| @override
|
| void handleRecoverableError(Token token, FastaMessage message) {
|
| - bool silent = hasParserError;
|
| + bool silent = hasParserError ||
|
| + message.code == codeFinalFieldWithoutInitializer ||
|
| + message.code == codeConstFieldWithoutInitializer;
|
| addCompileTimeError(message.charOffset, message.message, silent: silent);
|
| }
|
|
|
|
|