Index: sdk/lib/_internal/compiler/implementation/warnings.dart |
=================================================================== |
--- sdk/lib/_internal/compiler/implementation/warnings.dart (revision 32236) |
+++ sdk/lib/_internal/compiler/implementation/warnings.dart (working copy) |
@@ -68,6 +68,8 @@ |
* 1. what is wrong, 2. why is it wrong, 3. how do I fix it. However, we |
* combine the first two in [template] and the last in [howToFix]. |
*/ |
+// TODO(johnnniwinther): For Infos, consider adding a reference to the |
+// error/warning/hint that they belong to. |
class MessageKind { |
/// Should describe what is wrong and why. |
final String template; |
@@ -868,10 +870,77 @@ |
"Info: This is the instance member that cannot be overridden " |
"by a static member."); |
+ static const MessageKind INSTANCE_STATIC_SAME_NAME = const MessageKind( |
+ "Warning: Instance member '#{memberName}' and static member of " |
+ "superclass '#{className}' have the same name."); |
+ |
+ static const MessageKind INSTANCE_STATIC_SAME_NAME_CONT = const MessageKind( |
+ "Info: This is the static member with the same name."); |
+ |
+ static const MessageKind INVALID_OVERRIDE_METHOD = const MessageKind( |
+ "Warning: The type '#{declaredType}' of method '#{name}' declared in " |
+ "'#{class}' is not a subtype of the overridden method type " |
+ "'#{inheritedType}' inherited from '#{inheritedClass}'."); |
+ |
+ static const MessageKind INVALID_OVERRIDDEN_METHOD = const MessageKind( |
+ "Info: This is the overridden method '#{name}' declared in class " |
+ "'#{class}'."); |
+ |
+ static const MessageKind INVALID_OVERRIDE_GETTER = const MessageKind( |
+ "Warning: The type '#{declaredType}' of getter '#{name}' declared in " |
+ "'#{class}' is not assignable to the type '#{inheritedType}' of the " |
+ "overridden getter inherited from '#{inheritedClass}'."); |
+ |
+ static const MessageKind INVALID_OVERRIDDEN_GETTER = const MessageKind( |
+ "Info: This is the overridden getter '#{name}' declared in class " |
+ "'#{class}'."); |
+ |
+ static const MessageKind INVALID_OVERRIDE_GETTER_WITH_FIELD = |
+ const MessageKind( |
+ "Warning: The type '#{declaredType}' of field '#{name}' declared in " |
+ "'#{class}' is not assignable to the type '#{inheritedType}' of the " |
+ "overridden getter inherited from '#{inheritedClass}'."); |
+ |
+ static const MessageKind INVALID_OVERRIDE_FIELD_WITH_GETTER = |
+ const MessageKind( |
+ "Warning: The type '#{declaredType}' of getter '#{name}' declared in " |
+ "'#{class}' is not assignable to the type '#{inheritedType}' of the " |
+ "overridden field inherited from '#{inheritedClass}'."); |
+ |
+ static const MessageKind INVALID_OVERRIDE_SETTER = const MessageKind( |
+ "Warning: The type '#{declaredType}' of setter '#{name}' declared in " |
+ "'#{class}' is not assignable to the type '#{inheritedType}' of the " |
+ "overridden setter inherited from '#{inheritedClass}'."); |
+ |
+ static const MessageKind INVALID_OVERRIDDEN_SETTER = const MessageKind( |
+ "Info: This is the overridden setter '#{name}' declared in class " |
+ "'#{class}'."); |
+ |
+ static const MessageKind INVALID_OVERRIDE_SETTER_WITH_FIELD = |
+ const MessageKind( |
+ "Warning: The type '#{declaredType}' of field '#{name}' declared in " |
+ "'#{class}' is not assignable to the type '#{inheritedType}' of the " |
+ "overridden setter inherited from '#{inheritedClass}'."); |
+ |
+ static const MessageKind INVALID_OVERRIDE_FIELD_WITH_SETTER = |
+ const MessageKind( |
+ "Warning: The type '#{declaredType}' of setter '#{name}' declared in " |
+ "'#{class}' is not assignable to the type '#{inheritedType}' of the " |
+ "overridden field inherited from '#{inheritedClass}'."); |
+ |
+ static const MessageKind INVALID_OVERRIDE_FIELD = const MessageKind( |
+ "Warning: The type '#{declaredType}' of field '#{name}' declared in " |
+ "'#{class}' is not assignable to the type '#{inheritedType}' of the " |
+ "overridden field inherited from '#{inheritedClass}'."); |
+ |
+ static const MessageKind INVALID_OVERRIDDEN_FIELD = const MessageKind( |
+ "Info: This is the overridden field '#{name}' declared in class " |
+ "'#{class}'."); |
+ |
static const MessageKind CANNOT_OVERRIDE_FIELD_WITH_METHOD = |
const MessageKind( |
- "Error: Method cannot override field '#{memberName}' of " |
- "'#{className}'."); |
+ "Error: Method '#{name}' in '#{class}' can't override field from " |
+ "'#{inheritedClass}'."); |
static const MessageKind CANNOT_OVERRIDE_FIELD_WITH_METHOD_CONT = |
const MessageKind( |
@@ -879,20 +948,31 @@ |
static const MessageKind CANNOT_OVERRIDE_METHOD_WITH_FIELD = |
const MessageKind( |
- "Error: Field cannot override method '#{memberName}' of " |
- "'#{className}'."); |
+ "Error: Field '#{name}' in '#{class}' can't override method from " |
+ "'#{inheritedClass}'."); |
static const MessageKind CANNOT_OVERRIDE_METHOD_WITH_FIELD_CONT = |
const MessageKind( |
"Info: This is the method that cannot be overridden by a field."); |
- static const MessageKind BAD_ARITY_OVERRIDE = const MessageKind( |
- "Error: Cannot override method '#{memberName}' in '#{className}'; " |
- "the parameters do not match."); |
+ static const MessageKind CANNOT_OVERRIDE_GETTER_WITH_METHOD = |
+ const MessageKind( |
+ "Error: Method '#{name}' in '#{class}' can't override getter from " |
+ "'#{inheritedClass}'."); |
- static const MessageKind BAD_ARITY_OVERRIDE_CONT = const MessageKind( |
- "Info: This is the method whose parameters do not match."); |
+ static const MessageKind CANNOT_OVERRIDE_GETTER_WITH_METHOD_CONT = |
+ const MessageKind( |
+ "Info: This is the getter that cannot be overridden by a method."); |
+ static const MessageKind CANNOT_OVERRIDE_METHOD_WITH_GETTER = |
+ const MessageKind( |
+ "Error: Getter '#{name}' in '#{class}' can't override method from " |
+ "'#{inheritedClass}'."); |
+ |
+ static const MessageKind CANNOT_OVERRIDE_METHOD_WITH_GETTER_CONT = |
+ const MessageKind( |
+ "Info: This is the method that cannot be overridden by a getter."); |
+ |
static const MessageKind MISSING_FORMALS = const MessageKind( |
"Error: Formal parameters are missing."); |
@@ -1407,22 +1487,105 @@ |
howToFix: "Consider deleting it.", |
examples: const ["deadCode() {} main() {}"]); |
- static const MessageKind UNIMPLEMENTED_METHOD = const MessageKind( |
- "Warning: '#{class_name}' doesn't implement '#{member_name}'.", |
- howToFix: "Try adding an implementation of '#{member_name}'.", |
+ static const MessageKind ABSTRACT_METHOD = const MessageKind( |
+ "Warning: The method '#{name}' has no implementation in " |
+ "class '#{class}'.", |
+ howToFix: "Try adding a body to '#{name}' or declaring " |
+ "'#{class}' to be 'abstract'.", |
examples: const [""" |
+class Class { |
+ method(); |
+} |
+main() => new Class(); |
+"""]); |
+ |
+ static const MessageKind ABSTRACT_GETTER = const MessageKind( |
+ "Warning: The getter '#{name}' has no implementation in " |
+ "class '#{class}'.", |
+ howToFix: "Try adding a body to '#{name}' or declaring " |
+ "'#{class}' to be 'abstract'.", |
+ examples: const [""" |
+class Class { |
+ get getter; |
+} |
+main() => new Class(); |
+"""]); |
+ |
+ static const MessageKind ABSTRACT_SETTER = const MessageKind( |
+ "Warning: The setter '#{name}' has no implementation in " |
+ "class '#{class}'.", |
+ howToFix: "Try adding a body to '#{name}' or declaring " |
+ "'#{class}' to be 'abstract'.", |
+ examples: const [""" |
+class Class { |
+ set setter(_); |
+} |
+main() => new Class(); |
+"""]); |
+ |
+ static const MessageKind INHERIT_GETTER_AND_METHOD = const MessageKind( |
+ "Warning: The class '#{class}' can't inherit both getters and methods " |
+ "by the named '#{name}'.", |
+ howToFix: DONT_KNOW_HOW_TO_FIX, |
+ examples: const [""" |
+class A { |
+ get member => null; |
+} |
+class B { |
+ member() {} |
+} |
+class Class implements A, B { |
+} |
+main() => new Class(); |
+"""]); |
+ |
+ static const MessageKind INHERITED_METHOD = const MessageKind( |
+ "Info: The inherited method '#{name}' is declared here in class " |
+ "'#{class}'."); |
+ |
+ static const MessageKind INHERITED_EXPLICIT_GETTER = const MessageKind( |
+ "Info: The inherited getter '#{name}' is declared here in class " |
+ "'#{class}'."); |
+ |
+ static const MessageKind INHERITED_IMPLICIT_GETTER = const MessageKind( |
+ "Info: The inherited getter '#{name}' is implicitly declared by this " |
+ "field in class '#{class}'."); |
+ |
+ static const MessageKind UNIMPLEMENTED_METHOD_ONE = const MessageKind( |
+ "Warning: '#{class}' doesn't implement '#{method}' " |
+ "declared in '#{declarer}'.", |
+ howToFix: "Try adding an implementation of '#{name}' or declaring " |
+ "'#{class}' to be 'abstract'.", |
+ examples: const [""" |
abstract class I { |
m(); |
} |
- |
class C implements I {} |
+main() => new C(); |
+""", """ |
+abstract class I { |
+ m(); |
+} |
+class C extends I {} |
+main() => new C(); |
+"""]); |
-class D implements I { |
- m() {} |
+ static const MessageKind UNIMPLEMENTED_METHOD = const MessageKind( |
+ "Warning: '#{class}' doesn't implement '#{method}'.", |
+ howToFix: "Try adding an implementation of '#{name}' or declaring " |
+ "'#{class}' to be 'abstract'.", |
+ examples: const [""" |
+abstract class I { |
+ m(); |
} |
+abstract class J { |
+ m(); |
+} |
+ |
+class C implements I, J {} |
+ |
main() { |
- new D().m(); |
new C(); |
} |
""", """ |
@@ -1430,18 +1593,120 @@ |
m(); |
} |
-class C extends I {} |
+abstract class J { |
+ m(); |
+} |
-class D extends I { |
- m() {} |
+class C extends I implements J {} |
+ |
+main() { |
+ new C(); |
} |
+"""]); |
+ static const MessageKind UNIMPLEMENTED_METHOD_CONT = const MessageKind( |
+ "Info: The method '#{name}' is declared here in class '#{class}'."); |
+ |
+ static const MessageKind UNIMPLEMENTED_SETTER_ONE = const MessageKind( |
+ "Warning: '#{class}' doesn't implement the setter '#{name}' " |
+ "declared in '#{declarer}'.", |
+ howToFix: "Try adding an implementation of '#{name}' or declaring " |
+ "'#{class}' to be 'abstract'.", |
+ examples: const [""" |
+abstract class I { |
+ set m(_); |
+} |
+class C implements I {} |
+class D implements I { |
+ set m(_) {} |
+} |
main() { |
- new D().m(); |
+ new D().m = 0; |
new C(); |
} |
"""]); |
+ static const MessageKind UNIMPLEMENTED_SETTER = const MessageKind( |
+ "Warning: '#{class}' doesn't implement the setter '#{name}'.", |
+ howToFix: "Try adding an implementation of '#{name}' or declaring " |
+ "'#{class}' to be 'abstract'.", |
+ examples: const [""" |
+abstract class I { |
+ set m(_); |
+} |
+abstract class J { |
+ set m(_); |
+} |
+class C implements I, J {} |
+main() => new C(); |
+""", """ |
+abstract class I { |
+ set m(_); |
+} |
+abstract class J { |
+ set m(_); |
+} |
+class C extends I implements J {} |
+main() => new C(); |
+"""]); |
+ |
+ static const MessageKind UNIMPLEMENTED_EXPLICIT_SETTER = const MessageKind( |
+ "Info: The setter '#{name}' is declared here in class '#{class}'."); |
+ |
+ static const MessageKind UNIMPLEMENTED_IMPLICIT_SETTER = const MessageKind( |
+ "Info: The setter '#{name}' is implicitly declared by this field " |
+ "in class '#{class}'."); |
+ |
+ static const MessageKind UNIMPLEMENTED_GETTER_ONE = const MessageKind( |
+ "Warning: '#{class}' doesn't implement the getter '#{name}' " |
+ "declared in '#{declarer}'.", |
+ howToFix: "Try adding an implementation of '#{name}' or declaring " |
+ "'#{class}' to be 'abstract'.", |
+ examples: const [""" |
+abstract class I { |
+ get m; |
+} |
+class C implements I {} |
+main() => new C(); |
+""", """ |
+abstract class I { |
+ get m; |
+} |
+class C extends I {} |
+main() => new C(); |
+"""]); |
+ |
+ static const MessageKind UNIMPLEMENTED_GETTER = const MessageKind( |
+ "Warning: '#{class}' doesn't implement the getter '#{name}'.", |
+ howToFix: "Try adding an implementation of '#{name}' or declaring " |
+ "'#{class}' to be 'abstract'.", |
+ examples: const [""" |
+abstract class I { |
+ get m; |
+} |
+abstract class J { |
+ get m; |
+} |
+class C implements I, J {} |
+main() => new C(); |
+""", """ |
+abstract class I { |
+ get m; |
+} |
+abstract class J { |
+ get m; |
+} |
+class C extends I implements J {} |
+main() => new C(); |
+"""]); |
+ |
+ static const MessageKind UNIMPLEMENTED_EXPLICIT_GETTER = const MessageKind( |
+ "Info: The getter '#{name}' is declared here in class '#{class}'."); |
+ |
+ static const MessageKind UNIMPLEMENTED_IMPLICIT_GETTER = const MessageKind( |
+ "Info: The getter '#{name}' is implicitly declared by this field " |
+ "in class '#{class}'."); |
+ |
static const MessageKind EQUAL_MAP_ENTRY_KEY = const MessageKind( |
"Warning: An entry with the same key already exists in the map.", |
howToFix: "Try removing the previous entry or changing the key in one " |
@@ -1651,7 +1916,8 @@ |
}); |
assert(invariant( |
CURRENT_ELEMENT_SPANNABLE, |
- !message.contains(new RegExp(r'#\{.+\}')), |
+ kind == MessageKind.GENERIC || |
+ !message.contains(new RegExp(r'#\{.+\}')), |
message: 'Missing arguments in error message: "$message"')); |
if (!terse && kind.hasHowToFix) { |
String howToFix = kind.howToFix; |