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

Unified Diff: pkg/front_end/lib/src/fasta/kernel/body_builder.dart

Issue 2691613002: Improve compile-time error handling. (Closed)
Patch Set: Update status and expectations for rasta tests. Created 3 years, 10 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
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

Powered by Google App Engine
This is Rietveld 408576698