package jetbrains.mps.ide.platform.dependencyViewer;
/*Generated by MPS */
import java.util.Map;
import org.jetbrains.mps.openapi.model.SModel;
import java.util.List;
import org.jetbrains.mps.openapi.model.SReference;
import java.util.HashMap;
import jetbrains.mps.ide.findusages.model.SearchResults;
import org.jetbrains.mps.openapi.model.SNode;
import org.jetbrains.mps.openapi.util.ProgressMonitor;
import java.util.Set;
import java.util.HashSet;
import jetbrains.mps.lang.smodel.generator.smodelAdapter.SNodeOperations;
import jetbrains.mps.ide.findusages.model.SearchResult;
import org.jetbrains.mps.openapi.language.SConcept;
import jetbrains.mps.internal.collections.runtime.Sequence;
public class ReferencesFinder {
private Map<SModel, List<SReference>> myModelsRefsCache = new HashMap<SModel, List<SReference>>();
public ReferencesFinder() {
}
public SearchResults findRefsFromScopeToOuter(Iterable<SNode> nodes, DependencyViewerScope scope, ProgressMonitor monitor) {
SearchResults results = new SearchResults();
Set<SNode> targets = new HashSet<SNode>();
for (SNode node : nodes) {
for (SReference ref : SNodeOperations.getReferences(((SNode) node))) {
SNode target = jetbrains.mps.util.SNodeOperations.getTargetNodeSilently(ref);
if (target == null) {
continue;
}
if (scope.contains(target)) {
continue;
}
if (targets.add(target)) {
results.getSearchResults().add(new SearchResult(target, "target"));
}
}
monitor.advance(1);
if (monitor.isCanceled()) {
return results;
}
}
return results;
}
public SearchResults getUsedConcepts(Iterable<SNode> nodes, DependencyViewerScope scope, ProgressMonitor monitor) {
SearchResults results = new SearchResults();
Set<SConcept> concepts = new HashSet<SConcept>();
for (SNode node : nodes) {
SConcept concept = node.getConcept();
if (concepts.add(concept)) {
results.getSearchResults().add(new SearchResult(concept.getDeclarationNode(), "concept"));
}
monitor.advance(1);
if (monitor.isCanceled()) {
return results;
}
}
return results;
}
public SearchResults getRefsBetweenScopes(Iterable<SNode> references, DependencyViewerScope from, DependencyViewerScope to, ProgressMonitor monitor) {
SearchResults<SNode> results = new SearchResults<SNode>();
for (SNode node : Sequence.fromIterable(references)) {
for (SReference ref : SNodeOperations.getReferences(((SNode) node))) {
SNode targetNode = jetbrains.mps.util.SNodeOperations.getTargetNodeSilently(ref);
if (targetNode == null) {
continue;
}
if (from.contains(targetNode)) {
continue;
}
if (!(to.contains(targetNode))) {
continue;
}
results.getSearchResults().add(new SearchResult(node, "references"));
break;
}
if (monitor.isCanceled()) {
return results;
}
monitor.advance(1);
}
return results;
}
public SearchResults getLanguageUsagesSearchResults(Iterable<SNode> nodes, DependencyViewerScope sourceScope, DependencyViewerScope targetScope, ProgressMonitor monitor) {
SearchResults<SNode> results = new SearchResults<SNode>();
for (SNode node : Sequence.fromIterable(nodes)) {
SConcept concept = node.getConcept();
// todo replace targetScope.contains with SConcept check
if (concept.isValid() && targetScope.contains(concept.getDeclarationNode())) {
results.getSearchResults().add(new SearchResult(node, "language"));
}
if (monitor.isCanceled()) {
return results;
}
monitor.advance(1);
}
return results;
}
}