package jetbrains.mps.ide.findusages.findalgorithm.finders.specific;
/*Generated by MPS */
import jetbrains.mps.ide.findusages.findalgorithm.finders.BaseFinder;
import jetbrains.mps.ide.findusages.findalgorithm.finders.IFinder;
import jetbrains.mps.smodel.Generator;
import org.jetbrains.mps.openapi.model.SNode;
import jetbrains.mps.ide.findusages.model.SearchResults;
import jetbrains.mps.ide.findusages.model.SearchQuery;
import org.jetbrains.mps.openapi.util.ProgressMonitor;
import java.util.List;
import jetbrains.mps.ide.findusages.model.SearchResult;
import java.util.ArrayList;
import org.jetbrains.mps.openapi.model.SModel;
import jetbrains.mps.internal.collections.runtime.Sequence;
import jetbrains.mps.internal.collections.runtime.ITranslator2;
import jetbrains.mps.lang.smodel.generator.smodelAdapter.SModelOperations;
import jetbrains.mps.smodel.adapter.structure.MetaAdapterFactory;
import jetbrains.mps.lang.smodel.generator.smodelAdapter.SNodeOperations;
import jetbrains.mps.lang.smodel.generator.smodelAdapter.SLinkOperations;
import org.jetbrains.mps.openapi.model.SReference;
import jetbrains.mps.util.CollectionUtil;
public class MappingConfigFinder extends BaseFinder implements IFinder {
private Generator myGenerator;
private SNode myNodeToFindUsages;
public MappingConfigFinder(Generator generator, SNode nodeToFindUsages) {
myGenerator = generator;
myNodeToFindUsages = nodeToFindUsages;
}
@Override
public String getDescription() {
return "Mapping Configs";
}
@Override
public SearchResults<SNode> find(SearchQuery query, ProgressMonitor monitor) {
List<SearchResult<SNode>> results = new ArrayList<SearchResult<SNode>>();
Iterable<SModel> ownTemplateModels = myGenerator.getOwnTemplateModels();
Iterable<SNode> mappingConfigs = Sequence.fromIterable(ownTemplateModels).translate(new ITranslator2<SModel, SNode>() {
public Iterable<SNode> translate(SModel it) {
return SModelOperations.roots(it, MetaAdapterFactory.getConcept(0xb401a68083254110L, 0x8fd384331ff25befL, 0xff0bea0475L, "jetbrains.mps.lang.generator.structure.MappingConfiguration"));
}
});
List<SNode> nodesToCheck = new ArrayList<SNode>();
for (SNode mappingConfig : mappingConfigs) {
for (SNode rule : SNodeOperations.ofConcept(SNodeOperations.getChildren(mappingConfig), MetaAdapterFactory.getConcept(0xb401a68083254110L, 0x8fd384331ff25befL, 0x10fc0b64647L, "jetbrains.mps.lang.generator.structure.BaseMappingRule"))) {
nodesToCheck.add(rule);
collectChildrenThatMayHaveReferenceOnTemplate(rule, nodesToCheck);
}
nodesToCheck.addAll(SLinkOperations.getChildren(mappingConfig, MetaAdapterFactory.getContainmentLink(0xb401a68083254110L, 0x8fd384331ff25befL, 0xff0bea0475L, 0x10fbbe00519L, "createRootRule")));
}
for (SNode node : nodesToCheck) {
for (SReference reference : node.getReferences()) {
if (myNodeToFindUsages.getNodeId().equals(reference.getTargetNodeId())) {
SearchResult<SNode> result = new SearchResult<SNode>(node, "");
results.add(result);
break;
}
}
}
return new SearchResults<SNode>(CollectionUtil.set(myNodeToFindUsages), results);
}
private void collectChildrenThatMayHaveReferenceOnTemplate(SNode parent, List<SNode> result) {
List<SNode> children = jetbrains.mps.util.SNodeOperations.getChildren(parent, false);
for (SNode child : children) {
if (SNodeOperations.isInstanceOf(child, MetaAdapterFactory.getConcept(0xf3061a5392264cc5L, 0xa443f952ceaf5816L, 0x108bbca0f48L, "jetbrains.mps.baseLanguage.structure.ConceptFunction"))) {
continue;
}
result.add(child);
collectChildrenThatMayHaveReferenceOnTemplate(child, result);
}
}
}