Skip to content

analyzer

Compose the specialized semantic visitor mixins around a shared analyzer core so traversal, registration, bindings, and rule logic live in smaller modules.

Classes:

SemanticAnalyzer

SemanticAnalyzer(
    *,
    context: SemanticContext | None = None,
    session: CompilationSession | None = None,
)

Bases: ImportVisitorMixin, DeclarationVisitorMixin, ExpressionVisitorMixin, ControlFlowVisitorMixin, SemanticAnalyzerCore

Walk AST nodes, attach semantic sidecars, and delegate reusable policy to the extracted factories, registries, and binding tables.

Methods:

Source code in src/irx/analysis/handlers/base.py
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
def __init__(
    self,
    *,
    context: SemanticContext | None = None,
    session: CompilationSession | None = None,
) -> None:
    """
    title: Initialize SemanticAnalyzerCore.
    parameters:
      context:
        type: SemanticContext | None
      session:
        type: CompilationSession | None
    """
    self.session = session
    self.context = context or SemanticContext()
    if session is not None:
        self.context.diagnostics = session.diagnostics
    self.factory = SemanticEntityFactory(self.context)
    self.registry = SemanticRegistry(self.context, self.factory)
    self.bindings = VisibleBindings(
        context=self.context,
        factory=self.factory,
        bindings=(
            session.visible_bindings if session is not None else None
        ),
    )

analyze

analyze(node: AST) -> AST
Source code in src/irx/analysis/handlers/base.py
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
def analyze(self, node: astx.AST) -> astx.AST:
    """
    title: Analyze one AST root.
    parameters:
      node:
        type: astx.AST
    returns:
      type: astx.AST
    """
    if isinstance(node, astx.Module):
        parsed_module = ParsedModule(node.name, node)
        self.analyze_parsed_module(parsed_module, predeclared=False)
    else:
        with self.context.scope("module"):
            self.visit(node)
    self.context.diagnostics.raise_if_errors()
    return node

analyze_parsed_module

analyze_parsed_module(
    parsed_module: ParsedModule, *, predeclared: bool
) -> Module
Source code in src/irx/analysis/handlers/base.py
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
def analyze_parsed_module(
    self,
    parsed_module: ParsedModule,
    *,
    predeclared: bool,
) -> astx.Module:
    """
    title: Analyze one parsed module.
    parameters:
      parsed_module:
        type: ParsedModule
      predeclared:
        type: bool
    returns:
      type: astx.Module
    """
    with self.context.in_module(parsed_module.key):
        self._visit_module(parsed_module.ast, predeclared=predeclared)
    return parsed_module.ast

visit

visit(node: ImportFromExpr) -> None
Source code in src/irx/analysis/handlers/imports.py
158
159
160
161
162
163
164
165
166
167
168
169
170
@SemanticAnalyzerCore.visit.dispatch
def visit(self, node: astx.ImportFromExpr) -> None:
    """
    title: Visit ImportFromExpr nodes.
    parameters:
      node:
        type: astx.ImportFromExpr
    """
    self.context.diagnostics.add(
        "Import expressions are not supported in this MVP.",
        node=node,
    )
    self._set_type(node, None)