package jetbrains.mps.ide.findusages.model;
/*Generated by MPS */
import jetbrains.mps.findUsages.UsagesList;
import java.util.Set;
import java.util.List;
import java.util.HashSet;
import java.util.ArrayList;
import org.jetbrains.mps.openapi.model.SModel;
import java.util.LinkedHashSet;
import org.jetbrains.mps.openapi.model.SNode;
public class SearchResults<T> implements UsagesList {
private final Set<Object> mySearchedNodes;
private List<SearchResult<T>> mySearchResults;
public SearchResults() {
mySearchedNodes = new HashSet<Object>();
mySearchResults = new ArrayList<SearchResult<T>>();
}
public SearchResults(Set<?> searchedNodes, List<SearchResult<T>> searchResults) {
mySearchedNodes = new HashSet<Object>(searchedNodes);
mySearchResults = searchResults;
}
public Set<Object> getSearchedNodes() {
// mySearchNodes lists elements we looked for; elements our results 'derived' from. They are not necessarily of the same
// kind as our results, hence we use <?>, not <T> (I don't feel there's reason introduce <E> as it
// (a) limits where we can look; (b) complicates the code
return mySearchedNodes;
}
public List<SearchResult<T>> getSearchResults() {
return mySearchResults;
}
public Set<T> getResultObjects() {
Set<T> resultObjects = new HashSet<T>();
for (SearchResult<T> searchResult : mySearchResults) {
resultObjects.add(searchResult.getObject());
}
return resultObjects;
}
public void add(SearchResult<T> r) {
mySearchResults.add(r);
}
public void addAll(SearchResults<T> sr) {
mySearchedNodes.addAll(sr.mySearchedNodes);
mySearchResults.addAll(sr.mySearchResults);
}
@Override
public Set<SModel> getAffectedModels() {
LinkedHashSet<SModel> result = new LinkedHashSet<SModel>();
for (SearchResult searchResult : mySearchResults) {
Object resultObject = searchResult.getObject();
if (resultObject instanceof SNode) {
SModel model = ((SNode) resultObject).getModel();
if (model != null) {
result.add(model);
}
} else
if (resultObject instanceof SModel && resultObject != null) {
result.add((SModel) resultObject);
}
}
return result;
}
public void remove(T node) {
for (SearchResult result : new ArrayList<SearchResult>(mySearchResults)) {
if (result.getObject() == node) {
mySearchResults.remove(result);
}
}
}
public void remove(SearchResult<T> searchResult) {
mySearchResults.remove(searchResult);
}
public List<SearchResult<T>> getAliveResults() {
List<SearchResult<T>> alive = new ArrayList<SearchResult<T>>();
for (SearchResult result : mySearchResults) {
if (result.getObject() != null) {
alive.add(result);
}
}
return alive;
}
public Set<?> getAliveNodes() {
Set<Object> alive = new HashSet<Object>();
for (Object node : mySearchedNodes) {
if (node != null) {
alive.add(node);
}
}
return alive;
}
public void removeDuplicates() {
mySearchResults = new ArrayList<SearchResult<T>>(new LinkedHashSet<SearchResult<T>>(mySearchResults));
}
}