package jetbrains.mps.baseLanguage.util.plugin.refactorings;
/*Generated by MPS */
import org.jetbrains.mps.openapi.model.SNode;
import jetbrains.mps.ide.findusages.model.SearchResults;
import jetbrains.mps.ide.findusages.model.SearchResult;
import jetbrains.mps.internal.collections.runtime.ListSequence;
import jetbrains.mps.lang.smodel.generator.smodelAdapter.SNodeOperations;
public class BasicMoveRefactoring {
protected final SNode myMoving;
protected final SNode myDestination;
protected SNode myReplacing = null;
protected SearchResults<SNode> myUsages = new SearchResults<SNode>();
private boolean myIsChangingModel = false;
public BasicMoveRefactoring(SNode moving, SNode destination) {
this.myMoving = moving;
this.myDestination = destination;
}
public void setUsages(SearchResults<SNode> usages) {
this.myUsages = usages;
}
public SearchResults<SNode> getUsages() {
return this.myUsages;
}
public void doRefactoring() {
this.setIsChangingModel();
this.correctMoving();
this.createCopy();
MoveRefactoringUtils.fixImportsFromNode(this.myReplacing);
for (SearchResult<SNode> result : ListSequence.fromList(this.myUsages.getSearchResults())) {
// accomodate for non-MPS usages (e.g. in plugin)
// TODO (not sure if it's a good solution)
if (result.getObject() == null) {
continue;
}
this.replaceSingleUsage(result.getObject());
}
this.deleteOld();
}
public void replaceSingleUsage(SNode usage) {
if (this.myIsChangingModel) {
MoveRefactoringUtils.addNodeModelImportIfNeed(usage, this.myDestination);
}
}
protected void createCopy() {
this.myReplacing = SNodeOperations.copyNode(this.myMoving);
MoveRefactoringUtils.addNodeAtLink(this.myDestination, this.myReplacing);
}
protected void deleteOld() {
SNodeOperations.deleteNode(this.myMoving);
}
protected void correctMoving() {
}
private void setIsChangingModel() {
this.myIsChangingModel = (SNodeOperations.getModel(this.myDestination) != SNodeOperations.getModel(this.myMoving));
}
}