package jetbrains.mps.lang.structure.constraints; /*Generated by MPS */ import org.jetbrains.mps.openapi.model.SNode; import org.jetbrains.mps.openapi.language.SAbstractConcept; import org.jetbrains.mps.openapi.module.SModule; import java.util.Set; import jetbrains.mps.smodel.Language; import jetbrains.mps.internal.collections.runtime.SetSequence; import java.util.HashSet; import jetbrains.mps.internal.collections.runtime.CollectionSequence; import jetbrains.mps.project.dependency.GlobalModuleDependenciesManager; import java.util.Collection; import org.jetbrains.mps.openapi.model.SModel; import jetbrains.mps.internal.collections.runtime.ISelector; import jetbrains.mps.internal.collections.runtime.ITranslator2; import jetbrains.mps.internal.collections.runtime.IWhereFilter; import jetbrains.mps.lang.smodel.generator.smodelAdapter.SModuleOperations; import jetbrains.mps.internal.collections.runtime.Sequence; import jetbrains.mps.lang.smodel.generator.smodelAdapter.SNodeOperations; import jetbrains.mps.smodel.adapter.structure.MetaAdapterFactory; import java.util.Collections; import java.util.Deque; import jetbrains.mps.internal.collections.runtime.DequeSequence; import java.util.LinkedList; import org.jetbrains.mps.openapi.module.SModuleReference; public class Concepts { public static Iterable<SNode> getAvailableConcepts(SNode contextNode, final SAbstractConcept metaConcept) { SModule contextModule = contextNode.getModel().getModule(); Set<Language> contextLanguages = SetSequence.fromSet(new HashSet<Language>()); for (SModule module : CollectionSequence.fromCollection(new GlobalModuleDependenciesManager(contextModule).getModules(GlobalModuleDependenciesManager.Deptype.VISIBLE))) { if (module instanceof Language) { SetSequence.fromSet(contextLanguages).addElement((Language) module); } } Collection<Language> usedLanguages = new GlobalModuleDependenciesManager(contextModule).getUsedLanguages(); Iterable<SModel> strucModels = SetSequence.fromSet(contextLanguages).select(new ISelector<Language, SModel>() { public SModel select(Language it) { return it.getStructureModelDescriptor(); } }).union(CollectionSequence.fromCollection(usedLanguages).translate(new ITranslator2<Language, SModel>() { public Iterable<SModel> translate(Language it) { return it.getAccessoryModels(); } }).where(new IWhereFilter<SModel>() { public boolean accept(SModel it) { return SModuleOperations.isAspect(it, "structure"); } })).where(new IWhereFilter<SModel>() { public boolean accept(SModel it) { return it != null; } }); return Sequence.fromIterable(strucModels).translate(new ITranslator2<SModel, SNode>() { public Iterable<SNode> translate(SModel it) { return (Iterable<SNode>) it.getRootNodes(); } }).where(new IWhereFilter<SNode>() { public boolean accept(SNode it) { return SNodeOperations.isInstanceOf(it, SNodeOperations.asSConcept(metaConcept)); } }).select(new ISelector<SNode, SNode>() { public SNode select(SNode it) { return SNodeOperations.cast(it, MetaAdapterFactory.getInterfaceConcept(0xceab519525ea4f22L, 0x9b92103b95ca8c0cL, 0x110396eaaa4L, "jetbrains.mps.lang.core.structure.INamedConcept")); } }); } public static Iterable<SNode> getAvailableLanguageConcepts(SNode contextNode, final SAbstractConcept metaConcept) { Language language = as_v88qdx_a0a0a1(SNodeOperations.getModel(contextNode).getModule(), Language.class); if (language == null) { return Collections.emptyList(); } Deque<Language> languagesToVisit = DequeSequence.fromDequeNew(new LinkedList<Language>()); Set<Language> visibleLanguages = SetSequence.fromSet(new HashSet<Language>()); DequeSequence.fromDequeNew(languagesToVisit).addLastElement(language); SetSequence.fromSet(visibleLanguages).addElement(language); while (DequeSequence.fromDequeNew(languagesToVisit).isNotEmpty()) { Language nextLanguage = DequeSequence.fromDequeNew(languagesToVisit).removeFirstElement(); for (SModuleReference extendedLangRef : SetSequence.fromSet(nextLanguage.getExtendedLanguageRefs())) { Language extendedLanguage = as_v88qdx_a0a0a1a7a1(extendedLangRef.resolve(nextLanguage.getRepository()), Language.class); if (extendedLanguage != null && !(SetSequence.fromSet(visibleLanguages).contains(extendedLanguage))) { SetSequence.fromSet(visibleLanguages).addElement(extendedLanguage); DequeSequence.fromDequeNew(languagesToVisit).addLastElement(extendedLanguage); } } } return SetSequence.fromSet(visibleLanguages).select(new ISelector<Language, SModel>() { public SModel select(Language it) { return it.getStructureModelDescriptor(); } }).where(new IWhereFilter<SModel>() { public boolean accept(SModel it) { return it != null; } }).translate(new ITranslator2<SModel, SNode>() { public Iterable<SNode> translate(SModel it) { return (Iterable<SNode>) it.getRootNodes(); } }).where(new IWhereFilter<SNode>() { public boolean accept(SNode it) { return SNodeOperations.isInstanceOf(it, SNodeOperations.asSConcept(metaConcept)); } }).select(new ISelector<SNode, SNode>() { public SNode select(SNode it) { return SNodeOperations.cast(it, MetaAdapterFactory.getInterfaceConcept(0xceab519525ea4f22L, 0x9b92103b95ca8c0cL, 0x110396eaaa4L, "jetbrains.mps.lang.core.structure.INamedConcept")); } }); } public static Iterable<SNode> getConceptsInSameLanguage(SModel model, final SAbstractConcept metaConcept) { Language language = as_v88qdx_a0a0a3(model.getModule(), Language.class); if (language == null) { return Collections.emptyList(); } SModel structureModelDescriptor = language.getStructureModelDescriptor(); if (structureModelDescriptor == null) { return Collections.emptyList(); } Iterable<SNode> nodes = (Iterable<SNode>) structureModelDescriptor.getRootNodes(); return Sequence.fromIterable(nodes).where(new IWhereFilter<SNode>() { public boolean accept(SNode it) { return SNodeOperations.isInstanceOf(it, SNodeOperations.asSConcept(metaConcept)); } }).select(new ISelector<SNode, SNode>() { public SNode select(SNode it) { return SNodeOperations.cast(it, MetaAdapterFactory.getInterfaceConcept(0xceab519525ea4f22L, 0x9b92103b95ca8c0cL, 0x110396eaaa4L, "jetbrains.mps.lang.core.structure.INamedConcept")); } }); } private static <T> T as_v88qdx_a0a0a1(Object o, Class<T> type) { return (type.isInstance(o) ? (T) o : null); } private static <T> T as_v88qdx_a0a0a1a7a1(Object o, Class<T> type) { return (type.isInstance(o) ? (T) o : null); } private static <T> T as_v88qdx_a0a0a3(Object o, Class<T> type) { return (type.isInstance(o) ? (T) o : null); } }