package jetbrains.mps.ide.java.actions; /*Generated by MPS */ import jetbrains.mps.project.Project; import org.jetbrains.mps.openapi.model.SNode; import jetbrains.mps.openapi.editor.EditorContext; import jetbrains.mps.smodel.ModelAccessHelper; import jetbrains.mps.util.Computable; import jetbrains.mps.lang.smodel.generator.smodelAdapter.SNodeOperations; import jetbrains.mps.smodel.adapter.structure.MetaAdapterFactory; import org.jetbrains.mps.openapi.model.SNodeReference; import java.util.List; import jetbrains.mps.smodel.behaviour.BHReflection; import jetbrains.mps.core.aspects.behaviour.SMethodTrimmedId; import jetbrains.mps.internal.collections.runtime.ListSequence; import jetbrains.mps.ide.project.ProjectHelper; import jetbrains.mps.internal.collections.runtime.Sequence; import jetbrains.mps.internal.collections.runtime.ISelector; import jetbrains.mps.lang.smodel.generator.smodelAdapter.SLinkOperations; public class OverrideImplementMethodAction { private final Project myProject; private final SNode mySelectedNode; private final EditorContext myEditorContext; private final boolean myIsOverride; public OverrideImplementMethodAction(Project project, SNode selectedNode, EditorContext editorContext, boolean isOverride) { myProject = project; mySelectedNode = selectedNode; myEditorContext = editorContext; myIsOverride = isOverride; } public void run() { ModelAccessHelper mah = new ModelAccessHelper(myProject.getModelAccess()); final SNode contextClass = mah.runReadAction(new Computable<SNode>() { public SNode compute() { return SNodeOperations.getNodeAncestor(mySelectedNode, MetaAdapterFactory.getConcept(0xf3061a5392264cc5L, 0xa443f952ceaf5816L, 0xf8c108ca66L, "jetbrains.mps.baseLanguage.structure.ClassConcept"), true, false); } }); final SNode contextMember = mah.runReadAction(new Computable<SNode>() { public SNode compute() { return SNodeOperations.getNodeAncestor(mySelectedNode, MetaAdapterFactory.getInterfaceConcept(0xf3061a5392264cc5L, 0xa443f952ceaf5816L, 0x112574373bdL, "jetbrains.mps.baseLanguage.structure.ClassifierMember"), true, false); } }); final SNodeReference[] methods = mah.runReadAction(new Computable<SNodeReference[]>() { @Override public SNodeReference[] compute() { List<SNode> methodsToImplementAndOverride = ((List<SNode>) BHReflection.invoke(contextClass, SMethodTrimmedId.create("getMethodsToImplement", null, "4GM03FJm5q2"))); if (myIsOverride) { ListSequence.fromList(methodsToImplementAndOverride).addSequence(ListSequence.fromList(((List<SNode>) BHReflection.invoke(contextClass, SMethodTrimmedId.create("getMethodsToOverride", null, "4GM03FJm3zL"))))); } return OverrideImplementMethodsDialog.toNodePointers(OverrideImplementMethodsDialog.sortMethods(contextClass, methodsToImplementAndOverride)); } }); final OverrideImplementMethodsDialog dialog = new OverrideImplementMethodsDialog(methods, ProjectHelper.toIdeaProject(myProject)); dialog.setTitle((myIsOverride ? "Select Methods to Override/Implement" : "Select Methods to Implement")); dialog.show(); if (dialog.isOK()) { final Iterable<SNodeReference> selectedElements = (Iterable<SNodeReference>) dialog.getSelectedElements(); myProject.getModelAccess().executeCommandInEDT(new Runnable() { @Override public void run() { List<SNode> selection = Sequence.fromIterable(selectedElements).select(new ISelector<SNodeReference, SNode>() { public SNode select(SNodeReference it) { return SNodeOperations.cast(it.resolve(myProject.getRepository()), MetaAdapterFactory.getConcept(0xf3061a5392264cc5L, 0xa443f952ceaf5816L, 0xf8cc56b1fcL, "jetbrains.mps.baseLanguage.structure.BaseMethodDeclaration")); } }).toListSequence(); OverrideImplementMethodsHelper helper = new OverrideImplementMethodsHelper(myProject, contextClass, contextMember, dialog.isRemoveAttributes(), dialog.isInsertOverrideAnnotation(), dialog.isAddReturn()); List<SNode> insertedMethods = helper.insertMethods(selection); if (insertedMethods.isEmpty()) { return; } SNode firstMethod = ListSequence.fromList(insertedMethods).first(); SNode nodeToSelect; if (ListSequence.fromList(SLinkOperations.getChildren(SLinkOperations.getTarget(firstMethod, MetaAdapterFactory.getContainmentLink(0xf3061a5392264cc5L, 0xa443f952ceaf5816L, 0xf8cc56b1fcL, 0xf8cc56b1ffL, "body")), MetaAdapterFactory.getContainmentLink(0xf3061a5392264cc5L, 0xa443f952ceaf5816L, 0xf8cc56b200L, 0xf8cc6bf961L, "statement"))).isNotEmpty()) { nodeToSelect = ListSequence.fromList(SLinkOperations.getChildren(SLinkOperations.getTarget(firstMethod, MetaAdapterFactory.getContainmentLink(0xf3061a5392264cc5L, 0xa443f952ceaf5816L, 0xf8cc56b1fcL, 0xf8cc56b1ffL, "body")), MetaAdapterFactory.getContainmentLink(0xf3061a5392264cc5L, 0xa443f952ceaf5816L, 0xf8cc56b200L, 0xf8cc6bf961L, "statement"))).first(); } else { nodeToSelect = firstMethod; } myEditorContext.flushEvents(); myEditorContext.getSelectionManager().setSelection(nodeToSelect); } }); } } }