c81e3aa5

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

Let a constructor's name speak for one field, not for one primitive

The rule allowed one anonymous primitive per constructor on the grounds that
the constructor's name names it. That is only true when the constructor has one
field. A name speaks for one payload, so a constructor of several names the
whole of what it holds and no part of it, and DispatchProject in this very
repository was the counterexample: five fields, one of them a bare list of
package names, and PackageName sitting two modules away.

So a constructor of one field keeps its primitive and a constructor of two or
more names every primitive it holds. That is the same argument applied
consistently rather than a stricter rule, and it finds 101 sites across the
repositories this was measured on where the old shape found 39.

Three of the five it found here wanted the types it asks for: the project
command's expected packages are PackageName, the module command's extensions
are an ExtensionName, and an export list holds ExportEntry rather than text.
The other two are a position or a path beside a message another library wrote,
which is the residue this shape has and the old one did not, so they say so in
an annotation. good.hs keeps a case of it for the same reason.

Total

11s

Created Started Finished

Time to Start Worker time Duration Time to finish Idle
Config 0s 0s 0s 1s 0s
Eval 1s 10s 10s 11s 0s
Build 8s 0s 2s 11s 0s
Suite 0s 11s 11s 11s 0s

Timeline

Config Eval Build
0s10s