merlint: extend E523 to all module-generating dune features
Before: E523 only knew about (ocamllex ...), (menhir (modules ...)),
and (rule (target[s] ...)) as sources of generated .ml files. Other
dune constructs that put .ml files in play - (libraries (select ...)),
(generate_sites_module ...), (copy_files ...) - were invisible, so
covering a directory that used them forced false "uncovered" reports.
Now generator_modules also recognises:
- (libraries (select t.ml from (cond -> branch.ml) ...)) inside
library/executable/test stanzas - adds both the select target
and every branch .ml, since branches sit on disk as real source
files that dune picks one of at build time.
- (generate_sites_module (module foo) ...) inside library stanzas.
- (copy_files foo.ml) / (copy_files (files foo.ml)) / copy_files#
top-level forms. Globs with * are conservatively ignored.
Also:
- (include_subdirs unqualified|qualified) now short-circuits the
rule. With those modes, .ml files in subdirectories belong to
the stanza and single-directory coverage logic no longer holds.
- classify_modules previously dropped any (Sexp.List _) inside
(modules ...) silently, so (modules (:include foo.sexp)) was
read as an empty explicit list and tripped Redundant. Treat
sublists as Standard (unresolvable) like other exotic forms.
Cram test covers Redundant + Uncovered bad cases and good cases for
select, generate_sites_module, rule targets, ocamllex, copy_files,
and include_subdirs.