| 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 30cd354438c3cde8ac8db4b352feccaf3a8ee61a..d7fe478b01bd6dbc9bac3bb471cc3810bc164a1c 100644
|
| --- a/pkg/front_end/lib/src/fasta/kernel/body_builder.dart
|
| +++ b/pkg/front_end/lib/src/fasta/kernel/body_builder.dart
|
| @@ -38,9 +38,6 @@ import '../errors.dart' show
|
| InputError,
|
| internalError;
|
|
|
| -import '../errors.dart' as errors show
|
| - inputError;
|
| -
|
| import '../source/scope_listener.dart' show
|
| JumpTargetKind,
|
| NullValue,
|
| @@ -419,7 +416,8 @@ class BodyBuilder extends ScopeListener<JumpTarget> implements BuilderHelper {
|
| if (member is KernelConstructorBuilder) {
|
| member.addInitializer(initializer);
|
| } else {
|
| - inputError("Can't have initializers: ${member.name}", token.charOffset);
|
| + addCompileTimeError(token.charOffset,
|
| + "Can't have initializers: ${member.name}");
|
| }
|
| }
|
|
|
| @@ -441,8 +439,8 @@ class BodyBuilder extends ScopeListener<JumpTarget> implements BuilderHelper {
|
| if (builder is KernelConstructorBuilder) {
|
| if (asyncModifier != AsyncMarker.Sync) {
|
| // TODO(ahe): Change this to a null check.
|
| - inputError("Can't be marked as ${asyncModifier}: ${builder.name}",
|
| - body?.fileOffset);
|
| + addCompileTimeError(body?.fileOffset,
|
| + "Can't be marked as ${asyncModifier}: ${builder.name}");
|
| }
|
| } else if (builder is KernelProcedureBuilder) {
|
| builder.asyncModifier = asyncModifier;
|
| @@ -1168,7 +1166,7 @@ class BodyBuilder extends ScopeListener<JumpTarget> implements BuilderHelper {
|
| var name = pop();
|
| if (name is List) {
|
| if (name.length != 2) {
|
| - return internalError("Unexpected: $name.length");
|
| + internalError("Unexpected: $name.length");
|
| }
|
| var prefix = name[0];
|
| if (prefix is Identifier) {
|
| @@ -1187,9 +1185,10 @@ class BodyBuilder extends ScopeListener<JumpTarget> implements BuilderHelper {
|
| if (builder is PrefixBuilder) {
|
| name = builder.exports[suffix];
|
| } else {
|
| - return inputError(
|
| - "Can't be used as a type: '${debugName(prefix, suffix)}'.",
|
| - beginToken.charOffset);
|
| + push(const DynamicType());
|
| + addCompileTimeError(beginToken.charOffset,
|
| + "Can't be used as a type: '${debugName(prefix, suffix)}'.");
|
| + return;
|
| }
|
| }
|
| if (name is Identifier) {
|
| @@ -1271,8 +1270,9 @@ class BodyBuilder extends ScopeListener<JumpTarget> implements BuilderHelper {
|
| int charOffset = thisKeyword?.charOffset;
|
| if (thisKeyword != null) {
|
| if (!inConstructor) {
|
| - return inputError("'this' parameters can only be used on constructors.",
|
| - thisKeyword.charOffset);
|
| + addCompileTimeError(thisKeyword.charOffset,
|
| + "'this' parameters can only be used on constructors.");
|
| + thisKeyword = null;
|
| }
|
| }
|
| Identifier name = pop();
|
| @@ -1283,10 +1283,14 @@ class BodyBuilder extends ScopeListener<JumpTarget> implements BuilderHelper {
|
| if (!inCatchClause && functionNestingLevel == 0) {
|
| var builder = formalParameterScope.lookup(name.name, charOffset, uri);
|
| if (builder == null) {
|
| - return inputError("'${name.name}' isn't a field in this class.",
|
| - name.fileOffset);
|
| - }
|
| - if (thisKeyword == null) {
|
| + if (thisKeyword == null) {
|
| + internalError("Internal error: formal missing for '${name.name}'");
|
| + } else {
|
| + addCompileTimeError(thisKeyword.charOffset,
|
| + "'${name.name}' isn't a field in this class.");
|
| + thisKeyword = null;
|
| + }
|
| + } else if (thisKeyword == null) {
|
| variable = builder.build();
|
| variable.initializer = name.initializer;
|
| } else if (builder.isField && builder.parent == classBuilder) {
|
| @@ -1299,13 +1303,12 @@ class BodyBuilder extends ScopeListener<JumpTarget> implements BuilderHelper {
|
| variable = new VariableDeclaration(name.name, type: type,
|
| initializer: name.initializer);
|
| } else {
|
| - return inputError("'${name.name}' isn't a field in this class.",
|
| - name.fileOffset);
|
| + addCompileTimeError(name.fileOffset,
|
| + "'${name.name}' isn't a field in this class.");
|
| }
|
| - } else {
|
| - variable = new VariableDeclaration(name.name,
|
| - type: type ?? const DynamicType(), initializer: name.initializer);
|
| }
|
| + variable ??= new VariableDeclaration(name.name,
|
| + type: type ?? const DynamicType(), initializer: name.initializer);
|
| push(variable);
|
| }
|
|
|
| @@ -1852,8 +1855,9 @@ class BodyBuilder extends ScopeListener<JumpTarget> implements BuilderHelper {
|
| new VariableGet(variable), voidContext: true)),
|
| body);
|
| } else {
|
| - throw inputError("Expected lvalue, but got ${lvalue}",
|
| - forToken.next.next.charOffset);
|
| + variable = new VariableDeclaration.forValue(
|
| + buildCompileTimeError("Expected lvalue, but got ${lvalue}",
|
| + forToken.next.next.charOffset));
|
| }
|
| Statement result = new ForInStatement(variable, expression, body,
|
| isAsync: awaitToken != null);
|
| @@ -2236,8 +2240,8 @@ class BodyBuilder extends ScopeListener<JumpTarget> implements BuilderHelper {
|
| push(new Operator(token.stringValue)..fileOffset = token.charOffset);
|
| }
|
|
|
| - dynamic inputError(String message, [int charOffset = -1]) {
|
| - return errors.inputError(uri, charOffset, message);
|
| + dynamic addCompileTimeError(int charOffset, String message) {
|
| + return library.addCompileTimeError(charOffset, message, uri);
|
| }
|
|
|
| @override
|
|
|