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); } } }