package jetbrains.mps.baseLanguage.tuples.constraints; /*Generated by MPS */ import org.jetbrains.mps.openapi.model.SNode; import jetbrains.mps.internal.collections.runtime.ListSequence; import java.util.List; import java.util.ArrayList; import jetbrains.mps.internal.collections.runtime.Sequence; import jetbrains.mps.baseLanguage.behavior.Classifier__BehaviorDescriptor; import jetbrains.mps.lang.smodel.generator.smodelAdapter.SLinkOperations; import jetbrains.mps.smodel.adapter.structure.MetaAdapterFactory; import jetbrains.mps.lang.smodel.generator.smodelAdapter.SNodeOperations; import jetbrains.mps.lang.smodel.generator.smodelAdapter.SPropertyOperations; import jetbrains.mps.lang.pattern.util.MatchingUtil; import jetbrains.mps.internal.collections.runtime.IEnumerator; import jetbrains.mps.internal.collections.runtime.ISelector; import jetbrains.mps.baseLanguage.tuples.runtime.MultiTuple; public class TupleIntefaceUtils { public TupleIntefaceUtils() { } public static boolean isTupleInterface(SNode ifc) { return ListSequence.fromList(analyzeTupleInterface(ifc)).isNotEmpty(); } public static List<Property> analyzeTupleInterface(SNode ifc) { List<Property> accessors = ListSequence.fromList(new ArrayList<Property>()); List<Property> mutators = ListSequence.fromList(new ArrayList<Property>()); int ignored = 0; for (SNode method : Sequence.fromIterable(Classifier__BehaviorDescriptor.methods_id4_LVZ3pBKCn.invoke(ifc))) { if (ListSequence.fromList(SLinkOperations.getChildren(method, MetaAdapterFactory.getContainmentLink(0xf3061a5392264cc5L, 0xa443f952ceaf5816L, 0xf8cc56b1fcL, 0xf8cc56b1feL, "parameter"))).isEmpty() && !(SNodeOperations.isInstanceOf(SLinkOperations.getTarget(method, MetaAdapterFactory.getContainmentLink(0xf3061a5392264cc5L, 0xa443f952ceaf5816L, 0xf8cc56b1fcL, 0xf8cc56b1fdL, "returnType")), MetaAdapterFactory.getConcept(0xf3061a5392264cc5L, 0xa443f952ceaf5816L, 0xf8cc6bf96dL, "jetbrains.mps.baseLanguage.structure.VoidType")))) { ListSequence.fromList(accessors).addElement(new Property(true, SPropertyOperations.getString(method, MetaAdapterFactory.getProperty(0xceab519525ea4f22L, 0x9b92103b95ca8c0cL, 0x110396eaaa4L, 0x110396ec041L, "name")), SLinkOperations.getTarget(method, MetaAdapterFactory.getContainmentLink(0xf3061a5392264cc5L, 0xa443f952ceaf5816L, 0xf8cc56b1fcL, 0xf8cc56b1fdL, "returnType")))); } else if (ListSequence.fromList(SLinkOperations.getChildren(method, MetaAdapterFactory.getContainmentLink(0xf3061a5392264cc5L, 0xa443f952ceaf5816L, 0xf8cc56b1fcL, 0xf8cc56b1feL, "parameter"))).count() == 1 && MatchingUtil.matchNodes(SLinkOperations.getTarget(method, MetaAdapterFactory.getContainmentLink(0xf3061a5392264cc5L, 0xa443f952ceaf5816L, 0xf8cc56b1fcL, 0xf8cc56b1fdL, "returnType")), ListSequence.fromList(SLinkOperations.getChildren(method, MetaAdapterFactory.getContainmentLink(0xf3061a5392264cc5L, 0xa443f952ceaf5816L, 0xf8cc56b1fcL, 0xf8cc56b1feL, "parameter"))).toListSequence().first())) { ListSequence.fromList(mutators).addElement(new Property(true, SPropertyOperations.getString(method, MetaAdapterFactory.getProperty(0xceab519525ea4f22L, 0x9b92103b95ca8c0cL, 0x110396eaaa4L, 0x110396ec041L, "name")), SLinkOperations.getTarget(method, MetaAdapterFactory.getContainmentLink(0xf3061a5392264cc5L, 0xa443f952ceaf5816L, 0xf8cc56b1fcL, 0xf8cc56b1fdL, "returnType")))); } else if ("equals".equals(SPropertyOperations.getString(method, MetaAdapterFactory.getProperty(0xceab519525ea4f22L, 0x9b92103b95ca8c0cL, 0x110396eaaa4L, 0x110396ec041L, "name"))) && ListSequence.fromList(SLinkOperations.getChildren(method, MetaAdapterFactory.getContainmentLink(0xf3061a5392264cc5L, 0xa443f952ceaf5816L, 0xf8cc56b1fcL, 0xf8cc56b1feL, "parameter"))).count() == 1 && SNodeOperations.isInstanceOf(SLinkOperations.getTarget(method, MetaAdapterFactory.getContainmentLink(0xf3061a5392264cc5L, 0xa443f952ceaf5816L, 0xf8cc56b1fcL, 0xf8cc56b1fdL, "returnType")), MetaAdapterFactory.getConcept(0xf3061a5392264cc5L, 0xa443f952ceaf5816L, 0xf940d6513eL, "jetbrains.mps.baseLanguage.structure.BooleanType"))) { ignored++; } else if ("hashCode".equals(SPropertyOperations.getString(method, MetaAdapterFactory.getProperty(0xceab519525ea4f22L, 0x9b92103b95ca8c0cL, 0x110396eaaa4L, 0x110396ec041L, "name"))) && ListSequence.fromList(SLinkOperations.getChildren(method, MetaAdapterFactory.getContainmentLink(0xf3061a5392264cc5L, 0xa443f952ceaf5816L, 0xf8cc56b1fcL, 0xf8cc56b1feL, "parameter"))).isEmpty() && SNodeOperations.isInstanceOf(SLinkOperations.getTarget(method, MetaAdapterFactory.getContainmentLink(0xf3061a5392264cc5L, 0xa443f952ceaf5816L, 0xf8cc56b1fcL, 0xf8cc56b1fdL, "returnType")), MetaAdapterFactory.getConcept(0xf3061a5392264cc5L, 0xa443f952ceaf5816L, 0xf940d22479L, "jetbrains.mps.baseLanguage.structure.IntegerType"))) { ignored++; } } List<Property> result = null; IEnumerator<Property> ait = ListSequence.fromList(accessors).sort(new ISelector<Property, String>() { public String select(Property p) { return p.name(); } }, true).enumerator(); IEnumerator<Property> mit = ListSequence.fromList(mutators).sort(new ISelector<Property, String>() { public String select(Property p) { return p.name(); } }, true).enumerator(); boolean hasMutators = mit.moveNext(); while (ait.moveNext()) { if (result == null) { result = ListSequence.fromList(new ArrayList<Property>()); } while (hasMutators && ait.current().name().compareTo(mit.current().name()) < 0) { hasMutators = mit.moveNext(); } if (hasMutators && ait.current().name().equals(mit.current().name())) { if (!(MatchingUtil.matchNodes(ait.current().type(), mit.current().type()))) { return null; } ait.current().isfinal(false); } ListSequence.fromList(result).addElement(ait.current()); } if (mit.moveNext()) { return null; } return result; } public static class Property extends MultiTuple._3<Boolean, String, SNode> { public Property() { super(); } public Property(Boolean isfinal, String name, SNode type) { super(isfinal, name, type); } public Boolean isfinal(Boolean value) { return super._0(value); } public String name(String value) { return super._1(value); } public SNode type(SNode value) { return super._2(value); } public Boolean isfinal() { return super._0(); } public String name() { return super._1(); } public SNode type() { return super._2(); } } }