code: def search_for(self, dependency):  # type: (Dependency) -> List[Package]
          
          if dependency.is_root:
              return PackageCollection(dependency, [self._package])
  
          for constraint in self._search_for.keys():
              if (
                  constraint.name == dependency.name
                  and constraint.constraint.intersect(dependency.constraint)
                  == dependency.constraint
              ):
                  packages = [
                      p
                      for p in self._search_for[constraint]
                      if dependency.constraint.allows(p.version)
                  ]
  
                  packages.sort(
                      key=lambda p: (
                          not p.is_prerelease() and not dependency.allows_prereleases(),
                          p.version,
                      ),
                      reverse=True,
                  )
  
                  return PackageCollection(dependency, packages)
  
          if dependency.is_vcs():
              packages = self.search_for_vcs(dependency)
          elif dependency.is_file():
              packages = self.search_for_file(dependency)
          elif dependency.is_directory():
              packages = self.search_for_directory(dependency)
          else:
              constraint = dependency.constraint
  
              packages = self._pool.find_packages(
                  dependency.name,
                  constraint,
                  extras=dependency.extras,
                  allow_prereleases=dependency.allows_prereleases(),
              )
  
              packages.sort(
                  key=lambda p: (
                      not p.is_prerelease() and not dependency.allows_prereleases(),
                      p.version,
                  ),
                  reverse=True,
              )
  
          self._search_for[dependency] = packages
  
          return PackageCollection(dependency, packages)
docs: Search for the specifications that match the given dependency.
  
          The specifications in the returned list will be considered in reverse
          order, so the latest version ought to be last.