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

Side by Side 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 unified diff | Download patch
OLDNEW
1 // Copyright (c) 2016, the Dart project authors. Please see the AUTHORS file 1 // Copyright (c) 2016, the Dart project authors. Please see the AUTHORS file
2 // for details. All rights reserved. Use of this source code is governed by a 2 // for details. All rights reserved. Use of this source code is governed by a
3 // BSD-style license that can be found in the LICENSE file. 3 // BSD-style license that can be found in the LICENSE file.
4 4
5 library fasta.body_builder; 5 library fasta.body_builder;
6 6
7 import '../parser/parser.dart' show FormalParameterType, optional; 7 import '../parser/parser.dart' show FormalParameterType, optional;
8 8
9 import '../parser/error_kind.dart' show ErrorKind; 9 import '../parser/error_kind.dart' show ErrorKind;
10 10
(...skipping 1664 matching lines...) Expand 10 before | Expand all | Expand 10 after
1675 push(type); 1675 push(type);
1676 push(typeArguments ?? NullValue.TypeArguments); 1676 push(typeArguments ?? NullValue.TypeArguments);
1677 push(name); 1677 push(name);
1678 } 1678 }
1679 1679
1680 @override 1680 @override
1681 Expression buildStaticInvocation(Member target, Arguments arguments, 1681 Expression buildStaticInvocation(Member target, Arguments arguments,
1682 {bool isConst: false, int charOffset: -1}) { 1682 {bool isConst: false, int charOffset: -1}) {
1683 List<TypeParameter> typeParameters = target.function.typeParameters; 1683 List<TypeParameter> typeParameters = target.function.typeParameters;
1684 if (target is Constructor) { 1684 if (target is Constructor) {
1685 assert(!target.enclosingClass.isAbstract);
1685 typeParameters = target.enclosingClass.typeParameters; 1686 typeParameters = target.enclosingClass.typeParameters;
1686 } 1687 }
1687 if (!checkArguments(target.function, arguments, typeParameters)) { 1688 if (!checkArguments(target.function, arguments, typeParameters)) {
1688 return throwNoSuchMethodError(target.name.name, arguments, charOffset); 1689 return throwNoSuchMethodError(target.name.name, arguments, charOffset);
1689 } 1690 }
1690 if (target is Constructor) { 1691 if (target is Constructor) {
1691 return new ConstructorInvocation(target, arguments) 1692 return new ConstructorInvocation(target, arguments)
1692 ..isConst = isConst 1693 ..isConst = isConst
1693 ..fileOffset = charOffset; 1694 ..fileOffset = charOffset;
1694 } else { 1695 } else {
(...skipping 73 matching lines...) Expand 10 before | Expand all | Expand 10 after
1768 } 1769 }
1769 1770
1770 String errorName; 1771 String errorName;
1771 if (type is ClassBuilder) { 1772 if (type is ClassBuilder) {
1772 Builder b = type.findConstructorOrFactory(name); 1773 Builder b = type.findConstructorOrFactory(name);
1773 Member target; 1774 Member target;
1774 if (b == null) { 1775 if (b == null) {
1775 // Not found. Reported below. 1776 // Not found. Reported below.
1776 } else if (b.isConstructor) { 1777 } else if (b.isConstructor) {
1777 if (type.isAbstract) { 1778 if (type.isAbstract) {
1778 // TODO(ahe): Generate abstract instantiation error. 1779 push(buildMethodInvocation(
1780 buildAbstractClassInstantiationError(
1781 type.name, nameToken.charOffset),
1782 callName,
1783 arguments,
1784 arguments.fileOffset));
1785 return;
1779 } else { 1786 } else {
1780 target = b.target; 1787 target = b.target;
1781 } 1788 }
1782 } else if (b.isFactory) { 1789 } else if (b.isFactory) {
1783 target = getRedirectionTarget(b.target); 1790 target = getRedirectionTarget(b.target);
1784 if (target == null) { 1791 if (target == null) {
1785 push(buildCompileTimeError( 1792 push(buildCompileTimeError(
1786 "Cyclic definition of factory '${name}'.", 1793 "Cyclic definition of factory '${name}'.",
1787 nameToken.charOffset)); 1794 nameToken.charOffset));
1788 return; 1795 return;
(...skipping 556 matching lines...) Expand 10 before | Expand all | Expand 10 after
2345 } 2352 }
2346 return super.handleUnrecoverableError(token, kind, arguments); 2353 return super.handleUnrecoverableError(token, kind, arguments);
2347 } 2354 }
2348 2355
2349 @override 2356 @override
2350 Expression buildCompileTimeError(error, [int charOffset = -1]) { 2357 Expression buildCompileTimeError(error, [int charOffset = -1]) {
2351 addCompileTimeError(charOffset, error); 2358 addCompileTimeError(charOffset, error);
2352 String message = formatUnexpected(uri, charOffset, error); 2359 String message = formatUnexpected(uri, charOffset, error);
2353 Builder constructor = library.loader.getCompileTimeError(); 2360 Builder constructor = library.loader.getCompileTimeError();
2354 return new Throw(buildStaticInvocation(constructor.target, 2361 return new Throw(buildStaticInvocation(constructor.target,
2355 new Arguments(<Expression>[new StringLiteral(message)]), 2362 new Arguments(<Expression>[new StringLiteral(message)])));
2356 isConst: false)); // TODO(ahe): Make this const. 2363 }
2364
2365 Expression buildAbstractClassInstantiationError(String className,
2366 [int charOffset = -1]) {
2367 warning("The class '$className' is abstract and can't be instantiated.",
2368 charOffset);
2369 Builder constructor = library.loader.getAbstractClassInstantiationError();
2370 return new Throw(buildStaticInvocation(constructor.target,
2371 new Arguments(<Expression>[new StringLiteral(className)])));
2357 } 2372 }
2358 2373
2359 Statement buildCompileTimeErrorStatement(error, [int charOffset = -1]) { 2374 Statement buildCompileTimeErrorStatement(error, [int charOffset = -1]) {
2360 return new ExpressionStatement(buildCompileTimeError(error, charOffset)); 2375 return new ExpressionStatement(buildCompileTimeError(error, charOffset));
2361 } 2376 }
2362 2377
2363 @override 2378 @override
2364 Initializer buildCompileTimeErrorIntializer(error, [int charOffset = -1]) { 2379 Initializer buildCompileTimeErrorIntializer(error, [int charOffset = -1]) {
2365 return new LocalInitializer(new VariableDeclaration.forValue( 2380 return new LocalInitializer(new VariableDeclaration.forValue(
2366 buildCompileTimeError(error, charOffset))); 2381 buildCompileTimeError(error, charOffset)));
(...skipping 513 matching lines...) Expand 10 before | Expand all | Expand 10 after
2880 } else if (node is PrefixBuilder) { 2895 } else if (node is PrefixBuilder) {
2881 return node.name; 2896 return node.name;
2882 } else if (node is ThisAccessor) { 2897 } else if (node is ThisAccessor) {
2883 return node.isSuper ? "super" : "this"; 2898 return node.isSuper ? "super" : "this";
2884 } else if (node is FastaAccessor) { 2899 } else if (node is FastaAccessor) {
2885 return node.plainNameForRead; 2900 return node.plainNameForRead;
2886 } else { 2901 } else {
2887 return internalError("Unhandled: ${node.runtimeType}"); 2902 return internalError("Unhandled: ${node.runtimeType}");
2888 } 2903 }
2889 } 2904 }
OLDNEW
« 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