Skip to content

iterables

Resolve known IRx collection types into backend-neutral iteration sidecars so loop and comprehension analysis share one semantic authority.

Functions:

resolve_iteration_capability

resolve_iteration_capability(
    iterable_node: AST, iterable_type: DataType | None
) -> ResolvedIteration | None

Return the canonical iteration sidecar for known concrete iterable types, or None when the expression is not iterable in the current IRx contract. parameters: iterable_node: type: astx.AST iterable_type: type: astx.DataType | None returns: type: ResolvedIteration | None

Source code in packages/irx/src/irx/analysis/iterables.py
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
@public
@typechecked
def resolve_iteration_capability(
    iterable_node: astx.AST,
    iterable_type: astx.DataType | None,
) -> ResolvedIteration | None:
    """
    title: Resolve one iterable semantic capability.
    summary: >-
      Return the canonical iteration sidecar for known concrete iterable types,
      or None when the expression is not iterable in the current IRx contract.
    parameters:
      iterable_node:
        type: astx.AST
      iterable_type:
        type: astx.DataType | None
    returns:
      type: ResolvedIteration | None
    """
    if iterable_type is None:
        return None

    list_type = list_element_type(iterable_type)
    if list_type is not None:
        return ResolvedIteration(
            iterable_node=iterable_node,
            iterable_type=iterable_type,
            element_type=list_type,
            kind=IterationKind.LIST,
            order=IterationOrder.INDEX,
        )

    if isinstance(iterable_type, astx.DictType) and isinstance(
        iterable_type.key_type,
        astx.DataType,
    ):
        return ResolvedIteration(
            iterable_node=iterable_node,
            iterable_type=iterable_type,
            element_type=iterable_type.key_type,
            kind=IterationKind.DICT_KEYS,
            order=IterationOrder.INSERTION,
        )

    if isinstance(iterable_type, astx.SetType) and isinstance(
        iterable_type.element_type,
        astx.DataType,
    ):
        return ResolvedIteration(
            iterable_node=iterable_node,
            iterable_type=iterable_type,
            element_type=iterable_type.element_type,
            kind=IterationKind.SET,
            order=IterationOrder.UNSPECIFIED,
        )

    if isinstance(iterable_type, astx.GeneratorType):
        return ResolvedIteration(
            iterable_node=iterable_node,
            iterable_type=iterable_type,
            element_type=iterable_type.yield_type,
            kind=IterationKind.GENERATOR,
            is_reiterable=False,
            order=IterationOrder.STABLE,
        )

    return None