package jetbrains.mps.workbench.findusages; /*Generated by MPS */ import com.intellij.openapi.components.ApplicationComponent; import org.apache.log4j.Logger; import org.apache.log4j.LogManager; import com.intellij.psi.impl.cache.impl.id.IdTableBuilding; import org.jetbrains.annotations.NotNull; import com.intellij.psi.impl.cache.impl.id.FileTypeIdIndexer; import java.util.Map; import com.intellij.psi.impl.cache.impl.id.IdIndexEntry; import com.intellij.util.indexing.FileContent; import java.util.Collections; import org.jetbrains.org.objectweb.asm.ClassReader; import org.apache.log4j.Level; import jetbrains.mps.baseLanguage.javastub.asm.ASMClass; import jetbrains.mps.reloading.AbstractClassPathItem; import jetbrains.mps.util.NameUtil; import jetbrains.mps.stubs.javastub.classpath.ClassifierKind; public class StubModelsIndexer implements ApplicationComponent { private static final Logger LOG = LogManager.getLogger(StubModelsIndexer.class); public StubModelsIndexer() { } @Override public void initComponent() { IdTableBuilding.registerIdIndexer(MPSPlatformFileTypeFactory.CLASS_FILE_TYPE, new StubModelsIndexer.MyFileTypeIdIndexer()); } @Override public void disposeComponent() { } @NotNull @Override public String getComponentName() { return StubModelsIndexer.class.getSimpleName(); } private static class MyFileTypeIdIndexer extends FileTypeIdIndexer { private MyFileTypeIdIndexer() { } @NotNull @Override public Map<IdIndexEntry, Integer> map(FileContent inputData) { byte[] bytes = inputData.getContent(); if (bytes == null || bytes.length == 0) { return Collections.emptyMap(); } ClassReader reader; try { reader = new ClassReader(bytes); } catch (Throwable t) { if (LOG.isEnabledFor(Level.WARN)) { LOG.warn(inputData.getFileName() + " can't be parsed by ASM and will not be indexed. This can be caused by corrupted classfile or a classfile with a version not yet parsable by bundled ASM library"); } return Collections.emptyMap(); } ASMClass ac = new ASMClass(reader, false); String fqName = ac.getFqName(); if (AbstractClassPathItem.isAnonymous(NameUtil.namespaceFromLongName(fqName))) { return Collections.emptyMap(); } ClassifierCacher updater = new ClassifierCacher(); updater.updateClassifier(ClassifierKind.getClassifierKind(reader), ac); return updater.getResult(); } } }