code: def identify_names(filename):
      
      node, _ = parse_source_file(filename)
      if node is None:
          return {}
  
      # Get matches from the code (AST)
      finder = NameFinder()
      finder.visit(node)
      names = list(finder.get_mapping())
      names += extract_object_names_from_docs(filename)
  
      example_code_obj = collections.OrderedDict()
      for name, full_name in names:
          if name in example_code_obj:
              continue  # if someone puts it in the docstring and code
          # name is as written in file (e.g. np.asarray)
          # full_name includes resolved import path (e.g. numpy.asarray)
          splitted = full_name.rsplit('.', 1)
          if len(splitted) == 1:
              # module without attribute. This is not useful for
              # backreferences
              continue
  
          module, attribute = splitted
          # get shortened module name
          module_short = get_short_module_name(module, attribute)
          cobj = {'name': attribute, 'module': module,
                  'module_short': module_short}
          example_code_obj[name] = cobj
      return example_code_obj
docs: Builds a codeobj summary by identifying and resolving used names.