package jetbrains.mps.vcs.diff.changes; /*Generated by MPS */ import org.jetbrains.mps.openapi.model.SNodeId; import org.jetbrains.annotations.NotNull; import jetbrains.mps.vcs.diff.ChangeSet; import org.jetbrains.mps.openapi.language.SReferenceLink; import org.jetbrains.annotations.Nullable; import org.jetbrains.mps.openapi.model.SModelReference; import org.jetbrains.mps.openapi.model.SModel; import org.jetbrains.mps.openapi.model.SNode; import org.jetbrains.mps.openapi.model.SReference; import jetbrains.mps.smodel.DynamicReference; import jetbrains.mps.vcs.diff.StructChangeSet; import jetbrains.mps.smodel.StaticReference; public class SetReferenceStructChange extends SetReferenceChange { private final SNodeId myOppositeNodeId; public SetReferenceStructChange(@NotNull ChangeSet changeSet, @NotNull SNodeId sourceNodeId, SNodeId newSourceNodeId, @NotNull SReferenceLink role, @Nullable SModelReference targetModelReference, @Nullable SNodeId targetNodeId, @Nullable String resolveInfo) { super(changeSet, sourceNodeId, role, targetModelReference, targetNodeId, resolveInfo); myOppositeNodeId = newSourceNodeId; } @NotNull @Override public SNodeId getAffectedNodeId(boolean isNewModel) { return (isNewModel ? myOppositeNodeId : super.getAffectedNodeId(false)); } @Override public void apply(@NotNull SModel model, @NotNull NodeCopier nodeCopier) { assert model == getChangeSet().getOldModel(); SNode node = model.getNode(getAffectedNodeId(false)); assert node != null; if (getTargetNodeId() == null && getResolveInfo() == null) { node.setReferenceTarget(getRoleLink(), null); } else { SModelReference targetModelReference = (getTargetModelReference() == null ? model.getReference() : getTargetModelReference()); SReference reference; if (getTargetNodeId() == null) { reference = new DynamicReference(getRoleLink(), node, targetModelReference, getResolveInfo()); } else { // try to convert SNodeId StructChangeSet changeset = (StructChangeSet) getChangeSet(); SNodeId targetNodeId = getTargetNodeId(); SNodeId mapToOldId = changeset.mapToOldId(targetNodeId); if (mapToOldId != null && eq_xjb9w7_a0a4a0c0a4a3(targetModelReference, changeset.getNewModel().getReference())) { targetNodeId = mapToOldId; } reference = new StaticReference(getRoleLink(), node, targetModelReference, targetNodeId, getResolveInfo()); } node.setReferenceTarget(getRoleLink(), null); node.setReference(getRoleLink(), reference); } } @NotNull @Override protected ModelChange createOppositeChange() { SNode node = getChangeSet().getOldModel().getNode(getAffectedNodeId(false)); assert node != null; SReference ref = node.getReference(getRoleLink()); SModelReference targetModel = check_xjb9w7_a0d0e(ref); if (eq_xjb9w7_a0e0e(getChangeSet().getOldModel().getReference(), targetModel)) { // This is internal reference targetModel = null; } return new SetReferenceStructChange(getChangeSet().getOppositeChangeSet(), getAffectedNodeId(true), getAffectedNodeId(false), getRoleLink(), targetModel, check_xjb9w7_f0a6a4(ref), check_xjb9w7_g0a6a4(((jetbrains.mps.smodel.SReference) ref))); } private static boolean eq_xjb9w7_a0a4a0c0a4a3(Object a, Object b) { return (a != null ? a.equals(b) : a == b); } private static SModelReference check_xjb9w7_a0d0e(SReference checkedDotOperand) { if (null != checkedDotOperand) { return checkedDotOperand.getTargetSModelReference(); } return null; } private static boolean eq_xjb9w7_a0e0e(Object a, Object b) { return (a != null ? a.equals(b) : a == b); } private static SNodeId check_xjb9w7_f0a6a4(SReference checkedDotOperand) { if (null != checkedDotOperand) { return checkedDotOperand.getTargetNodeId(); } return null; } private static String check_xjb9w7_g0a6a4(jetbrains.mps.smodel.SReference checkedDotOperand) { if (null != checkedDotOperand) { return checkedDotOperand.getResolveInfo(); } return null; } }