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