| OLD | NEW |
| 1 ## Writing Lints | 1 # Writing Lints |
| 2 | 2 |
| 3 Preliminary notes on writing lints. | 3 Preliminary notes on writing lints. |
| 4 | 4 |
| 5 ## Lint Criteria | 5 ## Lint Criteria |
| 6 | 6 |
| 7 Borrowing heavily from the criteria for [adding new checks to errorprone] | 7 Borrowing heavily from the criteria for [adding new checks to errorprone](https:
//github.com/google/error-prone/wiki/Criteria-for-new-checks), |
| 8 (https://github.com/google/error-prone/wiki/Criteria-for-new-checks), lints shou
ld have the following properties. | 8 lints should have the following properties. |
| 9 | 9 |
| 10 Dart lints: | 10 Dart lints: |
| 11 | 11 |
| 12 * should be easy to understand. The problem should be obvious once the linter po
ints it out. | 12 * should be easy to understand. The problem should be obvious once the linter po
ints it out. |
| 13 * should have a correspondingly easy fix. For example, "Remove this type annotat
ion", or "Delete these braces", not | 13 * should have a correspondingly easy fix. For example, "Remove this type annotat
ion", or "Delete these braces", not |
| 14 "Introduce a new subclass and override methods A, B, and C." | 14 "Introduce a new subclass and override methods A, B, and C." |
| 15 * should have *few* false positives. | 15 * should have *few* false positives. |
| 16 | 16 |
| 17 ## Lint Properties | 17 ## Lint Properties |
| 18 | 18 |
| 19 Every lint has a: | 19 Every lint has a: |
| 20 | 20 |
| 21 **Description.** A short description of the lint, suitable for printing in conso
le output. For example: | 21 **Description.** A short description of the lint, suitable for printing in conso
le output. For example: |
| 22 | 22 |
| 23 ``` | 23 ``` |
| 24 [lint] DO name types using UpperCamelCase. | 24 [lint] DO name types using UpperCamelCase. |
| 25 ``` | 25 ``` |
| 26 | 26 |
| 27 **Kind.** The first word in the description should identify the *kind* of lint w
here kinds are derived from the | 27 **Kind.** The first word in the description should identify the *kind* of lint w
here kinds are derived from the |
| 28 [style guide](https://www.dartlang.org/articles/style-guide/). In summary: | 28 [style guide](https://www.dartlang.org/articles/style-guide/). In summary: |
| 29 | 29 |
| 30 * ***DO*** guidelines describe practices that should always be followed. There
will almost never be a valid reason | 30 * ***DO*** guidelines describe practices that should always be followed. There w
ill almost never be a valid reason |
| 31 to stray from them. | 31 to stray from them. |
| 32 | 32 |
| 33 * ***DON'T*** guidelines are the converse: things that are almost never a good
idea. You'll note there are few of | 33 * ***DON'T*** guidelines are the converse: things that are almost never a good i
dea. You'll note there are few of |
| 34 these here. Guidelines like these in other languages help to avoid the pitfalls
that appear over time. Dart is | 34 these here. Guidelines like these in other languages help to avoid the pitfalls
that appear over time. Dart is |
| 35 new enough that we can just fix those pitfalls directly instead of putting up ro
pes around them. | 35 new enough that we can just fix those pitfalls directly instead of putting up ro
pes around them. |
| 36 | 36 |
| 37 * ***PREFER*** guidelines are practices that you should follow. However, there
may be circumstances where it makes | 37 * ***PREFER*** guidelines are practices that you should follow. However, there m
ay be circumstances where it makes |
| 38 sense to do otherwise. Just make sure you understand the full implications of ig
noring the guideline when you do. | 38 sense to do otherwise. Just make sure you understand the full implications of ig
noring the guideline when you do. |
| 39 | 39 |
| 40 * ***AVOID*** guidelines are the dual to "prefer": stuff you shouldn't do but w
here there may be good reasons to | 40 * ***AVOID*** guidelines are the dual to "prefer": stuff you shouldn't do but wh
ere there may be good reasons to |
| 41 on rare occasions. | 41 on rare occasions. |
| 42 | 42 |
| 43 * ***CONSIDER*** guidelines are practices that you might or might not want to f
ollow, depending on circumstances, | 43 * ***CONSIDER*** guidelines are practices that you might or might not want to fo
llow, depending on circumstances, |
| 44 precedents, and your own preference. | 44 precedents, and your own preference. |
| 45 | 45 |
| 46 **Detailed Description.** In addition to the short description, a lint rule shou
ld have more detailed rationale | 46 **Detailed Description.** In addition to the short description, a lint rule shou
ld have more detailed rationale |
| 47 with code examples, ideally *good* and *bad*. The [style guide](https://www.dart
lang.org/articles/style-guide/) is | 47 with code examples, ideally *good* and *bad*. The [style guide](https://www.dart
lang.org/articles/style-guide/) is |
| 48 a great source for inspiration. Many style recommendations have been directly t
ranslated to lints as enumerated | 48 a great source for inspiration. Many style recommendations have been directly t
ranslated to lints as enumerated |
| 49 [here](http://dart-lang.github.io/linter/lints/). | 49 [here](http://dart-lang.github.io/linter/lints/). |
| 50 | 50 |
| 51 **Group.** A grouping. For example, *Style Guide* aggregates style guide deriv
ed lints. | 51 **Group.** A grouping. For example, *Style Guide* aggregates style guide deriv
ed lints. |
| 52 | 52 |
| 53 **Maturity.** Rules can be further distinguished by maturity. Unqualified rules
are considered stable, | 53 **Maturity.** Rules can be further distinguished by maturity. Unqualified rules
are considered stable, |
| 54 while others may be marked *EXPERIMENTAL* or *PROPOSED* to indicate that they ar
e under review. | 54 while others may be marked *EXPERIMENTAL* or *PROPOSED* to indicate that they ar
e under review. |
| 55 | 55 |
| 56 ## Mechanics | 56 ## Mechanics |
| 57 | 57 |
| 58 Lints live in the [lib/src/rules](https://github.com/dart-lang/linter/tree/maste
r/lib/src/rules) directory. | 58 Lints live in the [lib/src/rules](https://github.com/dart-lang/linter/tree/maste
r/lib/src/rules) directory. |
| 59 Corresponding tests live in [test/rules](https://github.com/dart-lang/linter/tre
e/master/test/rules). | 59 Corresponding tests live in [test/rules](https://github.com/dart-lang/linter/tre
e/master/test/rules). |
| 60 | 60 |
| 61 Rule stubs can be generated with the [rule.dart](https://github.com/dart-lang/li
nter/blob/master/tool/rule.dart) | 61 Rule stubs can be generated with the [rule.dart](https://github.com/dart-lang/li
nter/blob/master/tool/rule.dart) |
| 62 helper script and documentation gets generated with [doc.dart] | 62 helper script and documentation gets generated with [doc.dart](https://github.co
m/dart-lang/linter/blob/master/tool/doc.dart). |
| 63 (https://github.com/dart-lang/linter/blob/master/tool/doc.dart). | 63 Helper scripts can be invoked via `dart` or grinder (`pub run grinder docs:doc_l
ocation` and `pub run grinder rule:my_new_rule` respectively). |
| 64 | 64 |
| 65 Needless to say, details are under active development. Feedback is most [welcom
e](https://github.com/dart-lang/linter/issues)! | 65 Needless to say, details are under active development. Feedback is most [welcom
e](https://github.com/dart-lang/linter/issues)! |
| OLD | NEW |