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

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

Issue 2781493002: Throw AbstractClassInstantiationError on abstract classes. (Closed)
Patch Set: Created 3 years, 9 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 ea4771d823e0373e761f6590219f2a9449ed5f18..8170579211a924826df28ee643e03b5f7b3f868a 100644
--- a/pkg/front_end/lib/src/fasta/kernel/body_builder.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/body_builder.dart
@@ -1682,6 +1682,7 @@ class BodyBuilder extends ScopeListener<JumpTarget> implements BuilderHelper {
{bool isConst: false, int charOffset: -1}) {
List<TypeParameter> typeParameters = target.function.typeParameters;
if (target is Constructor) {
+ assert(!target.enclosingClass.isAbstract);
typeParameters = target.enclosingClass.typeParameters;
}
if (!checkArguments(target.function, arguments, typeParameters)) {
@@ -1775,7 +1776,13 @@ class BodyBuilder extends ScopeListener<JumpTarget> implements BuilderHelper {
// Not found. Reported below.
} else if (b.isConstructor) {
if (type.isAbstract) {
- // TODO(ahe): Generate abstract instantiation error.
+ push(buildMethodInvocation(
+ buildAbstractClassInstantiationError(
+ type.name, nameToken.charOffset),
+ callName,
+ arguments,
+ arguments.fileOffset));
+ return;
} else {
target = b.target;
}
@@ -2352,8 +2359,16 @@ class BodyBuilder extends ScopeListener<JumpTarget> implements BuilderHelper {
String message = formatUnexpected(uri, charOffset, error);
Builder constructor = library.loader.getCompileTimeError();
return new Throw(buildStaticInvocation(constructor.target,
- new Arguments(<Expression>[new StringLiteral(message)]),
- isConst: false)); // TODO(ahe): Make this const.
+ new Arguments(<Expression>[new StringLiteral(message)])));
+ }
+
+ Expression buildAbstractClassInstantiationError(String className,
+ [int charOffset = -1]) {
+ warning("The class '$className' is abstract and can't be instantiated.",
+ charOffset);
+ Builder constructor = library.loader.getAbstractClassInstantiationError();
+ return new Throw(buildStaticInvocation(constructor.target,
+ new Arguments(<Expression>[new StringLiteral(className)])));
}
Statement buildCompileTimeErrorStatement(error, [int charOffset = -1]) {
« no previous file with comments | « no previous file | pkg/front_end/lib/src/fasta/loader.dart » ('j') | pkg/front_end/lib/src/fasta/target_implementation.dart » ('J')

Powered by Google App Engine
This is Rietveld 408576698