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