package jetbrains.mps.ide.devkit.actions;
/*Generated by MPS */
import java.util.List;
import org.jetbrains.mps.openapi.language.SConcept;
import org.jetbrains.mps.openapi.language.SLanguage;
import org.jetbrains.mps.openapi.model.SNode;
import jetbrains.mps.internal.collections.runtime.ListSequence;
import java.util.ArrayList;
import org.jetbrains.mps.openapi.language.SAbstractConcept;
import jetbrains.mps.lang.smodel.generator.smodelAdapter.SConceptOperations;
import jetbrains.mps.lang.smodel.generator.smodelAdapter.SNodeOperations;
import jetbrains.mps.smodel.adapter.structure.MetaAdapterFactory;
import jetbrains.mps.smodel.behaviour.BHReflection;
import jetbrains.mps.core.aspects.behaviour.SMethodTrimmedId;
import jetbrains.mps.smodel.LanguageAspect;
import jetbrains.mps.internal.collections.runtime.CollectionSequence;
import jetbrains.mps.internal.collections.runtime.ISelector;
import jetbrains.mps.internal.collections.runtime.Sequence;
public class ConceptEditorHelper {
public static List<SConcept> getAvailableConceptAspects(SLanguage l, SNode node) {
List<SConcept> result = ListSequence.fromList(new ArrayList<SConcept>());
for (SAbstractConcept c : l.getConcepts()) {
if (c.isAbstract()) {
continue;
}
if (!((c instanceof SConcept))) {
continue;
}
if (!(((SConcept) c).isRootable())) {
continue;
}
if (!(SConceptOperations.isSubConceptOf(SNodeOperations.asSConcept(c), MetaAdapterFactory.getInterfaceConcept(0xc72da2b97cce4447L, 0x8389f407dc1158b7L, 0x24614259e94f0c84L, "jetbrains.mps.lang.structure.structure.IConceptAspect")))) {
continue;
}
if (((boolean) (Boolean) BHReflection.invoke(SNodeOperations.asSConcept(SNodeOperations.castConcept(c, MetaAdapterFactory.getInterfaceConcept(0xc72da2b97cce4447L, 0x8389f407dc1158b7L, 0x24614259e94f0c84L, "jetbrains.mps.lang.structure.structure.IConceptAspect"))), SMethodTrimmedId.create("canBeAppliedToNode", null, "7IH442d05tK"), node))) {
ListSequence.fromList(result).addElement(((SConcept) c));
}
}
return result;
}
public static List<SConcept> getAvailableConceptAspects(LanguageAspect aspect, SNode node) {
// [MM] this LanguageAspect usage is reviewed
List<SConcept> result = ListSequence.fromList(new ArrayList<SConcept>());
for (SLanguage slang : CollectionSequence.fromCollection(aspect.getMainLanguages())) {
ListSequence.fromList(result).addSequence(ListSequence.fromList(getAvailableConceptAspects(slang, node)));
}
return result;
}
public static List<SNode> sortRootsByConcept(List<SNode> roots, final SAbstractConcept[] conceptOrder) {
return ListSequence.fromList(roots).sort(new ISelector<SNode, Integer>() {
public Integer select(SNode root) {
int conceptIndex = Sequence.fromIterable(Sequence.fromArray(conceptOrder)).indexOf(SNodeOperations.getConcept(root));
return (conceptIndex == -1 ? conceptOrder.length : conceptIndex);
}
}, true).toListSequence();
}
}