Melange_compiler_libs.Signature_group
Iterate on signature by syntactic group of items
Classes, class types and private row types adds ghost components to the signature where they are defined.
When editing or printing a signature it is therefore important to identify those ghost components.
This module provides type grouping together ghost components with the corresponding core item (or recursive group) and the corresponding iterators.
type sig_item = {
src: Types.signature_item,
the syntactic item
*/post_ghosts: list(Types.signature_item),
ghost classes types are post-declared
*/};
Classes and class types generate ghosts signature items, we group them together before printing
let flatten: sig_item => Types.signature;
flatten sig_item
is x.src :: x.post_ghosts
A group of mutually recursive definition
let rec_items: core_rec_group => list(sig_item);
rec_items group
is the list of sig_items in the group
Private #row types are manifested as a sequence of definitions preceding a recursive group, we collect them and separate them from the syntactic recursive group.
let next: Types.signature => option((rec_group, Types.signature));
let seq: Types.signature => Stdlib.Seq.t(rec_group);
let iter: (rec_group => unit) => Types.signature => unit;
let fold: ('acc => rec_group => 'acc) => 'acc => Types.signature => 'acc;
type in_place_patch = {
ghosts: Types.signature,
updated list of ghost items
*/replace_by: option(Types.signature_item),
replacement for the selected item
*/};
Describe how to amend one element of a signature
let replace_in_place:
(ghosts:Types.signature =>
Types.signature_item =>
option(('a, in_place_patch))) =>
Types.signature =>
option(('a, Types.signature));
!replace_in_place patch sg
replaces the first element of the signature for which patch ~ghosts component
returns Some (value,patch)
. The ghosts
list is the current prefix of ghost components associated to component