Chromium Code Reviews| Index: pkg/dart_messages/lib/shared_messages.dart |
| diff --git a/pkg/dart_messages/lib/shared_messages.dart b/pkg/dart_messages/lib/shared_messages.dart |
| index 32d793588d8e39b601960d2ed36226386ba41c8d..6c2ff2251791d3008ad5b5140ddcb7e8a6daf812 100644 |
| --- a/pkg/dart_messages/lib/shared_messages.dart |
| +++ b/pkg/dart_messages/lib/shared_messages.dart |
| @@ -80,15 +80,33 @@ class Category { |
| Category(this.name); |
| } |
| -enum Platform { |
| - dart2js, analyzer, |
| -} |
| +enum Platform { dart2js, analyzer, } |
| const dart2js = Platform.dart2js; |
| const analyzer = Platform.analyzer; |
| class Message { |
| + /// Generic id for this message. |
| + /// |
| + /// This id should be shared by all errors that fall into the same category. |
| + /// In particular, we want errors of the same category to share the same |
| + /// explanation page, and want to disable warnings of the same category |
| + /// with just one line. |
| final String id; |
| + |
| + /// The sub-id of the error. |
| + /// |
| + /// This id just needs to be unique within the same [id]. |
| final int subId; |
| + |
| + /// The error sub-id of which this message is a specialization. |
|
Siggi Cherem (dart-lang)
2016/02/17 18:21:00
by sub-id you mean that the id is the same for bot
floitsch
2016/02/17 19:04:23
I can imagine having different sub-ids here.
For e
|
| + /// |
| + /// For example, "Const is not allowed on getters" may be a specialization of |
| + /// "The 'const' keyword is not allowed here". |
| + /// |
| + /// Examples of the specialized message, should trigger for the more generic |
| + /// message, when the platform doesn't support the more specialized message. |
| + final int specializationOf; |
| + |
| final Category category; |
| final String template; |
| // The analyzer fills holes positionally (and not named). The following field |
| @@ -107,6 +125,7 @@ class Message { |
| Message( |
| {this.id, |
| this.subId: 0, |
| + this.specializationOf: -1, |
| this.category, |
| this.template, |
| this.templateHoleOrder, |
| @@ -162,7 +181,9 @@ final Map<String, Message> MESSAGES = { |
| category: Category.parserError, |
| template: "Const constructor or factory can't have a body.", |
| howToFix: "Remove the 'const' keyword or the body.", |
| - usedBy: [dart2js], |
| + usedBy: [ |
| + dart2js |
| + ], |
| examples: const [ |
| r""" |
| class C { |
| @@ -181,10 +202,13 @@ final Map<String, Message> MESSAGES = { |
| 'CONST_CONSTRUCTOR_WITH_BODY': new Message( |
| id: 'LGJGHW', |
| subId: 1, |
| + specializationOf: 0, |
| category: Category.parserError, |
| template: "Const constructor can't have a body.", |
| howToFix: "Try removing the 'const' keyword or the body.", |
| - usedBy: [analyzer], |
| + usedBy: [ |
| + analyzer |
| + ], |
| examples: const [ |
| r""" |
| class C { |
| @@ -197,12 +221,15 @@ final Map<String, Message> MESSAGES = { |
| 'CONST_FACTORY': new Message( |
| id: 'LGJGHW', |
| subId: 2, |
| + specializationOf: 0, |
| category: Category.parserError, |
| template: "Only redirecting factory constructors can be declared to " |
| "be 'const'.", |
| howToFix: "Try removing the 'const' keyword or replacing the body with " |
| - "'=' followed by a valid target", |
| - usedBy: [analyzer], |
| + "'=' followed by a valid target.", |
| + usedBy: [ |
| + analyzer |
| + ], |
| examples: const [ |
| r""" |
| class C { |
| @@ -211,4 +238,165 @@ final Map<String, Message> MESSAGES = { |
| main() => new C();""" |
| ]), |
| + |
| + 'EXTRANEOUS_MODIFIER': new Message( |
| + id: 'GRKIQE', |
| + subId: 0, |
| + category: Category.parserError, |
| + template: "Can't have modifier '#{modifier}' here.", |
| + howToFix: "Try removing '#{modifier}'.", |
| + usedBy: [ |
| + dart2js |
| + ], |
| + examples: const [ |
| + "var String foo; main(){}", |
| + // "var get foo; main(){}", |
| + "var set foo; main(){}", |
| + "var final foo; main(){}", |
| + "var var foo; main(){}", |
| + "var const foo; main(){}", |
| + "var abstract foo; main(){}", |
| + "var static foo; main(){}", |
| + "var external foo; main(){}", |
| + "get var foo; main(){}", |
| + "set var foo; main(){}", |
| + "final var foo; main(){}", |
| + "var var foo; main(){}", |
| + "const var foo; main(){}", |
| + "abstract var foo; main(){}", |
| + "static var foo; main(){}", |
| + "external var foo; main(){}" |
| + ]), |
| + |
| + 'EXTRANEOUS_MODIFIER_REPLACE': new Message( |
| + id: 'GRKIQE', |
| + subId: 1, |
| + category: Category.parserError, |
| + template: "Can't have modifier '#{modifier}' here.", |
| + howToFix: "Try replacing modifier '#{modifier}' with 'var', 'final', " |
| + "or a type.", |
| + usedBy: [ |
| + dart2js |
| + ], |
| + examples: const [ |
| + // "get foo; main(){}", |
| + "set foo; main(){}", |
| + "abstract foo; main(){}", |
| + "static foo; main(){}", |
| + "external foo; main(){}" |
| + ]), |
| + |
| + 'CONST_CLASS': new Message( |
| + id: 'GRKIQE', |
| + subId: 2, |
| + // The specialization could also be 1, but the example below triggers 0. |
| + specializationOf: 0, |
| + category: Category.parserError, |
| + template: "Classes can't be declared to be 'const'", |
| + howToFix: "Try removing the 'const' keyword or moving to the class'" |
| + " constructor(s).", |
| + usedBy: [ |
| + analyzer |
| + ], |
| + examples: const [ |
| + r""" |
| + const class C {} |
| + |
| + main() => new C(); |
| + """ |
| + ]), |
| + |
| + 'CONST_METHOD': new Message( |
| + id: 'GRKIQE', |
| + subId: 3, |
| + // The specialization could also be 1, but the example below triggers 0. |
| + specializationOf: 0, |
| + category: Category.parserError, |
| + template: "Getters, setters and methods can't be declared to be 'const'", |
| + howToFix: "Try removing the 'const' keyword.", |
| + usedBy: [ |
| + analyzer |
| + ], |
| + examples: const [ |
| + "const int foo() => 499; main() {}", |
| + "const int get foo => 499; main() {}", |
| + "const set foo(v) => 499; main() {}", |
| + "class A { const int foo() => 499; } main() { new A(); }", |
| + "class A { const int get foo => 499; } main() { new A(); }", |
| + "class A { const set foo(v) => 499; } main() { new A(); }", |
| + ]), |
| + |
| + 'CONST_ENUM': new Message( |
| + id: 'GRKIQE', |
| + subId: 4, |
| + // The specialization could also be 1, but the example below triggers 0. |
| + specializationOf: 0, |
| + category: Category.parserError, |
| + template: "Enums can't be declared to be 'const'", |
| + howToFix: "Try removing the 'const' keyword.", |
| + usedBy: [analyzer], |
| + examples: const ["const enum Foo { x } main() {}",]), |
| + |
| + 'CONST_TYPEDEF': new Message( |
| + id: 'GRKIQE', |
| + subId: 5, |
| + // The specialization could also be 1, but the example below triggers 0. |
| + specializationOf: 0, |
| + category: Category.parserError, |
| + template: "Type aliases can't be declared to be 'const'", |
| + howToFix: "Try removing the 'const' keyword.", |
| + usedBy: [analyzer], |
| + examples: const ["const typedef void Foo(); main() {}",]), |
| + |
| + 'CONST_AND_FINAL': new Message( |
| + id: 'GRKIQE', |
| + subId: 6, |
| + // The specialization could also be 1, but the example below triggers 0. |
| + specializationOf: 0, |
| + category: Category.parserError, |
| + template: "Members can't be declared to be both 'const' and 'final'", |
| + howToFix: "Try removing either the 'const' or 'final' keyword.", |
| + usedBy: [ |
| + analyzer |
| + ], |
| + examples: const [ |
| + "final const int x = 499; main() {}", |
| + "const final int x = 499; main() {}", |
| + "class A { static final const int x = 499; } main() {}", |
| + "class A { static const final int x = 499; } main() {}", |
| + ]), |
| + |
| + 'CONST_AND_VAR': new Message( |
| + id: 'GRKIQE', |
| + subId: 7, |
| + // The specialization could also be 1, but the example below triggers 0. |
| + specializationOf: 0, |
| + category: Category.parserError, |
| + template: "Members can't be declared to be both 'const' and 'var'", |
| + howToFix: "Try removing either the 'const' or 'var' keyword.", |
| + usedBy: [ |
| + analyzer |
| + ], |
| + examples: const [ |
| + "var const x = 499; main() {}", |
| + "const var x = 499; main() {}", |
| + "class A { var const x = 499; } main() {}", |
| + "class A { const var x = 499; } main() {}", |
| + ]), |
| + |
| + 'CLASS_IN_CLASS': new Message( |
| + id: 'DOTHQH', |
| + category: Category.parserError, |
| + template: "Classes can't be declared inside other classes.", |
| + howToFix: "Try moving the class to the top-level.", |
| + usedBy: [analyzer], |
| + examples: const ["class A { class B {} } main() {}",]), |
| + |
| + 'CONSTRUCTOR_WITH_RETURN_TYPE': new Message( |
| + id: 'VOJBWY', |
| + category: Category.parserError, |
| + template: "Constructors can't have a return type", |
| + howToFix: "Try removing the return type.", |
| + usedBy: [analyzer], |
| + examples: const ["class A { int A() {} } main() {}",]), |
| }; |