code: def collect_members(module_to_name):
    
    members = {}
    for module, module_name in module_to_name.items():
      all_names = getattr(module, "__all__", None)
      for name, member in inspect.getmembers(module):
        if ((inspect.isfunction(member) or inspect.isclass(member)) and
            not _always_drop_symbol_re.match(name) and
            (all_names is None or name in all_names)):
          fullname = '%s.%s' % (module_name, name)
          if name in members:
            other_fullname, other_member = members[name]
            if member is not other_member:
              raise RuntimeError("Short name collision between %s and %s" %
                                 (fullname, other_fullname))
            if len(fullname) == len(other_fullname):
              raise RuntimeError("Can't decide whether to use %s or %s for %s: "
                                 "both full names have length %d" %
                                 (fullname, other_fullname, name, len(fullname)))
            if len(fullname) > len(other_fullname):
              continue  # Use the shorter full name
          members[name] = fullname, member
    return members
docs: Collect all symbols from a list of modules.
  
    Args:
      module_to_name: Dictionary mapping modules to short names.
  
    Returns:
      Dictionary mapping name to (fullname, member) pairs.