blob: 3fc7a5e7adb256160542015c8ae7f257748f7940 [file] [log] [blame] [view] [edit]
# The Life of a Lint
## Lint States
### Proposed
A lint begins its life as a **proposal** which is _pending_ until _accepted_.
### Accepted
After discussion and sufficient agreement within the team, a proposed lint becomes **accepted**.
An accepted lint is ready for implementation.
### Experimental
Lints can be marked experimental.
Reasons a lint might be marked experimental include a lint
* being tentatively introduced
* having unknown value
* having incomplete semantics
* having outstanding (fixable) false positives or
* that might be known to be temporary.
### Stable
Stable lints are lints whose semantics and implementation are considered complete. False
positives (that are not known, accepted and documented limitations of lint semantics) are
considered bugs and fixing them should be prioritized. False negatives may be bugs or
enhancements (depending on semantics).
### Deprecated
Deprecated lints are lints that we plan to remove.
Reasons for deprecation include:
* semantics that don't make sense with current language semantics (e.g., null-safety)
* stale advice
* poor performance or
* poor user experience (e.g., too many false positives).
### Removed
Lints we no longer support are removed.
In general removal is preceded by a period of deprecation.
## State Transitions
### Implementation
Once a lint proposal is accepted, it is safe to implement. A change that lands a new lint should
have a corresponding `CHANGELOG` entry.
### Deprecation
Implemented lints can be deprecated.
Deprecating lints that are in common lint sets (e.g., in [package:lints](https://github.com/dart-lang/lints)
can be impactful so should be done with care.
(**NOTE**: A change that deprecates an existing lint should have a corresponding `CHANGELOG` entry.)
### Marking Stable
Experimental lints should aspire to be stable. An experimental lint is a candidate for stable when it has
* complete semantics
* complete implementation (with no false-positives)
* established long-term value (e.g., inclusion in a recommended lint set)
### Removal
Deprecated or experimental lints can be removed. A stable lint should be deprecated before removal.
(**NOTE**: A change that removes an existing lint should have a corresponding `CHANGELOG` entry.)