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;
}
}