| 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 22 matching lines...) Expand all Loading... |
| 33 | 33 |
| 34 static final staticWarning = new Category("StaticWarning"); | 34 static final staticWarning = new Category("StaticWarning"); |
| 35 | 35 |
| 36 static final hint = new Category("Hint"); | 36 static final hint = new Category("Hint"); |
| 37 | 37 |
| 38 final String name; | 38 final String name; |
| 39 | 39 |
| 40 Category(this.name); | 40 Category(this.name); |
| 41 } | 41 } |
| 42 | 42 |
| 43 enum Platform { dart2js, analyzer, } | 43 enum Platform { |
| 44 dart2js, |
| 45 analyzer, |
| 46 } |
| 44 const dart2js = Platform.dart2js; | 47 const dart2js = Platform.dart2js; |
| 45 const analyzer = Platform.analyzer; | 48 const analyzer = Platform.analyzer; |
| 46 | 49 |
| 47 class Message { | 50 class Message { |
| 48 /// Generic id for this message. | 51 /// Generic id for this message. |
| 49 /// | 52 /// |
| 50 /// This id should be shared by all errors that fall into the same category. | 53 /// This id should be shared by all errors that fall into the same category. |
| 51 /// In particular, we want errors of the same category to share the same | 54 /// In particular, we want errors of the same category to share the same |
| 52 /// explanation page, and want to disable warnings of the same category | 55 /// explanation page, and want to disable warnings of the same category |
| 53 /// with just one line. | 56 /// with just one line. |
| (...skipping 208 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 262 'CONST_ENUM': new Message( | 265 'CONST_ENUM': new Message( |
| 263 id: 'GRKIQE', | 266 id: 'GRKIQE', |
| 264 subId: 4, | 267 subId: 4, |
| 265 // The specialization could also be 'EXTRANEOUS_MODIFIER_REPLACE', but the | 268 // The specialization could also be 'EXTRANEOUS_MODIFIER_REPLACE', but the |
| 266 // example below triggers 'EXTRANEOUS_MODIFIER'. | 269 // example below triggers 'EXTRANEOUS_MODIFIER'. |
| 267 specializationOf: 'EXTRANEOUS_MODIFIER', | 270 specializationOf: 'EXTRANEOUS_MODIFIER', |
| 268 categories: [Category.parserError], | 271 categories: [Category.parserError], |
| 269 template: "Enums can't be declared to be 'const'.", | 272 template: "Enums can't be declared to be 'const'.", |
| 270 howToFix: "Try removing the 'const' keyword.", | 273 howToFix: "Try removing the 'const' keyword.", |
| 271 usedBy: [analyzer], | 274 usedBy: [analyzer], |
| 272 examples: const ["const enum Foo { x } main() {}",]), | 275 examples: const [ |
| 276 "const enum Foo { x } main() {}", |
| 277 ]), |
| 273 | 278 |
| 274 'CONST_TYPEDEF': new Message( | 279 'CONST_TYPEDEF': new Message( |
| 275 id: 'GRKIQE', | 280 id: 'GRKIQE', |
| 276 subId: 5, | 281 subId: 5, |
| 277 // The specialization could also be 'EXTRANEOUS_MODIFIER_REPLACE', but the | 282 // The specialization could also be 'EXTRANEOUS_MODIFIER_REPLACE', but the |
| 278 // example below triggers 'EXTRANEOUS_MODIFIER'. | 283 // example below triggers 'EXTRANEOUS_MODIFIER'. |
| 279 specializationOf: 'EXTRANEOUS_MODIFIER', | 284 specializationOf: 'EXTRANEOUS_MODIFIER', |
| 280 categories: [Category.parserError], | 285 categories: [Category.parserError], |
| 281 template: "Type aliases can't be declared to be 'const'.", | 286 template: "Type aliases can't be declared to be 'const'.", |
| 282 howToFix: "Try removing the 'const' keyword.", | 287 howToFix: "Try removing the 'const' keyword.", |
| 283 usedBy: [analyzer], | 288 usedBy: [analyzer], |
| 284 examples: const ["const typedef void Foo(); main() {}",]), | 289 examples: const [ |
| 290 "const typedef void Foo(); main() {}", |
| 291 ]), |
| 285 | 292 |
| 286 'CONST_AND_FINAL': new Message( | 293 'CONST_AND_FINAL': new Message( |
| 287 id: 'GRKIQE', | 294 id: 'GRKIQE', |
| 288 subId: 6, | 295 subId: 6, |
| 289 // The specialization could also be 'EXTRANEOUS_MODIFIER_REPLACE', but the | 296 // The specialization could also be 'EXTRANEOUS_MODIFIER_REPLACE', but the |
| 290 // example below triggers 'EXTRANEOUS_MODIFIER'. | 297 // example below triggers 'EXTRANEOUS_MODIFIER'. |
| 291 specializationOf: 'EXTRANEOUS_MODIFIER', | 298 specializationOf: 'EXTRANEOUS_MODIFIER', |
| 292 categories: [Category.parserError], | 299 categories: [Category.parserError], |
| 293 template: "Members can't be declared to be both 'const' and 'final'.", | 300 template: "Members can't be declared to be both 'const' and 'final'.", |
| 294 howToFix: "Try removing either the 'const' or 'final' keyword.", | 301 howToFix: "Try removing either the 'const' or 'final' keyword.", |
| (...skipping 23 matching lines...) Expand all Loading... |
| 318 ]), | 325 ]), |
| 319 | 326 |
| 320 'CLASS_IN_CLASS': new Message( | 327 'CLASS_IN_CLASS': new Message( |
| 321 // Dart2js currently reports this as an EXTRANEOUS_MODIFIER error. | 328 // Dart2js currently reports this as an EXTRANEOUS_MODIFIER error. |
| 322 // TODO(floitsch): make dart2js use this error instead. | 329 // TODO(floitsch): make dart2js use this error instead. |
| 323 id: 'DOTHQH', | 330 id: 'DOTHQH', |
| 324 categories: [Category.parserError], | 331 categories: [Category.parserError], |
| 325 template: "Classes can't be declared inside other classes.", | 332 template: "Classes can't be declared inside other classes.", |
| 326 howToFix: "Try moving the class to the top-level.", | 333 howToFix: "Try moving the class to the top-level.", |
| 327 usedBy: [analyzer], | 334 usedBy: [analyzer], |
| 328 examples: const ["class A { class B {} } main() { new A(); }",]), | 335 examples: const [ |
| 336 "class A { class B {} } main() { new A(); }", |
| 337 ]), |
| 329 | 338 |
| 330 'CONSTRUCTOR_WITH_RETURN_TYPE': new Message( | 339 'CONSTRUCTOR_WITH_RETURN_TYPE': new Message( |
| 331 id: 'VOJBWY', | 340 id: 'VOJBWY', |
| 332 categories: [Category.parserError], | 341 categories: [Category.parserError], |
| 333 template: "Constructors can't have a return type.", | 342 template: "Constructors can't have a return type.", |
| 334 howToFix: "Try removing the return type.", | 343 howToFix: "Try removing the return type.", |
| 335 usedBy: [analyzer, dart2js], | 344 usedBy: [analyzer, dart2js], |
| 336 examples: const ["class A { int A() {} } main() { new A(); }",]), | 345 examples: const [ |
| 346 "class A { int A() {} } main() { new A(); }", |
| 347 ]), |
| 337 | 348 |
| 338 'MISSING_EXPRESSION_IN_THROW': new Message( | 349 'MISSING_EXPRESSION_IN_THROW': new Message( |
| 339 id: 'FTGGMJ', | 350 id: 'FTGGMJ', |
| 340 subId: 0, | 351 subId: 0, |
| 341 categories: [Category.parserError], | 352 categories: [Category.parserError], |
| 342 template: "Missing expression after 'throw'.", | 353 template: "Missing expression after 'throw'.", |
| 343 howToFix: "Did you mean 'rethrow'?", | 354 howToFix: "Did you mean 'rethrow'?", |
| 344 usedBy: [analyzer, dart2js], | 355 usedBy: [analyzer, dart2js], |
| 345 examples: const [ | 356 examples: const [ |
| 346 'main() { throw; }', | 357 'main() { throw; }', |
| (...skipping 223 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 570 enum E { ONE } | 581 enum E { ONE } |
| 571 E e() { return E.TWO; } | 582 E e() { return E.TWO; } |
| 572 main() { e(); } | 583 main() { e(); } |
| 573 """ | 584 """ |
| 574 ]), | 585 ]), |
| 575 | 586 |
| 576 'UNDEFINED_INSTANCE_GETTER_BUT_SETTER': new Message( | 587 'UNDEFINED_INSTANCE_GETTER_BUT_SETTER': new Message( |
| 577 id: 'ERUSKD', | 588 id: 'ERUSKD', |
| 578 subId: 5, | 589 subId: 5, |
| 579 specializationOf: 'UNDEFINED_GETTER', | 590 specializationOf: 'UNDEFINED_GETTER', |
| 580 categories: [Category.staticTypeWarning,], | 591 categories: [ |
| 592 Category.staticTypeWarning, |
| 593 ], |
| 581 template: "The setter '#{memberName}' in class '#{className}' can" | 594 template: "The setter '#{memberName}' in class '#{className}' can" |
| 582 " not be used as a getter.", | 595 " not be used as a getter.", |
| 583 usedBy: [dart2js], | 596 usedBy: [dart2js], |
| 584 examples: const ["class A { set x(y) {} } main() { new A().x; }",]), | 597 examples: const [ |
| 598 "class A { set x(y) {} } main() { new A().x; }", |
| 599 ]), |
| 585 | 600 |
| 586 /** | 601 /** |
| 587 * 12.18 Assignment: Evaluation of an assignment of the form | 602 * 12.18 Assignment: Evaluation of an assignment of the form |
| 588 * <i>e<sub>1</sub></i>[<i>e<sub>2</sub></i>] = <i>e<sub>3</sub></i> is | 603 * <i>e<sub>1</sub></i>[<i>e<sub>2</sub></i>] = <i>e<sub>3</sub></i> is |
| 589 * equivalent to the evaluation of the expression (a, i, e){a.[]=(i, e); | 604 * equivalent to the evaluation of the expression (a, i, e){a.[]=(i, e); |
| 590 * return e;} (<i>e<sub>1</sub></i>, <i>e<sub>2</sub></i>, | 605 * return e;} (<i>e<sub>1</sub></i>, <i>e<sub>2</sub></i>, |
| 591 * <i>e<sub>2</sub></i>). | 606 * <i>e<sub>2</sub></i>). |
| 592 * | 607 * |
| 593 * 12.29 Assignable Expressions: An assignable expression of the form | 608 * 12.29 Assignable Expressions: An assignable expression of the form |
| 594 * <i>e<sub>1</sub></i>[<i>e<sub>2</sub></i>] is evaluated as a method | 609 * <i>e<sub>1</sub></i>[<i>e<sub>2</sub></i>] is evaluated as a method |
| 595 * invocation of the operator method [] on <i>e<sub>1</sub></i> with argument | 610 * invocation of the operator method [] on <i>e<sub>1</sub></i> with argument |
| 596 * <i>e<sub>2</sub></i>. | 611 * <i>e<sub>2</sub></i>. |
| 597 * | 612 * |
| 598 * 12.15.1 Ordinary Invocation: Let <i>T</i> be the static type of <i>o</i>. | 613 * 12.15.1 Ordinary Invocation: Let <i>T</i> be the static type of <i>o</i>. |
| 599 * It is a static type warning if <i>T</i> does not have an accessible | 614 * It is a static type warning if <i>T</i> does not have an accessible |
| 600 * instance member named <i>m</i>. | 615 * instance member named <i>m</i>. |
| 601 */ | 616 */ |
| 602 'UNDEFINED_OPERATOR': new Message( | 617 'UNDEFINED_OPERATOR': new Message( |
| 603 id: 'ERUSKD', | 618 id: 'ERUSKD', |
| 604 subId: 6, | 619 subId: 6, |
| 605 categories: [Category.staticTypeWarning, Category.hint], | 620 categories: [Category.staticTypeWarning, Category.hint], |
| 606 template: "The operator '#{memberName}' is not defined for the " | 621 template: "The operator '#{memberName}' is not defined for the " |
| 607 "class '#{className}'.", | 622 "class '#{className}'.", |
| 608 usedBy: [dart2js, analyzer], | 623 usedBy: [dart2js, analyzer], |
| 609 examples: const ["class A {} main() { new A() + 3; }",]), | 624 examples: const [ |
| 625 "class A {} main() { new A() + 3; }", |
| 626 ]), |
| 610 | 627 |
| 611 /** | 628 /** |
| 612 * 12.18 Assignment: Let <i>T</i> be the static type of <i>e<sub>1</sub></i>. | 629 * 12.18 Assignment: Let <i>T</i> be the static type of <i>e<sub>1</sub></i>. |
| 613 * It is a static type warning if <i>T</i> does not have an accessible | 630 * It is a static type warning if <i>T</i> does not have an accessible |
| 614 * instance setter named <i>v=</i>. | 631 * instance setter named <i>v=</i>. |
| 615 * | 632 * |
| 616 * 12.18 Assignment: It is as static warning if an assignment of the form | 633 * 12.18 Assignment: It is as static warning if an assignment of the form |
| 617 * <i>v = e</i> occurs inside a top level or static function (be it function, | 634 * <i>v = e</i> occurs inside a top level or static function (be it function, |
| 618 * method, getter, or setter) or variable initializer and there is no | 635 * method, getter, or setter) or variable initializer and there is no |
| 619 * declaration <i>d</i> with name <i>v=</i> in the lexical scope enclosing the | 636 * declaration <i>d</i> with name <i>v=</i> in the lexical scope enclosing the |
| 620 * assignment. | 637 * assignment. |
| 621 * | 638 * |
| 622 * 12.18 Assignment: It is a static warning if there is no class <i>C</i> in | 639 * 12.18 Assignment: It is a static warning if there is no class <i>C</i> in |
| 623 * the enclosing lexical scope of the assignment, or if <i>C</i> does not | 640 * the enclosing lexical scope of the assignment, or if <i>C</i> does not |
| 624 * declare, implicitly or explicitly, a setter <i>v=</i>. | 641 * declare, implicitly or explicitly, a setter <i>v=</i>. |
| 625 */ | 642 */ |
| 626 'UNDEFINED_SETTER': new Message( | 643 'UNDEFINED_SETTER': new Message( |
| 627 id: 'ERUSKD', | 644 id: 'ERUSKD', |
| 628 subId: 7, | 645 subId: 7, |
| 629 categories: [ | 646 categories: [ |
| 630 Category.staticTypeWarning, | 647 Category.staticTypeWarning, |
| 631 Category.staticWarning, | 648 Category.staticWarning, |
| 632 Category.hint | 649 Category.hint |
| 633 ], | 650 ], |
| 634 template: "The setter '#{memberName}' is not defined for the " | 651 template: "The setter '#{memberName}' is not defined for the " |
| 635 "class '#{className}'.", | 652 "class '#{className}'.", |
| 636 usedBy: [dart2js, analyzer], | 653 usedBy: [dart2js, analyzer], |
| 637 // TODO(eernst): When this.x access is available, add examples here, | 654 // TODO(eernst): When this.x access is available, add examples here, |
| 638 // e.g., "class A { var x; A(this.x) : x = 3; } main() => new A(2);" | 655 // e.g., "class A { var x; A(this.x) : x = 3; } main() => new A(2);" |
| 639 examples: const ["class A {} main() { new A().x = 499; }",]), | 656 examples: const [ |
| 657 "class A {} main() { new A().x = 499; }", |
| 658 ]), |
| 640 | 659 |
| 641 'NO_SUCH_SUPER_MEMBER': new Message( | 660 'NO_SUCH_SUPER_MEMBER': new Message( |
| 642 id: 'ERUSKD', | 661 id: 'ERUSKD', |
| 643 subId: 8, | 662 subId: 8, |
| 644 categories: [Category.staticTypeWarning], | 663 categories: [Category.staticTypeWarning], |
| 645 template: | 664 template: |
| 646 "Can't resolve '#{memberName}' in a superclass of '#{className}'.", | 665 "Can't resolve '#{memberName}' in a superclass of '#{className}'.", |
| 647 usedBy: [dart2js]), | 666 usedBy: [dart2js]), |
| 648 | 667 |
| 649 /** | 668 /** |
| (...skipping 96 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 746 * the enclosing lexical scope of the assignment, or if <i>C</i> does not | 765 * the enclosing lexical scope of the assignment, or if <i>C</i> does not |
| 747 * declare, implicitly or explicitly, a setter <i>v=</i>. | 766 * declare, implicitly or explicitly, a setter <i>v=</i>. |
| 748 | 767 |
| 749 */ | 768 */ |
| 750 'UNDEFINED_SUPER_SETTER': new Message( | 769 'UNDEFINED_SUPER_SETTER': new Message( |
| 751 id: 'ERUSKD', | 770 id: 'ERUSKD', |
| 752 subId: 12, | 771 subId: 12, |
| 753 categories: [Category.staticTypeWarning, Category.staticWarning], | 772 categories: [Category.staticTypeWarning, Category.staticWarning], |
| 754 template: "The setter '#{memberName}' is not defined in a superclass " | 773 template: "The setter '#{memberName}' is not defined in a superclass " |
| 755 "of '#{className}'.", | 774 "of '#{className}'.", |
| 756 usedBy: [analyzer, dart2js,], | 775 usedBy: [ |
| 776 analyzer, |
| 777 dart2js, |
| 778 ], |
| 757 examples: const [ | 779 examples: const [ |
| 758 """ | 780 """ |
| 759 class A {} | 781 class A {} |
| 760 class B extends A { | 782 class B extends A { |
| 761 foo() { super.x = 499; } | 783 foo() { super.x = 499; } |
| 762 } | 784 } |
| 763 main() { new B().foo(); } | 785 main() { new B().foo(); } |
| 764 """, | 786 """, |
| 765 // TODO(floitsch): reenable this test. | 787 // TODO(floitsch): reenable this test. |
| 766 /* | 788 /* |
| (...skipping 18 matching lines...) Expand all Loading... |
| 785 * <i>x<sub>n+1</sub></i> : <i>a<sub>n+1</sub></i>, ..., | 807 * <i>x<sub>n+1</sub></i> : <i>a<sub>n+1</sub></i>, ..., |
| 786 * <i>x<sub>n+k</sub></i> : <i>a<sub>n+k</sub></i>). | 808 * <i>x<sub>n+k</sub></i> : <i>a<sub>n+k</sub></i>). |
| 787 */ | 809 */ |
| 788 'UNDEFINED_FUNCTION': new Message( | 810 'UNDEFINED_FUNCTION': new Message( |
| 789 id: 'ERUSKD', | 811 id: 'ERUSKD', |
| 790 subId: 13, | 812 subId: 13, |
| 791 specializationOf: 'CANNOT_RESOLVE', | 813 specializationOf: 'CANNOT_RESOLVE', |
| 792 categories: [Category.staticTypeWarning], | 814 categories: [Category.staticTypeWarning], |
| 793 template: "The function '#{memberName}' is not defined.", | 815 template: "The function '#{memberName}' is not defined.", |
| 794 usedBy: [analyzer], | 816 usedBy: [analyzer], |
| 795 examples: const ["main() { foo(); }",]), | 817 examples: const [ |
| 818 "main() { foo(); }", |
| 819 ]), |
| 796 | 820 |
| 797 'UNDEFINED_STATIC_GETTER_BUT_SETTER': new Message( | 821 'UNDEFINED_STATIC_GETTER_BUT_SETTER': new Message( |
| 798 id: 'ERUSKD', | 822 id: 'ERUSKD', |
| 799 subId: 14, | 823 subId: 14, |
| 800 specializationOf: 'CANNOT_RESOLVE', | 824 specializationOf: 'CANNOT_RESOLVE', |
| 801 categories: [Category.staticTypeWarning], | 825 categories: [Category.staticTypeWarning], |
| 802 template: "Cannot resolve getter '#{name}'.", | 826 template: "Cannot resolve getter '#{name}'.", |
| 803 usedBy: [dart2js], | 827 usedBy: [dart2js], |
| 804 examples: const ["set foo(x) {} main() { foo; }",]), | 828 examples: const [ |
| 829 "set foo(x) {} main() { foo; }", |
| 830 ]), |
| 805 | 831 |
| 806 'UNDEFINED_STATIC_SETTER_BUT_GETTER': new Message( | 832 'UNDEFINED_STATIC_SETTER_BUT_GETTER': new Message( |
| 807 id: 'ERUSKD', | 833 id: 'ERUSKD', |
| 808 subId: 15, | 834 subId: 15, |
| 809 specializationOf: 'CANNOT_RESOLVE', | 835 specializationOf: 'CANNOT_RESOLVE', |
| 810 categories: [Category.staticTypeWarning], | 836 categories: [Category.staticTypeWarning], |
| 811 template: "Cannot resolve setter '#{name}'.", | 837 template: "Cannot resolve setter '#{name}'.", |
| 812 usedBy: [dart2js], | 838 usedBy: [dart2js], |
| 813 examples: const [ | 839 examples: const [ |
| 814 """ | 840 """ |
| (...skipping 12 matching lines...) Expand all Loading... |
| 827 main() { x = 3; } | 853 main() { x = 3; } |
| 828 """, | 854 """, |
| 829 """ | 855 """ |
| 830 const x = 1; | 856 const x = 1; |
| 831 main() { x = 3; } | 857 main() { x = 3; } |
| 832 """, | 858 """, |
| 833 "get foo => null main() { foo = 5; }", | 859 "get foo => null main() { foo = 5; }", |
| 834 "const foo = 0 main() { foo = 5; }", | 860 "const foo = 0 main() { foo = 5; }", |
| 835 ]), | 861 ]), |
| 836 }; | 862 }; |
| OLD | NEW |