package jetbrains.mps.lang.generator.constraints;
/*Generated by MPS */
import jetbrains.mps.smodel.search.AbstractSearchScope;
import org.jetbrains.mps.openapi.model.SModel;
import java.util.List;
import org.jetbrains.mps.openapi.model.SNode;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.mps.util.Condition;
import java.util.ArrayList;
import jetbrains.mps.smodel.search.ISearchScope;
import jetbrains.mps.smodel.search.SModelSearchUtil;
import jetbrains.mps.smodel.SModelStereotype;
import org.jetbrains.mps.openapi.language.SLanguage;
import jetbrains.mps.smodel.adapter.structure.MetaAdapterFactory;
public class MappingRuleTemplateNodeSearchScope extends AbstractSearchScope {
private SModel myModel;
private List<SNode> myOwnNodes;
public MappingRuleTemplateNodeSearchScope(SModel model) {
myModel = model;
}
@NotNull
@Override
public List<SNode> getNodes(Condition<SNode> condition) {
if (condition == Condition.FALSE_CONDITION) {
return new ArrayList<SNode>();
}
ensureInitialized();
if (condition == Condition.TRUE_CONDITION) {
return myOwnNodes;
}
List<SNode> resut = new ArrayList<SNode>();
for (SNode node : myOwnNodes) {
if (condition.met(node)) {
resut.add(node);
}
}
return resut;
}
private void ensureInitialized() {
if (myOwnNodes == null) {
ISearchScope searchScope = SModelSearchUtil.createModelAndImportedModelsScope(myModel, true);
Condition<SNode> condition = new Condition<SNode>() {
@Override
public boolean met(SNode object) {
if (!(SModelStereotype.isGeneratorModel(object.getModel()))) {
return false;
}
// not instance of concepts from TLBase language (like TemplateDeclaration, MappingConfiguration etc.)
SLanguage language = object.getConcept().getLanguage();
return !(language.equals(MetaAdapterFactory.getLanguage(0xb401a68083254110L, 0x8fd384331ff25befL, "jetbrains.mps.lang.generator")));
}
};
myOwnNodes = searchScope.getNodes(condition);
}
}
}