package jetbrains.mps.ide.ui.finders; /*Generated by MPS */ import jetbrains.mps.ide.findusages.findalgorithm.finders.BaseFinder; import jetbrains.mps.ide.findusages.model.SearchResults; import jetbrains.mps.ide.findusages.model.SearchQuery; import org.jetbrains.mps.openapi.util.ProgressMonitor; import org.jetbrains.mps.openapi.model.SNode; import org.jetbrains.mps.openapi.model.SModelReference; import java.util.Collection; import org.jetbrains.mps.openapi.model.SModel; import jetbrains.mps.util.IterableUtil; import jetbrains.mps.smodel.SModelStereotype; import org.jetbrains.mps.openapi.model.SNodeUtil; import org.jetbrains.mps.openapi.model.SReference; import jetbrains.mps.ide.findusages.model.SearchResult; /** * Look up particular nodes in scope models with reference target pointing to SModelReference. * Search results are of type SNode */ public class ModelUsagesFinder extends BaseFinder { public ModelUsagesFinder() { } @Override public String getDescription() { return "Model Usages"; } @Override public SearchResults find(SearchQuery query, ProgressMonitor monitor) { SearchResults<SNode> searchResults = new SearchResults<SNode>(); Object value = query.getObjectHolder().getObject(); if (!(value instanceof SModelReference)) { return searchResults; } SModelReference modelReference = (SModelReference) value; searchResults.getSearchedNodes().add(modelReference); Collection<SModel> models = IterableUtil.asCollection(query.getScope().getModels()); monitor.start("Looking up references to a model", models.size()); for (SModel modelDescriptor : models) { if (monitor.isCanceled()) { return searchResults; } if (!(SModelStereotype.isUserModel(modelDescriptor))) { continue; } for (SNode node : SNodeUtil.getDescendants(modelDescriptor)) { for (SReference reference : node.getReferences()) { SModelReference targetModelReference = reference.getTargetSModelReference(); if (targetModelReference == null) { continue; } if (targetModelReference.equals(modelReference)) { searchResults.getSearchResults().add(new SearchResult<SNode>(node, "nodes from model")); } } } monitor.advance(1); } monitor.done(); return searchResults; } }