package jetbrains.mps.ide.platform.refactoring;
/*Generated by MPS */
import org.jetbrains.mps.openapi.module.SRepository;
import org.jetbrains.mps.openapi.model.SNode;
import org.jetbrains.mps.openapi.model.SNodeReference;
import org.jetbrains.mps.openapi.language.SContainmentLink;
import jetbrains.mps.lang.smodel.generator.smodelAdapter.SConceptOperations;
import jetbrains.mps.lang.smodel.generator.smodelAdapter.SNodeOperations;
import org.jetbrains.mps.openapi.model.SModelReference;
import org.jetbrains.mps.openapi.model.SModel;
import org.jetbrains.mps.openapi.language.SConcept;
import org.jetbrains.mps.openapi.module.SModuleReference;
import jetbrains.mps.smodel.LanguageAspect;
import jetbrains.mps.smodel.Language;
public interface NodeLocation {
boolean canInsert(SRepository repository, SNode nodeToMove);
void insertNode(SRepository repository, SNode nodeToMove);
class NodeLocationChild implements NodeLocation {
private SNodeReference parent;
private SContainmentLink role;
public NodeLocationChild(SNode parent, SContainmentLink role) {
this(parent);
this.role = role;
}
public NodeLocationChild(SNode parent) {
this.parent = parent.getReference();
}
public void setRole(SContainmentLink role) {
this.role = role;
}
public SNodeReference getNode() {
return parent;
}
public SContainmentLink getRole() {
return role;
}
public boolean canInsert(SRepository repository, SNode nodeToMove) {
SNode node = parent.resolve(repository);
return role != null && node != null && node.getConcept().getContainmentLinks().contains(role) && SConceptOperations.isSubConceptOf(SNodeOperations.asSConcept(SNodeOperations.getConcept(nodeToMove)), SNodeOperations.asSConcept(role.getTargetConcept()));
}
public void insertNode(SRepository repository, SNode nodeToMove) {
SNode oldParent = nodeToMove.getParent();
if (oldParent != null) {
oldParent.removeChild(nodeToMove);
}
parent.resolve(repository).addChild(role, nodeToMove);
}
}
class NodeLocationRoot implements NodeLocation {
private SModelReference model;
public NodeLocationRoot(SModel model) {
this.model = model.getReference();
}
public boolean canInsert(SRepository repository, SNode nodeToMove) {
return model.resolve(repository) != null && ((SConcept) SNodeOperations.getConcept(nodeToMove)).isRootable();
}
public void insertNode(SRepository repository, SNode nodeToMove) {
SModel oldModel = nodeToMove.getModel();
if (oldModel != null) {
oldModel.removeRootNode(nodeToMove);
}
model.resolve(repository).addRootNode(nodeToMove);
}
}
class NodeLocationRootWithAspectModelCreation implements NodeLocation {
private SModuleReference myLanguage;
private LanguageAspect myAspect;
public NodeLocationRootWithAspectModelCreation(Language languageModule, LanguageAspect aspect) {
myLanguage = languageModule.getModuleReference();
myAspect = aspect;
}
public boolean canInsert(SRepository repository, SNode nodeToMove) {
return myLanguage.resolve(repository) instanceof Language && ((SConcept) SNodeOperations.getConcept(nodeToMove)).isRootable();
}
public void insertNode(SRepository repository, SNode nodeToMove) {
SModel model = myAspect.getOrCreate(((Language) myLanguage.resolve(repository)));
SModel oldModel = nodeToMove.getModel();
if (oldModel != null) {
oldModel.removeRootNode(nodeToMove);
}
model.addRootNode(nodeToMove);
}
}
}