By: Tom Sydney Kerckhove <syd@cs-syd.eu>
Suppress a finding, and turn a rule off Stacked on the envelope. Adds CommentBareTodo from comments.md, and with it the two things that make a checker adoptable at all. The keystone is that a suppression which answers for nothing is an error. That is what makes on-by-default with unlimited local escapes safe: one that has outlived its finding, one that answers for more than one finding at once, one naming a rule nothing answers to, one with no reason, and one written where it cannot attach are all failures in their own right. Suppressions cannot accumulate in silence, so there is no need for a config file of exceptions nobody reads. A suppression the report offers must be one the parser accepts. The report says what to write and where; if the next run rejected it, the tool would have lied. Which rules run is a file at the repository root rather than a flag, and there is no flag anywhere, so the answer cannot differ between a shell and CI. Every way of getting that file wrong is refused rather than ignored, because each one reads as a rule turned off and behaves as a rule still running: a key nobody has heard of, a name that is not a rule id, a rule nothing answers to, and anything that is not a mapping. The comment attachment pass is what all of this stands on, and it is computed here in an explicit pass over spans rather than taken from where exact-print annotations put a comment. That placement answers "where must this be reprinted", not "what is this about". The most consequential decision in it: a blank line between a comment and the code below means the comment is not attached to that code. A suppression in a file no cabal component claims is watched by nobody, so it is reported rather than left to rot. Still one level, still no fact store, and nothing reads what the compiler wrote down, because neither rule needs any of it. weeder removed readChoicesFrom on the way in: the flag it exists for belongs to a command that does not exist yet.
| Time to Start | Worker time | Duration | Time to finish | Idle | |
| Config | 0s | 1s | 1s | 1s | 0s |
| Eval | 1s | 9s | 9s | 10s | 0s |
| Build | 9s | 6s | 7s | 16s | 0s |
| Suite | 0s | 17s | 16s | 16s | 0s |