package jetbrains.mps.ide.java.platform.index; /*Generated by MPS */ import com.intellij.util.indexing.FileBasedIndexExtension; import jetbrains.mps.workbench.index.SNodeEntry; import java.util.List; import com.intellij.util.indexing.ID; import org.jetbrains.mps.openapi.model.SNode; import com.intellij.util.indexing.FileBasedIndex; import com.intellij.psi.search.GlobalSearchScope; import jetbrains.mps.lang.smodel.generator.smodelAdapter.SNodeOperations; import org.jetbrains.annotations.NotNull; import com.intellij.util.io.KeyDescriptor; import jetbrains.mps.workbench.index.SNodeEntryKeyDescriptor; import com.intellij.util.io.DataExternalizer; import jetbrains.mps.workbench.index.SNodeEntryExternalizer; import java.io.DataOutput; import java.io.IOException; import java.io.DataInput; import com.intellij.util.indexing.DataIndexer; import com.intellij.util.indexing.FileContent; import com.intellij.openapi.vfs.VirtualFile; import jetbrains.mps.fileTypes.MPSFileTypeFactory; import java.util.Map; import jetbrains.mps.extapi.model.SModelData; import jetbrains.mps.workbench.index.RootNodeNameIndex; import java.util.Collections; import org.jetbrains.mps.openapi.model.SModelReference; import jetbrains.mps.internal.collections.runtime.MapSequence; import java.util.HashMap; import org.jetbrains.mps.openapi.model.SNodeUtil; import jetbrains.mps.smodel.adapter.structure.MetaAdapterFactory; import jetbrains.mps.lang.smodel.generator.smodelAdapter.SLinkOperations; import jetbrains.mps.internal.collections.runtime.ListSequence; import org.apache.log4j.Logger; import org.jetbrains.mps.openapi.model.SReference; import org.jetbrains.mps.openapi.model.SNodeReference; import java.util.ArrayList; import jetbrains.mps.smodel.SNodePointer; public class ClassifierSuccessorsIndexer extends FileBasedIndexExtension<SNodeEntry, List<SNodeEntry>> { private static final ID<SNodeEntry, List<SNodeEntry>> NAME = ID.create("mps.ClassifierSuccessors"); /*package*/ static void processValues(SNode nextClassifier, FileBasedIndex.ValueProcessor<List<SNodeEntry>> valueProcessor, GlobalSearchScope filter) { FileBasedIndex.getInstance().processValues(NAME, new SNodeEntry(SNodeOperations.getPointer(nextClassifier)), null, valueProcessor, filter); } @NotNull @Override public ID<SNodeEntry, List<SNodeEntry>> getName() { return NAME; } @Override public int getVersion() { return 1; } @Override public boolean dependsOnFileContent() { return true; } @Override @NotNull public FileBasedIndex.InputFilter getInputFilter() { return new ClassifierSuccessorsIndexer.InputFilter(); } @Override @NotNull public KeyDescriptor<SNodeEntry> getKeyDescriptor() { return new SNodeEntryKeyDescriptor(); } @Override @NotNull public DataExternalizer<List<SNodeEntry>> getValueExternalizer() { return new DataExternalizer<List<SNodeEntry>>() { private final SNodeEntryExternalizer myExternalizer = new SNodeEntryExternalizer(false); public void save(@NotNull DataOutput out, List<SNodeEntry> values) throws IOException { myExternalizer.saveMany(out, values); } public List<SNodeEntry> read(@NotNull DataInput in) throws IOException { return myExternalizer.readMany(in); } }; } @NotNull @Override public DataIndexer<SNodeEntry, List<SNodeEntry>, FileContent> getIndexer() { return new ClassifierSuccessorsIndexer.Indexer(); } private static class InputFilter implements FileBasedIndex.InputFilter { @Override public boolean acceptInput(VirtualFile file) { return MPSFileTypeFactory.MPS_FILE_TYPE.equals(file.getFileType()); } } private static class Indexer implements DataIndexer<SNodeEntry, List<SNodeEntry>, FileContent> { @NotNull @Override public Map<SNodeEntry, List<SNodeEntry>> map(final FileContent inputData) { try { SModelData modelData = RootNodeNameIndex.doModelParsing(inputData); // e.g. model with merge conflict if (modelData == null) { return Collections.emptyMap(); } SModelReference modelReference = modelData.getReference(); final Map<SNodeEntry, List<SNodeEntry>> result = MapSequence.fromMap(new HashMap<SNodeEntry, List<SNodeEntry>>()); for (final SNode nextNode : SNodeUtil.getDescendants(modelData.getRootNodes())) { if (SNodeOperations.isInstanceOf(nextNode, MetaAdapterFactory.getConcept(0xf3061a5392264cc5L, 0xa443f952ceaf5816L, 0xf8c108ca66L, "jetbrains.mps.baseLanguage.structure.ClassConcept"))) { SNode classNode = SNodeOperations.as(nextNode, MetaAdapterFactory.getConcept(0xf3061a5392264cc5L, 0xa443f952ceaf5816L, 0xf8c108ca66L, "jetbrains.mps.baseLanguage.structure.ClassConcept")); SNode superclass = SLinkOperations.getTarget(classNode, MetaAdapterFactory.getContainmentLink(0xf3061a5392264cc5L, 0xa443f952ceaf5816L, 0xf8c108ca66L, 0x10f6353296dL, "superclass")); if (superclass != null) { safeMap(result, superclass, modelReference, classNode); } for (SNode implementedInterface : ListSequence.fromList(SLinkOperations.getChildren(classNode, MetaAdapterFactory.getContainmentLink(0xf3061a5392264cc5L, 0xa443f952ceaf5816L, 0xf8c108ca66L, 0xff2ac0b419L, "implementedInterface")))) { safeMap(result, implementedInterface, modelReference, classNode); } if (SNodeOperations.isInstanceOf(classNode, MetaAdapterFactory.getConcept(0xf3061a5392264cc5L, 0xa443f952ceaf5816L, 0x1107e0cb103L, "jetbrains.mps.baseLanguage.structure.AnonymousClass"))) { safeMap(result, SNodeOperations.getReference(SNodeOperations.as(classNode, MetaAdapterFactory.getConcept(0xf3061a5392264cc5L, 0xa443f952ceaf5816L, 0x1107e0cb103L, "jetbrains.mps.baseLanguage.structure.AnonymousClass")), MetaAdapterFactory.getReferenceLink(0xf3061a5392264cc5L, 0xa443f952ceaf5816L, 0x1107e0cb103L, 0x1107e0fd2a0L, "classifier")), modelReference, classNode); } } else if (SNodeOperations.isInstanceOf(nextNode, MetaAdapterFactory.getConcept(0xf3061a5392264cc5L, 0xa443f952ceaf5816L, 0x101edd46144L, "jetbrains.mps.baseLanguage.structure.Interface"))) { SNode interfaceNode = SNodeOperations.as(nextNode, MetaAdapterFactory.getConcept(0xf3061a5392264cc5L, 0xa443f952ceaf5816L, 0x101edd46144L, "jetbrains.mps.baseLanguage.structure.Interface")); for (SNode extendedInterface : ListSequence.fromList(SLinkOperations.getChildren(interfaceNode, MetaAdapterFactory.getContainmentLink(0xf3061a5392264cc5L, 0xa443f952ceaf5816L, 0x101edd46144L, 0x101eddadad7L, "extendedInterface")))) { safeMap(result, extendedInterface, modelReference, interfaceNode); } } } return result; } catch (Exception ex) { Logger.getLogger(ClassifierSuccessorsIndexer.class).error(String.format("Failed to index model file %s; %s", inputData.getFileName(), ex.getMessage()), ex); } return Collections.emptyMap(); } private void safeMap(Map<SNodeEntry, List<SNodeEntry>> result, SNode classifierType, SModelReference modelReference, SNode node) { safeMap(result, SNodeOperations.getReference(classifierType, MetaAdapterFactory.getReferenceLink(0xf3061a5392264cc5L, 0xa443f952ceaf5816L, 0x101de48bf9eL, 0x101de490babL, "classifier")), modelReference, node); } private void safeMap(Map<SNodeEntry, List<SNodeEntry>> result, SReference reference, SModelReference modelReference, SNode node) { SNodeReference targetNode = (reference == null ? null : reference.getTargetNodeReference()); if (targetNode == null) { return; } SNodeEntry key = new SNodeEntry(targetNode); List<SNodeEntry> successors = MapSequence.fromMap(result).get(key); if (successors == null) { successors = new ArrayList<SNodeEntry>(); MapSequence.fromMap(result).put(key, successors); } // being carefull with SNodePointer because node is not in a model SNodePointer nodePointer = new SNodePointer(modelReference, node.getNodeId()); successors.add(new SNodeEntry(nodePointer)); } } }