package jetbrains.mps.baseLanguage.collections.plugin;
/*Generated by MPS */
import java.util.List;
import jetbrains.mps.baseLanguage.closures.runtime._FunctionTypes;
import org.jetbrains.mps.openapi.model.SNode;
import org.jetbrains.mps.openapi.module.SRepository;
import jetbrains.mps.internal.collections.runtime.ListSequence;
import java.util.ArrayList;
import jetbrains.mps.smodel.structure.ExtensionPoint;
import org.jetbrains.mps.openapi.model.SModel;
import org.jetbrains.mps.openapi.module.SModule;
import jetbrains.mps.project.dependency.GlobalModuleDependenciesManager;
import jetbrains.mps.smodel.Language;
import jetbrains.mps.internal.collections.runtime.Sequence;
import jetbrains.mps.internal.collections.runtime.IWhereFilter;
import jetbrains.mps.lang.smodel.generator.smodelAdapter.SNodeOperations;
import jetbrains.mps.internal.collections.runtime.ITranslator2;
import jetbrains.mps.lang.smodel.generator.smodelAdapter.SLinkOperations;
import jetbrains.mps.smodel.adapter.structure.MetaAdapterFactory;
public class CustomContainersRegistry {
/*package*/ static CustomContainersRegistry INSTANCE = new CustomContainersRegistry();
private List<_FunctionTypes._return_P1_E0<? extends List<SNode>, ? super SRepository>> providers = ListSequence.fromList(new ArrayList<_FunctionTypes._return_P1_E0<? extends List<SNode>, ? super SRepository>>());
private CustomContainersRegistry() {
for (_FunctionTypes._return_P1_E0<? extends List<SNode>, ? super SRepository> provider : new ExtensionPoint<_FunctionTypes._return_P1_E0<? extends List<SNode>, ? super SRepository>>("jetbrains.mps.baseLanguage.collections.customContainers").getObjects()) {
ListSequence.fromList(providers).addElement(provider);
}
}
public List<SNode> accessibleCustomContainerDeclarations(SModel fromModel) {
List<SNode> res = new ArrayList<SNode>();
SModule om = this.getOwningModule(fromModel);
if (om != null) {
final Iterable<SModule> allVisibleModules = new GlobalModuleDependenciesManager(om).getModules(GlobalModuleDependenciesManager.Deptype.VISIBLE);
final Iterable<Language> allUsedLanguages = new GlobalModuleDependenciesManager(om).getUsedLanguages();
Iterable<SNode> allCustomContainers = this.primAllCustomContainers(fromModel.getRepository());
ListSequence.fromList(res).addSequence(Sequence.fromIterable(allCustomContainers).where(new IWhereFilter<SNode>() {
public boolean accept(SNode cc) {
SModule owner = CustomContainersRegistry.this.getOwningModule(SNodeOperations.getModel(cc));
return Sequence.fromIterable(allVisibleModules).contains(owner) || (owner instanceof Language && Sequence.fromIterable(allUsedLanguages).contains((Language) owner));
}
}).translate(new ITranslator2<SNode, SNode>() {
public Iterable<SNode> translate(SNode cc) {
return SLinkOperations.getChildren(cc, MetaAdapterFactory.getContainmentLink(0x8388864671ce4f1cL, 0x9c53c54016f6ad4fL, 0x54a5d587c1f3c84cL, 0x54a5d587c1f3c84eL, "containerDeclaration"));
}
}));
}
return res;
}
public SModule getOwningModule(SModel model) {
SModel fmdesc = model;
return (fmdesc != null ? fmdesc.getModule() : null);
}
private Iterable<SNode> primAllCustomContainers(final SRepository repo) {
List<_FunctionTypes._return_P1_E0<? extends List<SNode>, ? super SRepository>> providersCopy;
synchronized (this) {
providersCopy = ListSequence.fromListWithValues(new ArrayList<_FunctionTypes._return_P1_E0<? extends List<SNode>, ? super SRepository>>(), this.providers);
}
return ListSequence.fromList(providersCopy).translate(new ITranslator2<_FunctionTypes._return_P1_E0<? extends List<SNode>, ? super SRepository>, SNode>() {
public Iterable<SNode> translate(_FunctionTypes._return_P1_E0<? extends List<SNode>, ? super SRepository> prov) {
return prov.invoke(repo);
}
});
}
}