OLD | NEW |
1 // Copyright (c) 2015, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2015, 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 // An update to this file must be followed by regenerating the corresponding | 5 // An update to this file must be followed by regenerating the corresponding |
6 // json, dart2js and analyzer file. Use `publish.dart` in the bin directory. | 6 // json, dart2js and analyzer file. Use `publish.dart` in the bin directory. |
7 // | 7 // |
8 // Every message in this file must have an id. Use `message_id.dart` in the | 8 // Every message in this file must have an id. Use `message_id.dart` in the |
9 // bin directory to generate a fresh one. | 9 // bin directory to generate a fresh one. |
10 | 10 |
(...skipping 82 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
93 /// In particular, we want errors of the same category to share the same | 93 /// In particular, we want errors of the same category to share the same |
94 /// explanation page, and want to disable warnings of the same category | 94 /// explanation page, and want to disable warnings of the same category |
95 /// with just one line. | 95 /// with just one line. |
96 final String id; | 96 final String id; |
97 | 97 |
98 /// The sub-id of the error. | 98 /// The sub-id of the error. |
99 /// | 99 /// |
100 /// This id just needs to be unique within the same [id]. | 100 /// This id just needs to be unique within the same [id]. |
101 final int subId; | 101 final int subId; |
102 | 102 |
103 /// The error sub-id of which this message is a specialization. | 103 /// The error of which this message is a specialization. |
104 /// | 104 /// |
105 /// For example, "Const is not allowed on getters" may be a specialization of | 105 /// For example, "Const is not allowed on getters" may be a specialization of |
106 /// "The 'const' keyword is not allowed here". | 106 /// "The 'const' keyword is not allowed here". |
107 /// | 107 /// |
108 /// Examples of the specialized message, should trigger for the more generic | 108 /// Examples of the specialized message, should trigger for the more generic |
109 /// message, when the platform doesn't support the more specialized message. | 109 /// message, when the platform doesn't support the more specialized message. |
110 final int specializationOf; | 110 /// |
| 111 /// Specializations must have the same error-id (but not sub-id) as the more |
| 112 /// generic message. |
| 113 final String specializationOf; |
111 | 114 |
112 final Category category; | 115 final Category category; |
113 final String template; | 116 final String template; |
114 // The analyzer fills holes positionally (and not named). The following field | 117 // The analyzer fills holes positionally (and not named). The following field |
115 // overrides the order of the holes. | 118 // overrides the order of the holes. |
116 // For example the template "The argument #field in #cls is bad", could have | 119 // For example the template "The argument #field in #cls is bad", could have |
117 // the order `["cls", "field"]', which means that the analyzer would first | 120 // the order `["cls", "field"]', which means that the analyzer would first |
118 // provide the class `cls` and then only `field`. | 121 // provide the class `cls` and then only `field`. |
119 // This list is generally `null`, but when it is provided it must contain all | 122 // This list is generally `null`, but when it is provided it must contain all |
120 // holes. | 123 // holes. |
121 final List<String> templateHoleOrder; | 124 final List<String> templateHoleOrder; |
122 final String howToFix; | 125 final String howToFix; |
123 final List<String> options; | 126 final List<String> options; |
124 final List examples; | 127 final List examples; |
125 final List<Platform> usedBy; | 128 final List<Platform> usedBy; |
126 | 129 |
127 Message( | 130 Message( |
128 {this.id, | 131 {this.id, |
129 this.subId: 0, | 132 this.subId: 0, |
130 this.specializationOf: -1, | 133 this.specializationOf: null, |
131 this.category, | 134 this.category, |
132 this.template, | 135 this.template, |
133 this.templateHoleOrder, | 136 this.templateHoleOrder, |
134 this.howToFix, | 137 this.howToFix, |
135 this.options, | 138 this.options, |
136 this.usedBy: const [], | 139 this.usedBy: const [], |
137 this.examples}); | 140 this.examples}); |
138 } | 141 } |
139 | 142 |
140 String get messagesAsJson { | 143 String get messagesAsJson { |
(...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
197 class C { | 200 class C { |
198 const factory C() {} | 201 const factory C() {} |
199 } | 202 } |
200 | 203 |
201 main() => new C();""" | 204 main() => new C();""" |
202 ]), | 205 ]), |
203 // Const constructors may not have a body. | 206 // Const constructors may not have a body. |
204 'CONST_CONSTRUCTOR_WITH_BODY': new Message( | 207 'CONST_CONSTRUCTOR_WITH_BODY': new Message( |
205 id: 'LGJGHW', | 208 id: 'LGJGHW', |
206 subId: 1, | 209 subId: 1, |
207 specializationOf: 0, | 210 specializationOf: "CONST_CONSTRUCTOR_OR_FACTORY_WITH_BODY", |
208 category: Category.parserError, | 211 category: Category.parserError, |
209 template: "Const constructor can't have a body.", | 212 template: "Const constructor can't have a body.", |
210 howToFix: "Try removing the 'const' keyword or the body.", | 213 howToFix: "Try removing the 'const' keyword or the body.", |
211 usedBy: [ | 214 usedBy: [ |
212 analyzer | 215 analyzer |
213 ], | 216 ], |
214 examples: const [ | 217 examples: const [ |
215 r""" | 218 r""" |
216 class C { | 219 class C { |
217 const C() {} | 220 const C() {} |
218 } | 221 } |
219 | 222 |
220 main() => new C();""" | 223 main() => new C();""" |
221 ]), | 224 ]), |
222 // Const constructor factories may only redirect (and must not have a body). | 225 // Const constructor factories may only redirect (and must not have a body). |
223 'CONST_FACTORY': new Message( | 226 'CONST_FACTORY': new Message( |
224 id: 'LGJGHW', | 227 id: 'LGJGHW', |
225 subId: 2, | 228 subId: 2, |
226 specializationOf: 0, | 229 specializationOf: "CONST_CONSTRUCTOR_OR_FACTORY_WITH_BODY", |
227 category: Category.parserError, | 230 category: Category.parserError, |
228 template: "Only redirecting factory constructors can be declared to " | 231 template: "Only redirecting factory constructors can be declared to " |
229 "be 'const'.", | 232 "be 'const'.", |
230 howToFix: "Try removing the 'const' keyword or replacing the body with " | 233 howToFix: "Try removing the 'const' keyword or replacing the body with " |
231 "'=' followed by a valid target.", | 234 "'=' followed by a valid target.", |
232 usedBy: [ | 235 usedBy: [ |
233 analyzer | 236 analyzer |
234 ], | 237 ], |
235 examples: const [ | 238 examples: const [ |
236 r""" | 239 r""" |
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
284 // "get foo; main(){}", | 287 // "get foo; main(){}", |
285 "set foo; main(){}", | 288 "set foo; main(){}", |
286 "abstract foo; main(){}", | 289 "abstract foo; main(){}", |
287 "static foo; main(){}", | 290 "static foo; main(){}", |
288 "external foo; main(){}" | 291 "external foo; main(){}" |
289 ]), | 292 ]), |
290 | 293 |
291 'CONST_CLASS': new Message( | 294 'CONST_CLASS': new Message( |
292 id: 'GRKIQE', | 295 id: 'GRKIQE', |
293 subId: 2, | 296 subId: 2, |
294 // The specialization could also be 1, but the example below triggers 0. | 297 // The specialization could also be 'EXTRANEOUS_MODIFIER_REPLACE', but the |
295 specializationOf: 0, | 298 // example below triggers 'EXTRANEOUS_MODIFIER'. |
| 299 specializationOf: 'EXTRANEOUS_MODIFIER', |
296 category: Category.parserError, | 300 category: Category.parserError, |
297 template: "Classes can't be declared to be 'const'", | 301 template: "Classes can't be declared to be 'const'", |
298 howToFix: "Try removing the 'const' keyword or moving to the class'" | 302 howToFix: "Try removing the 'const' keyword or moving to the class'" |
299 " constructor(s).", | 303 " constructor(s).", |
300 usedBy: [ | 304 usedBy: [ |
301 analyzer | 305 analyzer |
302 ], | 306 ], |
303 examples: const [ | 307 examples: const [ |
304 r""" | 308 r""" |
305 const class C {} | 309 const class C {} |
306 | 310 |
307 main() => new C(); | 311 main() => new C(); |
308 """ | 312 """ |
309 ]), | 313 ]), |
310 | 314 |
311 'CONST_METHOD': new Message( | 315 'CONST_METHOD': new Message( |
312 id: 'GRKIQE', | 316 id: 'GRKIQE', |
313 subId: 3, | 317 subId: 3, |
314 // The specialization could also be 1, but the example below triggers 0. | 318 // The specialization could also be 'EXTRANEOUS_MODIFIER_REPLACE', but the |
315 specializationOf: 0, | 319 // example below triggers 'EXTRANEOUS_MODIFIER'. |
| 320 specializationOf: 'EXTRANEOUS_MODIFIER', |
316 category: Category.parserError, | 321 category: Category.parserError, |
317 template: "Getters, setters and methods can't be declared to be 'const'", | 322 template: "Getters, setters and methods can't be declared to be 'const'", |
318 howToFix: "Try removing the 'const' keyword.", | 323 howToFix: "Try removing the 'const' keyword.", |
319 usedBy: [ | 324 usedBy: [ |
320 analyzer | 325 analyzer |
321 ], | 326 ], |
322 examples: const [ | 327 examples: const [ |
323 "const int foo() => 499; main() {}", | 328 "const int foo() => 499; main() {}", |
324 "const int get foo => 499; main() {}", | 329 "const int get foo => 499; main() {}", |
325 "const set foo(v) => 499; main() {}", | 330 "const set foo(v) => 499; main() {}", |
326 "class A { const int foo() => 499; } main() { new A(); }", | 331 "class A { const int foo() => 499; } main() { new A(); }", |
327 "class A { const int get foo => 499; } main() { new A(); }", | 332 "class A { const int get foo => 499; } main() { new A(); }", |
328 "class A { const set foo(v) => 499; } main() { new A(); }", | 333 "class A { const set foo(v) => 499; } main() { new A(); }", |
329 ]), | 334 ]), |
330 | 335 |
331 'CONST_ENUM': new Message( | 336 'CONST_ENUM': new Message( |
332 id: 'GRKIQE', | 337 id: 'GRKIQE', |
333 subId: 4, | 338 subId: 4, |
334 // The specialization could also be 1, but the example below triggers 0. | 339 // The specialization could also be 'EXTRANEOUS_MODIFIER_REPLACE', but the |
335 specializationOf: 0, | 340 // example below triggers 'EXTRANEOUS_MODIFIER'. |
| 341 specializationOf: 'EXTRANEOUS_MODIFIER', |
336 category: Category.parserError, | 342 category: Category.parserError, |
337 template: "Enums can't be declared to be 'const'", | 343 template: "Enums can't be declared to be 'const'", |
338 howToFix: "Try removing the 'const' keyword.", | 344 howToFix: "Try removing the 'const' keyword.", |
339 usedBy: [analyzer], | 345 usedBy: [analyzer], |
340 examples: const ["const enum Foo { x } main() {}",]), | 346 examples: const ["const enum Foo { x } main() {}",]), |
341 | 347 |
342 'CONST_TYPEDEF': new Message( | 348 'CONST_TYPEDEF': new Message( |
343 id: 'GRKIQE', | 349 id: 'GRKIQE', |
344 subId: 5, | 350 subId: 5, |
345 // The specialization could also be 1, but the example below triggers 0. | 351 // The specialization could also be 'EXTRANEOUS_MODIFIER_REPLACE', but the |
346 specializationOf: 0, | 352 // example below triggers 'EXTRANEOUS_MODIFIER'. |
| 353 specializationOf: 'EXTRANEOUS_MODIFIER', |
347 category: Category.parserError, | 354 category: Category.parserError, |
348 template: "Type aliases can't be declared to be 'const'", | 355 template: "Type aliases can't be declared to be 'const'", |
349 howToFix: "Try removing the 'const' keyword.", | 356 howToFix: "Try removing the 'const' keyword.", |
350 usedBy: [analyzer], | 357 usedBy: [analyzer], |
351 examples: const ["const typedef void Foo(); main() {}",]), | 358 examples: const ["const typedef void Foo(); main() {}",]), |
352 | 359 |
353 'CONST_AND_FINAL': new Message( | 360 'CONST_AND_FINAL': new Message( |
354 id: 'GRKIQE', | 361 id: 'GRKIQE', |
355 subId: 6, | 362 subId: 6, |
356 // The specialization could also be 1, but the example below triggers 0. | 363 // The specialization could also be 'EXTRANEOUS_MODIFIER_REPLACE', but the |
357 specializationOf: 0, | 364 // example below triggers 'EXTRANEOUS_MODIFIER'. |
| 365 specializationOf: 'EXTRANEOUS_MODIFIER', |
358 category: Category.parserError, | 366 category: Category.parserError, |
359 template: "Members can't be declared to be both 'const' and 'final'", | 367 template: "Members can't be declared to be both 'const' and 'final'", |
360 howToFix: "Try removing either the 'const' or 'final' keyword.", | 368 howToFix: "Try removing either the 'const' or 'final' keyword.", |
361 usedBy: [ | 369 usedBy: [ |
362 analyzer | 370 analyzer |
363 ], | 371 ], |
364 examples: const [ | 372 examples: const [ |
365 "final const int x = 499; main() {}", | 373 "final const int x = 499; main() {}", |
366 "const final int x = 499; main() {}", | 374 "const final int x = 499; main() {}", |
367 "class A { static final const int x = 499; } main() {}", | 375 "class A { static final const int x = 499; } main() {}", |
368 "class A { static const final int x = 499; } main() {}", | 376 "class A { static const final int x = 499; } main() {}", |
369 ]), | 377 ]), |
370 | 378 |
371 'CONST_AND_VAR': new Message( | 379 'CONST_AND_VAR': new Message( |
372 id: 'GRKIQE', | 380 id: 'GRKIQE', |
373 subId: 7, | 381 subId: 7, |
374 // The specialization could also be 1, but the example below triggers 0. | 382 // The specialization could also be 'EXTRANEOUS_MODIFIER_REPLACE', but the |
375 specializationOf: 0, | 383 // example below triggers 'EXTRANEOUS_MODIFIER'. |
| 384 specializationOf: 'EXTRANEOUS_MODIFIER', |
376 category: Category.parserError, | 385 category: Category.parserError, |
377 template: "Members can't be declared to be both 'const' and 'var'", | 386 template: "Members can't be declared to be both 'const' and 'var'", |
378 howToFix: "Try removing either the 'const' or 'var' keyword.", | 387 howToFix: "Try removing either the 'const' or 'var' keyword.", |
379 usedBy: [ | 388 usedBy: [ |
380 analyzer | 389 analyzer |
381 ], | 390 ], |
382 examples: const [ | 391 examples: const [ |
383 "var const x = 499; main() {}", | 392 "var const x = 499; main() {}", |
384 "const var x = 499; main() {}", | 393 "const var x = 499; main() {}", |
385 "class A { var const x = 499; } main() {}", | 394 "class A { var const x = 499; } main() {}", |
(...skipping 91 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
477 """ | 486 """ |
478 foo() async* { return 0; } | 487 foo() async* { return 0; } |
479 main() => foo(); | 488 main() => foo(); |
480 """, | 489 """, |
481 """ | 490 """ |
482 foo() sync* { return 0; } | 491 foo() sync* { return 0; } |
483 main() => foo(); | 492 main() => foo(); |
484 """ | 493 """ |
485 ]), | 494 ]), |
486 }; | 495 }; |
OLD | NEW |