IIndexFragmentFile selectIndexFile(
      int linkageID, IIndexFileLocation ifl, ISignificantMacros sigMacros) throws CoreException {
    LinkageTask map = findRequestMap(linkageID);
    if (map != null) {
      LocationTask locTask = map.find(ifl);
      if (locTask != null) {
        FileVersionTask task = locTask.findVersion(sigMacros);
        if (task != null) {
          return task.fOutdated ? null : task.fIndexFile;
        }
      }
    }

    IIndexFragmentFile[] files = getAvailableIndexFiles(linkageID, ifl);
    for (IIndexFragmentFile file : files) {
      if (sigMacros.equals(file.getSignificantMacros())) return file;
    }
    return null;
  }