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