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