project rules: attach Location so per-file exclusions work
Project-scoped rules whose issues describe a specific file (E400, E520,
E521, E522, E523, E524, E525, E526, E800, E803, E805, E806, E807, E810,
E815, E820, E825, E835, E900, E905, E910, E915, E920) now pass the
offending file path through Issue.v ~loc:(Location.in_file ...). The
engine's per-file exclusion check in engine.ml only fires on issues that
carry a Location, so without this the (global) bucket bypassed the
.merlint exclusion mechanism entirely.
Also:
- E524 switched from a Project rule that walked the filesystem and
regex-matched [Cmd.v] over raw text to a File rule that counts
[Cmd.v] identifier references in the typed dump. The previous regex
produced false positives on files that mentioned [Cmd.v] in
docstrings or string literals (e.g. e524.ml itself).
- New Location.in_file helper replaces the verbose
Location.v ~file:_ ~start_line:1 ~start_col:0 ~end_line:1 ~end_col:0
boilerplate at every call site.
- Cram tests promoted to reflect the new "<file>:1:0:" prefix in lieu
of the old "(global)" prefix.
- New test/test_categories.ml covers Categories.load to silence E605
on lib/categories.ml.
- merlint's own .merlint excludes the cram fixtures under
test/cram/**, which exist intentionally as good/bad inputs to the
cram tests and should never be analysed as merlint source.