def METHOD_NAME(
    self, source: CFGBlock, target: CFGBlock, edge_label: Optional[Any] = None
) -> None:
    """Link source to target, or merge source into target if source is empty.
    An "empty" node for this purpose is when source has no statements.
    source with a jump statement cannot be further linked or merged to
    another target.
    If edge_label is specified, set the corresponding edge in the CFG with that label.
    """
    if source.is_jump():
        return
    if source.statements == []:
        if source is self.start:
            self.start = target
        else:
            for edge in source.predecessors:
                edge.target = target
                target.predecessors.append(edge)
        # source is a utility block that helps build the cfg that does not
        # represent any part of the program so it is redundant.
        self.unreachable_blocks.remove(source)
    else:
        CFGEdge(source, target, edge_label)