@Override
  public @NotNull DataIndexer<String, Void, FileContent> getIndexer() {
    return new CompositeDataIndexer<String, Void, Collection<Pair<ElementPattern<FileContent>, String>>, List<String>> () {
      @Override
      public @Nullable Collection<Pair<ElementPattern<FileContent>, String>> calculateSubIndexer(@NotNull IndexedFile file) {
        MultiMap<FileType, Pair<ElementPattern<FileContent>, String>> map = FrameworkDetectorRegistry.getInstance().getDetectorsMap();
        Collection<Pair<ElementPattern<FileContent>, String>> indexerCandidates = map.get(file.getFileType());
        return indexerCandidates.isEmpty() ? null : indexerCandidates;
      }

      @Override
      public @NotNull List<String> getSubIndexerVersion(@NotNull Collection<Pair<ElementPattern<FileContent>, String>> pairs) {
        return pairs.stream().map(p -> p.getSecond()).sorted().collect(Collectors.toList());
      }

      @Override
      public @NotNull KeyDescriptor<List<String>> getSubIndexerVersionDescriptor() {
        return new StringCollectionExternalizer<>(ArrayList::new);
      }

      @Override
      public @NotNull Map<String, Void> map(@NotNull FileContent inputData,
                                            @NotNull Collection<Pair<ElementPattern<FileContent>, String>> pairs) {
        Map<String, Void> result = null;
        for (Pair<ElementPattern<FileContent>, String> pair : pairs) {
          ElementPattern<FileContent> pattern = pair.getFirst();
          String detectorId = pair.getSecond();
          boolean accepts;
          try {
            accepts = pattern.accepts(inputData);
          } catch (Exception e) {
            if (e instanceof ControlFlowException) throw e;
            FrameworkDetector frameworkDetector = FrameworkDetectorRegistry.getInstance().getDetectorById(detectorId);
            throw new MapReduceIndexMappingException(e, frameworkDetector != null ? frameworkDetector.getClass() : null);
          }
          if (accepts) {
            if (LOG.isDebugEnabled()) {
              LOG.debug(inputData.getFile() + " accepted by detector " + detectorId);
            }
            if (result == null) {
              result = new HashMap<>();
            }
            myDispatcher.getMulticaster().fileUpdated(inputData.getFile(), detectorId);
            result.put(detectorId, null);
          }
        }
        return result != null ? result : Collections.emptyMap();
      }
    };
  }
@Override
  public @NotNull DataIndexer<String, Void, FileContent> getIndexer()