API for retrieving all registered file type extensions without instantiating all file types

GitOrigin-RevId: a7a5e660fdf357304a781bee42ec958f0db5fc72
This commit is contained in:
Dmitry Jemerov
2019-06-13 03:28:40 +03:00
committed by intellij-monorepo-bot
parent 66488e1a18
commit 769331b055
2 changed files with 17 additions and 8 deletions
@@ -20,10 +20,13 @@
package com.intellij.openapi.fileTypes;
import com.intellij.openapi.util.KeyedExtensionCollector;
import com.intellij.util.KeyedLazyInstance;
import org.jetbrains.annotations.NonNls;
import org.jetbrains.annotations.NotNull;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class FileTypeExtension<T> extends KeyedExtensionCollector<T, FileType> {
public FileTypeExtension(@NonNls final String epName) {
@@ -45,4 +48,13 @@ public class FileTypeExtension<T> extends KeyedExtensionCollector<T, FileType> {
final List<T> all = allForFileType(t);
return all.isEmpty() ? null : all.get(0);
}
public Map<FileType, T> getAllRegisteredExtensions() {
List<KeyedLazyInstance<T>> extensions = getExtensions();
Map<FileType, T> result = new HashMap<>();
for (KeyedLazyInstance<T> extension : extensions) {
result.put(FileTypeRegistry.getInstance().findFileTypeByName(extension.getKey()), extension.getInstance());
}
return result;
}
}
@@ -5,7 +5,6 @@ package com.intellij.psi.impl.cache.impl.todo;
import com.intellij.lang.LanguageParserDefinitions;
import com.intellij.openapi.application.ApplicationManager;
import com.intellij.openapi.fileTypes.FileType;
import com.intellij.openapi.fileTypes.FileTypeRegistry;
import com.intellij.openapi.fileTypes.LanguageFileType;
import com.intellij.openapi.fileTypes.impl.CustomSyntaxTableFileType;
import com.intellij.openapi.util.Comparing;
@@ -24,9 +23,7 @@ import java.beans.PropertyChangeListener;
import java.io.DataInput;
import java.io.DataOutput;
import java.io.IOException;
import java.util.Arrays;
import java.util.Collections;
import java.util.Map;
import java.util.*;
/**
* @author Eugene Zhuravlev
@@ -106,12 +103,12 @@ public final class TodoIndex extends FileBasedIndexExtension<TodoIndexEntry, Int
@Override
public int getVersion() {
int version = 11;
FileType[] types = FileTypeRegistry.getInstance().getRegisteredFileTypes();
Arrays.sort(types, (o1, o2) -> Comparing.compare(o1.getName(), o2.getName()));
Map<FileType, DataIndexer<TodoIndexEntry, Integer, FileContent>> extensions = TodoIndexers.INSTANCE.getAllRegisteredExtensions();
List<FileType> types = new ArrayList<>(extensions.keySet());
types.sort((o1, o2) -> Comparing.compare(o1.getName(), o2.getName()));
for (FileType fileType : types) {
DataIndexer<TodoIndexEntry, Integer, FileContent> indexer = TodoIndexers.INSTANCE.forFileType(fileType);
if (indexer == null) continue;
DataIndexer<TodoIndexEntry, Integer, FileContent> indexer = extensions.get(fileType);
int versionFromIndexer = indexer instanceof VersionedTodoIndexer ? (((VersionedTodoIndexer)indexer).getVersion()) : 0xFF;
version = version * 31 + (versionFromIndexer ^ indexer.getClass().getName().hashCode());