9a131321

By: Tom Sydney Kerckhove <syd@cs-syd.eu>

Render findings with diagnose, and add centjes to the corpus

Findings are now shown against the code they are about rather than located by
file:line:col. The rule id is the report's code, because it is also what has to
be typed to suppress it; the marker carries the line from the standards, so the
answer to "says who" is next to the code; the hint carries the exact
annotation to paste. Output moves to stderr, as a compiler's diagnostics do.

Showing the code means having the code, which the project layer does not: it
runs on fact files alone. That dependency is explicit, as a SourceMap the
caller fills, and 'hopinion project' takes --source PREFIX=DIR per package for
it. It costs nothing in rebuilds, since a fact file already changes whenever
its package's sources do.

Every rendering is pinned as a golden under test_resources/Report, owned by a
new ReportSpec, so a change to what a person sees is a reviewable artifact.

centjes joins nix-ci and sydtest in the corpus run, and found a bug by being
unlike them: it has a parser, so it has modules generated by alex and happy. A
declared module whose only source is an alex, happy or hsc2hs input used to be
reported as a module the facts do not cover, which is the right report for a
module deleted from the tree and the wrong one here. It is now a third parse
outcome, and every module rule abstains on it, so the gap is counted rather
than silent.

Two smaller things the change forced. diagnose is jailbroken in the overlay:
its upper bound on text predates GHC 9.10's, which is all that marks it broken.
And the tool now sets its output handles to UTF-8, because a Nix build runs
under the C locale, where the default encoding cannot write a box-drawing
character at all and the first finding would kill the tool.

Suite timing

Time to Start Worker time Duration Time to finish Idle
Config 0s 1s 1s 1s 0s
Eval 1s 13s 13s 14s 0s
Build 5s 11s 14s 20s 0s
Suite 0s 26s 20s 20s 0s

Timeline

0s10s20s