Skip to content

Shared

shared

Shared helper classification for the move pipeline.

SharedInfo dataclass

Usage record for a copied helper.

used_by_moved lists moved block names that transitively reference the helper; used_by_remaining lists remaining source symbols that do the same. A helper is "shared" iff both sets are non-empty.

Source code in packages/axm-anvil/src/axm_anvil/core/shared.py
Python
@dataclass
class SharedInfo:
    """Usage record for a copied helper.

    ``used_by_moved`` lists moved block names that transitively reference
    the helper; ``used_by_remaining`` lists remaining source symbols that
    do the same. A helper is "shared" iff both sets are non-empty.
    """

    used_by_moved: set[str] = field(default_factory=set)
    used_by_remaining: set[str] = field(default_factory=set)

classify_shared_helpers(blocks, needed_helpers, source_tree_after_remove)

Return shared-helper classification for the current move plan.

A helper is shared iff it is transitively referenced by at least one moved block AND by at least one remaining top-level symbol in source_tree_after_remove.

Source code in packages/axm-anvil/src/axm_anvil/core/shared.py
Python
def classify_shared_helpers(
    blocks: list[Block],
    needed_helpers: set[str],
    source_tree_after_remove: cst.Module,
) -> dict[str, SharedInfo]:
    """Return shared-helper classification for the current move plan.

    A helper is shared iff it is transitively referenced by at least one
    moved block AND by at least one remaining top-level symbol in
    ``source_tree_after_remove``.
    """
    source_refs = _top_level_refs(source_tree_after_remove)

    block_closures: dict[str, set[str]] = {
        block.name: _transitive_closure(set(block.referenced_names), source_refs)
        for block in blocks
    }

    remaining_closures: dict[str, set[str]] = {
        name: _transitive_closure(set(direct_refs), source_refs)
        for name, direct_refs in source_refs.items()
        if name not in needed_helpers
    }

    result: dict[str, SharedInfo] = {}
    for helper in needed_helpers:
        info = _classify_single_helper(helper, block_closures, remaining_closures)
        if info is not None:
            result[helper] = info
    return result