package jetbrains.mps.vcs.diff.changes; /*Generated by MPS */ import org.jetbrains.mps.openapi.language.SProperty; import org.jetbrains.mps.openapi.model.SNodeReference; import org.jetbrains.annotations.NotNull; import jetbrains.mps.vcs.diff.ChangeSet; import org.jetbrains.mps.openapi.model.SNodeId; import org.jetbrains.annotations.Nullable; import org.jetbrains.mps.openapi.model.SNode; 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 org.jetbrains.mps.openapi.model.SModel; public class SetPropertyChange extends NodeChange { private SProperty myProperty; private String myNewValue; private SNodeReference myMergeHint = null; private boolean myMergeHintLoaded = false; public SetPropertyChange(@NotNull ChangeSet changeSet, @NotNull SNodeId nodeId, SProperty property, String newValue) { super(changeSet, nodeId); myProperty = property; myNewValue = newValue; } @NotNull public String getPropertyName() { return myProperty.getName(); } public SProperty getProperty() { return myProperty; } public boolean isAbout(SProperty property) { return myProperty.equals(property); } @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 propDecl = SNodeOperations.as(myProperty.getDeclarationNode(), MetaAdapterFactory.getConcept(0xc72da2b97cce4447L, 0x8389f407dc1158b7L, 0xf979bd086bL, "jetbrains.mps.lang.structure.structure.PropertyDeclaration")); SNode hint = AttributeOperations.getAttribute(propDecl, 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; } public String getNewValue() { return myNewValue; } @Override public void apply(@NotNull SModel model, @NotNull NodeCopier nodeCopier) { SNode node = model.getNode(getAffectedNodeId()); assert node != null; node.setProperty(myProperty, myNewValue); } @NotNull @Override protected ModelChange createOppositeChange() { SNode node = getChangeSet().getOldModel().getNode(getAffectedNodeId(false)); assert node != null; return new SetPropertyChange(getChangeSet().getOppositeChangeSet(), getAffectedNodeId(true), myProperty, node.getProperty(myProperty)); } @Override public String toString() { return String.format("Set property %s to %s in node %s", myProperty, myNewValue, getAffectedNodeId(false)); } @Override public String getDescription() { return String.format("Changed %s of #%s from '%s' to '%s'", myProperty, getAffectedNodeId(false), getChangeSet().getOldModel().getNode(getAffectedNodeId(false)).getProperty(myProperty), getChangeSet().getNewModel().getNode(getAffectedNodeId(true)).getProperty(myProperty)); } }