package jetbrains.mps.smodel.search;
/*Generated by MPS */
import org.apache.log4j.Logger;
import org.apache.log4j.LogManager;
import org.jetbrains.mps.openapi.model.SModel;
import java.util.List;
import org.jetbrains.annotations.NotNull;
import java.util.ArrayList;
import jetbrains.mps.smodel.SModelOperations;
import org.jetbrains.mps.openapi.model.SNode;
import org.jetbrains.mps.util.Condition;
import org.jetbrains.mps.openapi.model.SNodeUtil;
public class ModelAndImportedModelsScope extends AbstractSearchScope {
private static final Logger LOG = LogManager.getLogger(ModelAndImportedModelsScope.class);
private SModel myModel;
private boolean myRootsOnly;
private List<SModel> myModels;
public ModelAndImportedModelsScope(SModel model, boolean rootsOnly) {
myModel = model;
myRootsOnly = rootsOnly;
}
@NotNull
public List<SModel> getModels() {
if (myModels == null) {
if (myModel == null) {
myModels = new ArrayList<SModel>(1);
} else {
myModels = SModelOperations.allImportedModels(myModel);
myModels.add(0, myModel);
}
}
return myModels;
}
@NotNull
@Override
public List<SNode> getNodes(Condition<SNode> condition) {
List<? extends SModel> models = getModels();
List<SNode> result = new ArrayList<SNode>();
if (myRootsOnly) {
for (SModel model : models) {
for (SNode root : model.getRootNodes()) {
if (condition.met(root)) {
result.add(root);
}
}
}
} else {
for (SModel model : models) {
try {
if (model == null) {
continue;
}
for (SNode node : SNodeUtil.getDescendants(model)) {
if (condition.met(node)) {
result.add(node);
}
}
} catch (Throwable t) {
LOG.error("error collecting nodes form model " + model, t);
}
}
}
return result;
}
}