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

Unified Diff: frog/member.dart

Issue 8618006: Warnings for instantiating an abstract type. (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Created 9 years, 1 month 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
« no previous file with comments | « frog/frogsh ('k') | frog/type.dart » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: frog/member.dart
diff --git a/frog/member.dart b/frog/member.dart
index f2481da856da483d5dbecefc5793b10d64831e46..22824d4c326aefe0d1bb378bf4dae678514e7669 100644
--- a/frog/member.dart
+++ b/frog/member.dart
@@ -1005,6 +1005,32 @@ class MethodMember extends Member {
: '${declaringType.jsname}.call($argsString)';
return new Value(target.type, code, node.span);
} else {
+ if (declaringType.isAbstract) {
+ // Warn at the constructor location
+ world.warning('Cannot instantiate abstract class ${declaringType.name}',
+ node.span);
+
+ // Now make a message explaining why the type is abstract.
+
+ // Get abstract members grouped by type
+ var members = groupBy(declaringType.inheritedMembers.getValues().filter(
+ (m) => m.isAbstract), (m) => m.declaringType);
+
+ var msg = new StringBuffer('Type ${declaringType.name} is abstract '
+ + 'because it does not implement the following members');
+
+ var types = members.getKeys();
+ types.sort((x, y) => x.name.compareTo(y.name));
+ for (var type in types) {
+ if (type != types[0]) msg.add(';');
+ msg.add(' from type ${type.name}: ');
+ msg.add(Strings.join(map(members[type], (m) => m.name), ', '));
+ }
+
+ // Warn at the type's location
+ world.warning(msg.toString(), declaringType.span);
+ }
+
var code = (constructorName != '')
? 'new ${declaringType.jsname}.${constructorName}\$ctor($argsString)'
: 'new ${declaringType.jsname}($argsString)';
« no previous file with comments | « frog/frogsh ('k') | frog/type.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698