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