docs: def _link_variables_on_block(self, block, kb):
          """
          Link atoms (AIL expressions) in the given block to corresponding variables identified previously.
  
          :param ailment.Block block: The AIL block to work on.
          :return:                    None
          """
  
          variable_manager = kb.variables[self.function.addr]
  
          for stmt_idx, stmt in enumerate(block.statements):
              # I wish I could do functional programming in this method...
              stmt_type = type(stmt)
              if stmt_type is ailment.Stmt.Store:
                  # find a memory variable
                  mem_vars = variable_manager.find_variables_by_atom(block.addr, stmt_idx, stmt)
                  if len(mem_vars) == 1:
                      stmt.variable, stmt.offset = next(iter(mem_vars))
                  self._link_variables_on_expr(variable_manager, block, stmt_idx, stmt, stmt.data)
  
              elif stmt_type is ailment.Stmt.Assignment:
                  self._link_variables_on_expr(variable_manager, block, stmt_idx, stmt, stmt.dst)
                  self._link_variables_on_expr(variable_manager, block, stmt_idx, stmt, stmt.src)
  
              elif stmt_type is ailment.Stmt.ConditionalJump:
                  self._link_variables_on_expr(variable_manager, block, stmt_idx, stmt, stmt.condition)
  
              elif stmt_type is ailment.Stmt.Call:
                  if stmt.ret_expr:
                      self._link_variables_on_expr(variable_manager, block, stmt_idx, stmt, stmt.ret_expr)