def METHOD_NAME(self, node: Union[nodes.Module, nodes.FunctionDef]) -> None:
    """Runs the data flow algorithm on a `Module` or `Function` CFG, which in turn
    appends `Name` nodes to `self.possibly_undefined` if it might not be defined.
    Data flow algorithms retrieved from:
    https://www.seas.harvard.edu/courses/cs252/2011sp/slides/Lec02-Dataflow.pdf#page=31
    """
    out_facts = {}
    cfg = ControlFlowGraph()
    cfg.start = node.cfg_block
    blocks = list(cfg.get_blocks_postorder())
    blocks.reverse()
    all_assigns = self._get_assigns(node)
    for block in blocks:
        out_facts[block] = all_assigns.copy()
    worklist = blocks
    while len(worklist) != 0:
        b = worklist.pop()
        outs = [out_facts[p.source] for p in b.predecessors if p.source in out_facts]
        if outs == []:
            in_facts = set()
        else:
            in_facts = set.intersection(*outs)
        temp = self._transfer(b, in_facts, all_assigns)
        if temp != out_facts[b]:
            out_facts[b] = temp
            worklist.extend([succ.target for succ in b.successors])