package jetbrains.mps.ide.findusages.findalgorithm.finders.specific; /*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.annotations.NotNull; import org.jetbrains.mps.openapi.util.ProgressMonitor; import org.jetbrains.mps.openapi.model.SNode; import org.jetbrains.mps.openapi.module.SModule; import org.jetbrains.mps.openapi.module.SModuleReference; import jetbrains.mps.smodel.Language; import org.jetbrains.mps.openapi.model.SModel; import java.util.List; import java.util.LinkedList; import jetbrains.mps.util.IterableUtil; import jetbrains.mps.ide.findusages.view.FindUtils; import jetbrains.mps.project.GlobalScopeMinusTransient; import jetbrains.mps.ide.ui.finders.ModelImportsUsagesFinder; import java.util.ArrayList; import jetbrains.mps.ide.findusages.model.SearchResult; import org.jetbrains.mps.openapi.module.SearchScope; import jetbrains.mps.ide.findusages.model.scopes.ModelsScope; public class LanguageConceptsUsagesFinder extends BaseFinder { public LanguageConceptsUsagesFinder() { } @Override public String getDescription() { return "Language Concepts' Usages"; } @Override public SearchResults find(SearchQuery query, @NotNull ProgressMonitor monitor) { SearchResults<SNode> searchResults = new SearchResults<SNode>(); Object value = query.getObjectHolder().getObject(); SModule module = null; if (value instanceof SModule) { module = ((SModule) value); } else if (value instanceof SModuleReference) { module = query.getScope().resolve(((SModuleReference) value)); } if (!(module instanceof Language)) { return searchResults; } Language language = (Language) module; SModel structureModel = language.getStructureModelDescriptor(); if (structureModel == null) { return searchResults; } if (!(structureModel.getRootNodes().iterator().hasNext())) { return searchResults; } List<SNode> roots = new LinkedList<SNode>(); for (SNode root : structureModel.getRootNodes()) { roots.add(root); } searchResults.getSearchedNodes().addAll(roots); monitor.start("", IterableUtil.asCollection(structureModel.getRootNodes()).size() + 1); try { SearchResults<SModel> modelResults = FindUtils.getSearchResults(monitor.subTask(1), new SearchQuery(structureModel.getReference(), GlobalScopeMinusTransient.getInstance()), new ModelImportsUsagesFinder()); List<SModel> models = new ArrayList<SModel>(); for (SearchResult<SModel> sModelSearchResult : modelResults.getSearchResults()) { models.add(sModelSearchResult.getObject()); } SearchScope scope = new ModelsScope(models.toArray(new SModel[models.size()])); SearchResults<SNode> results = new SearchResults(); for (SNode node : roots) { if (monitor.isCanceled()) { break; } results.addAll(FindUtils.getSearchResults(monitor.subTask(1), node, scope, "jetbrains.mps.lang.structure.findUsages.NodeUsages_Finder")); results.removeDuplicates(); } searchResults.getSearchResults().addAll(results.getSearchResults()); return searchResults; } finally { monitor.done(); } } }