package jetbrains.mps.ide.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.baseLanguage.closures.runtime.Wrappers; import org.jetbrains.mps.openapi.model.SNodeReference; import jetbrains.mps.lang.smodel.generator.smodelAdapter.SNodeOperations; import jetbrains.mps.smodel.adapter.structure.MetaAdapterFactory; 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.baseLanguage.util.plugin.refactorings.MoveRefactoringUtils; import jetbrains.mps.lang.smodel.generator.smodelAdapter.SLinkOperations; public class OverrideConceptMethodsAction { private Project myProject; private SNode mySelectedNode; private EditorContext myEditorContext; private boolean myIsOverride; public OverrideConceptMethodsAction(Project project, SNode selectedNode, EditorContext editorContext, boolean isOverride) { myProject = project; mySelectedNode = selectedNode; myEditorContext = editorContext; myIsOverride = isOverride; } public void run() { final Wrappers._T<SNode> contextClass = new Wrappers._T<SNode>(); final Wrappers._T<SNode> contextMethod = new Wrappers._T<SNode>(); final Wrappers._T<SNodeReference[]> methods = new Wrappers._T<SNodeReference[]>(); myProject.getModelAccess().runReadAction(new Runnable() { public void run() { contextClass.value = SNodeOperations.getNodeAncestor(mySelectedNode, MetaAdapterFactory.getConcept(0xaf65afd8f0dd4942L, 0x87d963a55f2a9db1L, 0x11d43447b1aL, "jetbrains.mps.lang.behavior.structure.ConceptBehavior"), true, false); contextMethod.value = SNodeOperations.getNodeAncestor(mySelectedNode, MetaAdapterFactory.getConcept(0xaf65afd8f0dd4942L, 0x87d963a55f2a9db1L, 0x11d4348057eL, "jetbrains.mps.lang.behavior.structure.ConceptMethodDeclaration"), true, false); List<SNode> methodsToOverride = ((List<SNode>) BHReflection.invoke(contextClass.value, SMethodTrimmedId.create("getMethodsToImplement", null, "4GM03FJm5q2"))); if (myIsOverride) { ListSequence.fromList(methodsToOverride).addSequence(ListSequence.fromList(((List<SNode>) BHReflection.invoke(contextClass.value, SMethodTrimmedId.create("getMethodsToOverride", null, "4GM03FJm3zL"))))); } methods.value = OverrideConceptMethodsDialog.toNodePointers(OverrideConceptMethodsDialog.sortMethods(contextClass.value, methodsToOverride)); } }); final OverrideConceptMethodsDialog dialog = new OverrideConceptMethodsDialog(methods.value, ProjectHelper.toIdeaProject(myProject)) { @Override protected boolean showInsertOverride() { return myIsOverride; } }; dialog.setTitle((myIsOverride ? "Select Behavior Methods to Override/Implement" : "Select Behavior Methods to Implement")); dialog.show(); if (dialog.isOK()) { final Iterable<SNodeReference> selectedElements = (Iterable<SNodeReference>) dialog.getSelectedElements(); myProject.getModelAccess().executeCommandInEDT(new Runnable() { 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(); OverrideConceptMethodsHelper helper = new OverrideConceptMethodsHelper(myProject, contextClass.value, contextMethod.value, dialog.isRemoveAttributes(), dialog.isAddReturn()); List<SNode> insertedMethods = helper.insertMethods(selection); if (insertedMethods.isEmpty()) { return; } MoveRefactoringUtils.fixImportsFromNode(contextClass.value); 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); } }); } } }