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 11d7ae82613d9e57f84dadcf87effa8a43d52b98..4f8e43e44d765f31c0698e5bd6d8b60d9eb84f39 100644 |
--- a/pkg/front_end/lib/src/fasta/kernel/body_builder.dart |
+++ b/pkg/front_end/lib/src/fasta/kernel/body_builder.dart |
@@ -1699,6 +1699,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)) { |
@@ -1792,7 +1793,11 @@ 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(evaluateArgumentsBefore( |
+ arguments, |
+ buildAbstractClassInstantiationError( |
+ type.name, nameToken.charOffset))); |
+ return; |
} else { |
target = b.target; |
} |
@@ -2369,8 +2374,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]) { |
@@ -2424,6 +2437,22 @@ class BodyBuilder extends ScopeListener<JumpTarget> implements BuilderHelper { |
} |
} |
+ Expression evaluateArgumentsBefore( |
+ Arguments arguments, Expression expression) { |
+ if (arguments == null) return expression; |
+ List<Expression> expressions = |
+ new List<Expression>.from(arguments.positional); |
+ for (NamedExpression named in arguments.named) { |
+ expressions.add(named.value); |
+ } |
+ for (Expression argument in expressions.reversed) { |
+ expression = new Let( |
+ new VariableDeclaration.forValue(argument, isFinal: true), |
+ expression); |
+ } |
+ return expression; |
+ } |
+ |
@override |
void debugEvent(String name) { |
// printEvent(name); |