package jetbrains.mps.vcs.diff.changes; /*Generated by MPS */ import org.jetbrains.mps.openapi.language.SReferenceLink; import org.jetbrains.mps.openapi.model.SModelReference; import org.jetbrains.mps.openapi.model.SNodeId; import org.jetbrains.annotations.NotNull; import jetbrains.mps.vcs.diff.ChangeSet; import org.jetbrains.annotations.Nullable; import org.jetbrains.mps.openapi.model.SReference; import org.jetbrains.mps.openapi.model.SModel; import org.jetbrains.mps.openapi.model.SNode; import jetbrains.mps.smodel.DynamicReference; import jetbrains.mps.smodel.StaticReference; import org.jetbrains.mps.openapi.model.SNodeReference; import jetbrains.mps.lang.smodel.generator.smodelAdapter.SNodeOperations; import jetbrains.mps.smodel.adapter.structure.MetaAdapterFactory; import jetbrains.mps.lang.smodel.generator.smodelAdapter.AttributeOperations; import jetbrains.mps.lang.smodel.generator.smodelAdapter.IAttributeDescriptor; import jetbrains.mps.smodel.SNodePointer; import jetbrains.mps.baseLanguage.closures.runtime._FunctionTypes; public class SetReferenceChange extends NodeChange { private final SReferenceLink myRole; private final SModelReference myTargetModelReference; private final SNodeId myTargetNodeId; private final String myResolveInfo; private final boolean myResolveInfoOnly; public SetReferenceChange(@NotNull ChangeSet changeSet, @NotNull SNodeId sourceNodeId, @NotNull SReferenceLink role, @Nullable SModelReference targetModelReference, @Nullable SNodeId targetNodeId, @Nullable String resolveInfo) { super(changeSet, sourceNodeId); myRole = role; myTargetModelReference = targetModelReference; // if target node id is null and resolve info is not-null it's dynamic reference myTargetNodeId = targetNodeId; myResolveInfo = resolveInfo; // check if only resolve info for static reference changed - then it cannot conflict with other changes SReference oldRef = check_mgdhcs_a0i0f(changeSet.getOldModel().getNode(getAffectedNodeId(false)), myRole, this); myResolveInfoOnly = eq_mgdhcs_a0a0a9a5(check_mgdhcs_a0a0a9a5(oldRef), targetModelReference) && eq_mgdhcs_a0a0a9a5_0(check_mgdhcs_a0a0a9a5_0(oldRef), targetNodeId) && targetNodeId != null; } @NotNull public String getRole() { return myRole.getRoleName(); } @NotNull public SReferenceLink getRoleLink() { return myRole; } public boolean isAbout(SReferenceLink link) { return myRole.equals(link); } @Nullable public SModelReference getTargetModelReference() { return myTargetModelReference; } @Nullable public SNodeId getTargetNodeId() { return myTargetNodeId; } @Nullable public String getResolveInfo() { return myResolveInfo; } @Override public void apply(@NotNull SModel model, @NotNull NodeCopier nodeCopier) { SNode node = model.getNode(getAffectedNodeId()); assert node != null; if (myTargetNodeId == null && myResolveInfo == null) { node.setReferenceTarget(myRole, null); } else { SModelReference targetModelReference = (myTargetModelReference == null ? model.getReference() : myTargetModelReference); SReference reference; if (myTargetNodeId == null) { reference = new DynamicReference(myRole, node, targetModelReference, myResolveInfo); } else { reference = new StaticReference(myRole, node, targetModelReference, myTargetNodeId, myResolveInfo); } node.setReferenceTarget(myRole, null); node.setReference(myRole, reference); } } private SNodeReference myMergeHint = null; private boolean myMergeHintLoaded = false; @Nullable @Override public SNodeReference getMergeHint() { // get "nonconflicting" attribute in metamodel if (!(myMergeHintLoaded)) { myMergeHintLoaded = true; SNode n = getChangeSet().getOldModel().getNode(getAffectedNodeId(false)); SNode c = SNodeOperations.getConceptDeclaration(n); SNode linkDecl = SNodeOperations.as(myRole.getDeclarationNode(), MetaAdapterFactory.getConcept(0xc72da2b97cce4447L, 0x8389f407dc1158b7L, 0xf979bd086aL, "jetbrains.mps.lang.structure.structure.LinkDeclaration")); SNode hint = AttributeOperations.getAttribute(linkDecl, new IAttributeDescriptor.NodeAttribute(MetaAdapterFactory.getConcept(0x37e03aa1728949bcL, 0x826930de5eceec76L, 0x657f08af7deb331aL, "jetbrains.mps.vcs.mergehints.structure.MergeHint"))); if ((hint == null)) { hint = AttributeOperations.getAttribute(c, new IAttributeDescriptor.NodeAttribute(MetaAdapterFactory.getConcept(0x37e03aa1728949bcL, 0x826930de5eceec76L, 0x657f08af7deb331aL, "jetbrains.mps.vcs.mergehints.structure.MergeHint"))); } if ((hint != null)) { myMergeHint = new SNodePointer(hint); } } return myMergeHint; } @Override public boolean isNonConflicting() { return myResolveInfoOnly || super.isNonConflicting(); } @Override public String toString() { String targetString = (myTargetModelReference == null ? "" + myTargetNodeId : String.format("%s|%s", myTargetModelReference, myTargetNodeId)); return String.format("Set reference in role %s for node %s to %s [resolveInfo=%s]", myRole, getAffectedNodeId(false), targetString, myResolveInfo); } @Override public String getDescription() { // TODO consider dynamic references SReference oldRef = getChangeSet().getOldModel().getNode(getAffectedNodeId(false)).getReference(myRole); SReference newRef = getChangeSet().getNewModel().getNode(getAffectedNodeId(true)).getReference(myRole); if (oldRef == null) { return String.format("Added %s reference", myRole); } if (newRef == null) { return String.format("Removed %s reference", myRole); } String what = "target"; _FunctionTypes._return_P1_E0<? extends String, ? super SReference> formatRef = null; if (neq_mgdhcs_a0h0s(oldRef.getTargetSModelReference(), newRef.getTargetSModelReference())) { formatRef = new _FunctionTypes._return_P1_E0<String, SReference>() { public String invoke(SReference ref) { return String.format("[model=%s,\n id=%s, resolveInfo=%s]", ref.getTargetSModelReference(), ref.getTargetNodeId(), ((jetbrains.mps.smodel.SReference) ref).getResolveInfo()); } }; } else if (neq_mgdhcs_a0a7a81(oldRef.getTargetNodeId(), newRef.getTargetNodeId())) { formatRef = new _FunctionTypes._return_P1_E0<String, SReference>() { public String invoke(SReference ref) { return String.format("[id=%s, resolveInfo=%s]", ref.getTargetNodeId(), ref.getTargetNodeId()); } }; } else if (neq_mgdhcs_a0b7a81(((jetbrains.mps.smodel.SReference) oldRef).getResolveInfo(), ((jetbrains.mps.smodel.SReference) newRef).getResolveInfo())) { what = "resolve info"; formatRef = new _FunctionTypes._return_P1_E0<String, SReference>() { public String invoke(SReference ref) { return String.format("'%s'", ((jetbrains.mps.smodel.SReference) ref).getResolveInfo()); } }; } if (formatRef == null) { return toString(); } else { return String.format("Changed %s reference %s from\n %s\n to\n %s", myRole, what, formatRef.invoke(oldRef), formatRef.invoke(newRef)); } } @NotNull @Override protected ModelChange createOppositeChange() { SNode node = getChangeSet().getOldModel().getNode(getAffectedNodeId(false)); assert node != null; SReference ref = node.getReference(getRoleLink()); SModelReference targetModel = check_mgdhcs_a0d0t(ref); if (eq_mgdhcs_a0e0t(getChangeSet().getOldModel().getReference(), targetModel)) { // This is internal reference targetModel = null; } return new SetReferenceChange(getChangeSet().getOppositeChangeSet(), getAffectedNodeId(true), myRole, targetModel, check_mgdhcs_e0a6a91(ref), check_mgdhcs_f0a6a91(((jetbrains.mps.smodel.SReference) ref))); } private static SReference check_mgdhcs_a0i0f(SNode checkedDotOperand, SReferenceLink myRole, SetReferenceChange checkedDotThisExpression) { if (null != checkedDotOperand) { return checkedDotOperand.getReference(myRole); } return null; } private static boolean eq_mgdhcs_a0a0a9a5(Object a, Object b) { return (a != null ? a.equals(b) : a == b); } private static SModelReference check_mgdhcs_a0a0a9a5(SReference checkedDotOperand) { if (null != checkedDotOperand) { return checkedDotOperand.getTargetSModelReference(); } return null; } private static boolean eq_mgdhcs_a0a0a9a5_0(Object a, Object b) { return (a != null ? a.equals(b) : a == b); } private static SNodeId check_mgdhcs_a0a0a9a5_0(SReference checkedDotOperand) { if (null != checkedDotOperand) { return checkedDotOperand.getTargetNodeId(); } return null; } private static boolean neq_mgdhcs_a0h0s(Object a, Object b) { return !(((a != null ? a.equals(b) : a == b))); } private static boolean neq_mgdhcs_a0a7a81(Object a, Object b) { return !(((a != null ? a.equals(b) : a == b))); } private static boolean neq_mgdhcs_a0b7a81(Object a, Object b) { return !(((a != null ? a.equals(b) : a == b))); } private static SModelReference check_mgdhcs_a0d0t(SReference checkedDotOperand) { if (null != checkedDotOperand) { return checkedDotOperand.getTargetSModelReference(); } return null; } private static boolean eq_mgdhcs_a0e0t(Object a, Object b) { return (a != null ? a.equals(b) : a == b); } private static SNodeId check_mgdhcs_e0a6a91(SReference checkedDotOperand) { if (null != checkedDotOperand) { return checkedDotOperand.getTargetNodeId(); } return null; } private static String check_mgdhcs_f0a6a91(jetbrains.mps.smodel.SReference checkedDotOperand) { if (null != checkedDotOperand) { return checkedDotOperand.getResolveInfo(); } return null; } }