package jetbrains.mps.ide.java.actions;
/*Generated by MPS */
import jetbrains.mps.ide.platform.actions.core.MoveNodesAction;
import jetbrains.mps.smodel.structure.Extension;
import jetbrains.mps.project.MPSProject;
import java.util.List;
import org.jetbrains.mps.openapi.model.SNode;
import jetbrains.mps.baseLanguage.closures.runtime.Wrappers;
import jetbrains.mps.internal.collections.runtime.ListSequence;
import jetbrains.mps.lang.smodel.generator.smodelAdapter.SNodeOperations;
import jetbrains.mps.smodel.adapter.structure.MetaAdapterFactory;
import jetbrains.mps.ide.platform.refactoring.MoveNodeDialog;
import org.jetbrains.mps.openapi.model.SModel;
import jetbrains.mps.ide.platform.actions.core.MoveNodesUtil;
import jetbrains.mps.internal.collections.runtime.MapSequence;
import java.util.HashMap;
import java.util.ArrayList;
import java.util.Map;
import jetbrains.mps.refactoring.participant.RefactoringParticipant;
import jetbrains.mps.refactoring.participant.RefactoringSession;
import jetbrains.mps.refactoring.participant.NodeCopyTracker;
import jetbrains.mps.baseLanguage.util.plugin.refactorings.MoveStaticMethodRefactoring;
public class MoveStaticMethod implements MoveNodesAction {
public static class MoveStaticMethod_extension extends Extension.Default<MoveNodesAction> {
public MoveStaticMethod_extension() {
super("jetbrains.mps.ide.platform.MoveNodesActionEP");
}
public MoveNodesAction get() {
return new MoveStaticMethod();
}
}
public String getName() {
return "Move Static Method";
}
public boolean isApplicable(MPSProject project, final List<SNode> nodes) {
final Wrappers._boolean result = new Wrappers._boolean();
project.getRepository().getModelAccess().runReadAction(new Runnable() {
public void run() {
result.value = ListSequence.fromList(nodes).count() == 1 && SNodeOperations.isInstanceOf(ListSequence.fromList(nodes).first(), MetaAdapterFactory.getConcept(0xf3061a5392264cc5L, 0xa443f952ceaf5816L, 0xfbbebabf0aL, "jetbrains.mps.baseLanguage.structure.StaticMethodDeclaration"));
}
});
return result.value;
}
public void execute(final MPSProject project, List<SNode> nodes) {
final SNode target = SNodeOperations.cast(ListSequence.fromList(nodes).first(), MetaAdapterFactory.getConcept(0xf3061a5392264cc5L, 0xa443f952ceaf5816L, 0xfbbebabf0aL, "jetbrains.mps.baseLanguage.structure.StaticMethodDeclaration"));
final SNode whereToMove = MoveNodeDialog.getSelectedObject(project.getProject(), target, new MoveNodeDialog.NodeFilter("Select class to move: refactoring can't be applied to selected node") {
@Override
public boolean check(SNode selectedObject, SNode nodeToMove, SModel modelOfSelectedNode) {
return SNodeOperations.isInstanceOf(selectedObject, MetaAdapterFactory.getConcept(0xf3061a5392264cc5L, 0xa443f952ceaf5816L, 0xf8c108ca66L, "jetbrains.mps.baseLanguage.structure.ClassConcept")) && !(ListSequence.fromList(SNodeOperations.getNodeAncestors(nodeToMove, null, false)).contains(selectedObject));
}
});
if (whereToMove == null) {
return;
}
project.getRepository().getModelAccess().executeCommand(new Runnable() {
public void run() {
MoveNodesUtil.moveTo(project, getName(), MapSequence.<MoveNodesUtil.NodeProcessor, List<SNode>>fromMapAndKeysArray(new HashMap<MoveNodesUtil.NodeProcessor, List<SNode>>(), new MoveNodesUtil.NodeCreatingProcessor(new MoveStaticField.NodeLocationClassifierMember(SNodeOperations.cast(whereToMove, MetaAdapterFactory.getConcept(0xf3061a5392264cc5L, 0xa443f952ceaf5816L, 0x101d9d3ca30L, "jetbrains.mps.baseLanguage.structure.Classifier"))), project) {
@Override
public List<SNode> getNodesToSearch(SNode nodeToMove) {
return ListSequence.fromListAndArray(new ArrayList<SNode>(), nodeToMove);
}
@Override
public void process(List<SNode> nodesRootsToMove, Map<SNode, RefactoringParticipant.KeepOldNodes> ifKeepOldNodes, RefactoringSession refactoringSession) {
NodeCopyTracker copyMap = NodeCopyTracker.get(refactoringSession);
copyMap.copyAndTrack(nodesRootsToMove);
Map<SNode, SNode> oldMembersToClasses = MapSequence.fromMap(new HashMap<SNode, SNode>());
for (SNode oldNode : ListSequence.fromList(nodesRootsToMove)) {
MapSequence.fromMap(oldMembersToClasses).put(oldNode, SNodeOperations.getNodeAncestor(oldNode, MetaAdapterFactory.getConcept(0xf3061a5392264cc5L, 0xa443f952ceaf5816L, 0xf8c108ca66L, "jetbrains.mps.baseLanguage.structure.ClassConcept"), false, false));
}
for (SNode oldNode : ListSequence.fromList(nodesRootsToMove)) {
SNode newNode = MapSequence.fromMap(copyMap.getCopyMap()).get(oldNode);
if (!(SNodeOperations.isInstanceOf(newNode, MetaAdapterFactory.getConcept(0xf3061a5392264cc5L, 0xa443f952ceaf5816L, 0xfbbebabf0aL, "jetbrains.mps.baseLanguage.structure.StaticMethodDeclaration")))) {
throw new IllegalStateException();
}
SNode originalClass = MapSequence.fromMap(oldMembersToClasses).get(oldNode);
MoveStaticMethodRefactoring.replaceFields(newNode, originalClass);
MoveStaticMethodRefactoring.replaceMethods(newNode, originalClass);
if (MapSequence.fromMap(ifKeepOldNodes).get(oldNode) == RefactoringParticipant.KeepOldNodes.REMOVE) {
SNodeOperations.deleteNode(oldNode);
}
myNodeLocation.insertNode(myProject.getRepository(), newNode);
}
}
}).withValues(ListSequence.fromListAndArray(new ArrayList<SNode>(), target)));
}
});
}
}