void (@NotNull Collection<? extends ID<?, ?>> ids) { if (ApplicationManager.getApplication().isDisposed() || !IndexInfrastructure.hasIndices()) { return; } final Path registeredIndicesFile = PathManager.getIndexRoot().resolve("registered"); final Set<String> indicesToDrop = new HashSet<>(); boolean exceptionThrown = false; if (Files.exists(registeredIndicesFile)) { try (DataInputStream in = new DataInputStream(new BufferedInputStream(Files.newInputStream(registeredIndicesFile)))) { int size = in.readInt(); for (int idx = 0; idx < size; idx++) { indicesToDrop.add(IOUtil.readString(in)); } } catch (Throwable e) { // workaround for IDEA-194253 LOG.info(e); exceptionThrown = true; ids.stream().map(ID::getName).forEach(indicesToDrop::add); } } boolean dropFilenameIndex = FileBasedIndexExtension.USE_VFS_FOR_FILENAME_INDEX && indicesToDrop.contains(FilenameIndex.NAME.getName()); if (!exceptionThrown) { for (ID<?, ?> key : ids) { if (dropFilenameIndex && key == FilenameIndex.NAME) continue; indicesToDrop.remove(key.getName()); } } if (!indicesToDrop.isEmpty()) { Collection<String> filtered = !dropFilenameIndex ? indicesToDrop : ContainerUtil.filter(indicesToDrop, o -> !FilenameIndex.NAME.getName().equals(o)); if (!filtered.isEmpty()) LOG.info("Dropping indices:" + String.join(",", filtered)); for (String s : indicesToDrop) { try { FileUtil.deleteWithRenaming(IndexInfrastructure.getFileBasedIndexRootDir(s).toFile()); } catch (IOException e) { LOG.warn(e); } } } try { Files.createDirectories(registeredIndicesFile.getParent()); try (DataOutputStream os = new DataOutputStream(new BufferedOutputStream(Files.newOutputStream(registeredIndicesFile)))) { os.writeInt(ids.size()); for (ID<?, ?> id : ids) { IOUtil.writeString(id.getName(), os); } } } catch (IOException e) { LOG.warn(e); } }