package jetbrains.mps.ide.devkit.actions;
/*Generated by MPS */
import jetbrains.mps.plugins.relations.RelationDescriptor;
import javax.swing.Icon;
import jetbrains.mps.icons.MPSIcons;
import org.jetbrains.mps.openapi.model.SNode;
import jetbrains.mps.lang.smodel.generator.smodelAdapter.SNodeOperations;
import jetbrains.mps.smodel.adapter.structure.MetaAdapterFactory;
import org.jetbrains.annotations.Nullable;
import java.util.List;
import jetbrains.mps.ide.actions.nodes.GoToRulesHelper;
import jetbrains.mps.internal.collections.runtime.ListSequence;
import java.util.Comparator;
import jetbrains.mps.lang.smodel.generator.smodelAdapter.SLinkOperations;
import jetbrains.mps.smodel.behaviour.BHReflection;
import jetbrains.mps.core.aspects.behaviour.SMethodTrimmedId;
import org.jetbrains.mps.openapi.language.SConcept;
import jetbrains.mps.smodel.LanguageAspect;
import jetbrains.mps.kernel.language.ConceptAspectsHelper;
import jetbrains.mps.smodel.action.SNodeFactoryOperations;
import org.jetbrains.mps.openapi.language.SAbstractConcept;
public class Typesystem_TabDescriptor extends RelationDescriptor {
private static final Icon ICON = MPSIcons.Nodes.Type;
public Typesystem_TabDescriptor() {
}
public String getTitle() {
return "Typesystem";
}
public Character getShortcutChar() {
return 'T';
}
public int compareTo(RelationDescriptor descriptor) {
return new Typesystem_Order().compare(this, descriptor);
}
public void startListening() {
}
public SNode getBaseNode(SNode node) {
return ConceptEditorOpenHelper.getBaseNode(node);
}
public boolean isApplicable(SNode node) {
return SNodeOperations.isInstanceOf(node, MetaAdapterFactory.getConcept(0xc72da2b97cce4447L, 0x8389f407dc1158b7L, 0x1103553c5ffL, "jetbrains.mps.lang.structure.structure.AbstractConceptDeclaration"));
}
@Nullable
public Icon getIcon() {
return ICON;
}
public List<SNode> getNodes(SNode node) {
List<SNode> rules = GoToRulesHelper.getRules(node, true);
return ListSequence.fromList(rules).sort(new Comparator<SNode>() {
public int compare(SNode a, SNode b) {
boolean aConceptRef = SNodeOperations.isInstanceOf(SLinkOperations.getTarget(a, MetaAdapterFactory.getContainmentLink(0x7a5dda6291404668L, 0xab76d5ed1746f2b2L, 0x1117e7b5c73L, 0x1117e7b9c40L, "applicableNode")), MetaAdapterFactory.getConcept(0x7a5dda6291404668L, 0xab76d5ed1746f2b2L, 0x1117e2a88b3L, "jetbrains.mps.lang.typesystem.structure.ConceptReference"));
boolean bConceptRef = SNodeOperations.isInstanceOf(SLinkOperations.getTarget(b, MetaAdapterFactory.getContainmentLink(0x7a5dda6291404668L, 0xab76d5ed1746f2b2L, 0x1117e7b5c73L, 0x1117e7b9c40L, "applicableNode")), MetaAdapterFactory.getConcept(0x7a5dda6291404668L, 0xab76d5ed1746f2b2L, 0x1117e2a88b3L, "jetbrains.mps.lang.typesystem.structure.ConceptReference"));
// rules with concept references go first
if (aConceptRef && !(bConceptRef)) {
return 1;
}
if (!(aConceptRef) && bConceptRef) {
return -1;
}
// rules with concept references - more specific goes first
if (aConceptRef && bConceptRef) {
SNode aConcept = SLinkOperations.getTarget(SNodeOperations.cast(SLinkOperations.getTarget(a, MetaAdapterFactory.getContainmentLink(0x7a5dda6291404668L, 0xab76d5ed1746f2b2L, 0x1117e7b5c73L, 0x1117e7b9c40L, "applicableNode")), MetaAdapterFactory.getConcept(0x7a5dda6291404668L, 0xab76d5ed1746f2b2L, 0x1117e2a88b3L, "jetbrains.mps.lang.typesystem.structure.ConceptReference")), MetaAdapterFactory.getReferenceLink(0x7a5dda6291404668L, 0xab76d5ed1746f2b2L, 0x1117e2a88b3L, 0x1117e2ab6c9L, "concept"));
SNode bConcept = SLinkOperations.getTarget(SNodeOperations.cast(SLinkOperations.getTarget(b, MetaAdapterFactory.getContainmentLink(0x7a5dda6291404668L, 0xab76d5ed1746f2b2L, 0x1117e7b5c73L, 0x1117e7b9c40L, "applicableNode")), MetaAdapterFactory.getConcept(0x7a5dda6291404668L, 0xab76d5ed1746f2b2L, 0x1117e2a88b3L, "jetbrains.mps.lang.typesystem.structure.ConceptReference")), MetaAdapterFactory.getReferenceLink(0x7a5dda6291404668L, 0xab76d5ed1746f2b2L, 0x1117e2a88b3L, 0x1117e2ab6c9L, "concept"));
if (((boolean) (Boolean) BHReflection.invoke(aConcept, SMethodTrimmedId.create("isSubconceptOf", MetaAdapterFactory.getConcept(0xc72da2b97cce4447L, 0x8389f407dc1158b7L, 0x1103553c5ffL, "jetbrains.mps.lang.structure.structure.AbstractConceptDeclaration"), "73yVtVlWOga"), bConcept))) {
return 1;
}
if (((boolean) (Boolean) BHReflection.invoke(bConcept, SMethodTrimmedId.create("isSubconceptOf", MetaAdapterFactory.getConcept(0xc72da2b97cce4447L, 0x8389f407dc1158b7L, 0x1103553c5ffL, "jetbrains.mps.lang.structure.structure.AbstractConceptDeclaration"), "73yVtVlWOga"), aConcept))) {
return -1;
}
}
return 0;
}
}, false).toListSequence();
}
public boolean isSingle() {
return false;
}
public Iterable<SConcept> getAspectConcepts(final SNode node) {
return ConceptEditorHelper.getAvailableConceptAspects(LanguageAspect.TYPESYSTEM, node);
}
public SNode createAspect(final SNode node, final SConcept concept) {
return ConceptAspectsHelper.attachNewConceptAspect(LanguageAspect.TYPESYSTEM, node, SNodeFactoryOperations.createNewNode(SNodeFactoryOperations.asInstanceConcept(((SAbstractConcept) concept)), null));
}
}