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.