change signature dialog
[idea/community.git] / plugins / groovy / src / org / jetbrains / plugins / groovy / refactoring / changeSignature / GrChangeSignatureProcessor.java
index 76d650d3d2f366124f981934ce71665101533f92..0826dcf688e4f577abcb034cb2a73f6838c073b7 100644 (file)
 package org.jetbrains.plugins.groovy.refactoring.changeSignature;
 
 import com.intellij.openapi.project.Project;
+import com.intellij.openapi.util.Ref;
 import com.intellij.psi.PsiElement;
+import com.intellij.psi.PsiMethod;
 import com.intellij.refactoring.BaseRefactoringProcessor;
+import com.intellij.refactoring.changeSignature.ChangeInfo;
+import com.intellij.refactoring.changeSignature.ChangeSignatureViewDescriptor;
+import com.intellij.refactoring.changeSignature.ParameterInfo;
+import com.intellij.refactoring.util.CanonicalTypes;
 import com.intellij.usageView.UsageInfo;
 import com.intellij.usageView.UsageViewDescriptor;
+import com.intellij.util.containers.MultiMap;
 import org.jetbrains.annotations.NotNull;
+import org.jetbrains.plugins.groovy.lang.psi.api.statements.typedef.members.GrMethod;
+
+import java.util.List;
 
 /**
  * @author Maxim.Medvedev
  */
-public class GrChangeSignatureProcessor extends BaseRefactoringProcessor{
-  public GrChangeSignatureProcessor(Project project) {
+public class GrChangeSignatureProcessor extends BaseRefactoringProcessor {
+  private final GrChangeInfoImpl myInfo;
+
+  //private
+
+  public GrChangeSignatureProcessor(Project project, GrChangeInfoImpl changeInfo) {
     super(project);
+    myInfo = changeInfo;
   }
 
   @Override
   protected UsageViewDescriptor createUsageViewDescriptor(UsageInfo[] usages) {
-    return null;  //To change body of implemented methods use File | Settings | File Templates.
+    return new ChangeSignatureViewDescriptor(myInfo.getMethod());
   }
 
   @NotNull
@@ -48,12 +63,95 @@ public class GrChangeSignatureProcessor extends BaseRefactoringProcessor{
 
   @Override
   protected void performRefactoring(UsageInfo[] usages) {
-    //To change body of implemented methods use File | Settings | File Templates.
+    changeMethod();
+  }
+
+  private void changeMethod() {
+    final PsiMethod method = myInfo.getMethod();
+    if (myInfo.isChangeName()) {
+      method.setName(myInfo.getNewName());
+    }
+
+    if (myInfo.isChangeVisibility()) {
+      method.getModifierList().setModifierProperty(myInfo.getVisibilityModifier(), true);
+    }
   }
 
   @Override
   protected String getCommandName() {
     return "";
-    //return RefactoringBundle.message("changing.signature.of.0", UsageViewUtil.getDescriptiveName(myChangeInfo.getMethod()));
+    //return RefactoringBundle.message("changing.signature.of.0", UsageViewUtil.getDescriptiveName(myInfo.getMethod()));
+  }
+
+
+  private MultiMap<PsiElement, String> findConflicts(Ref<UsageInfo[]> refUsages) {
+    return new MultiMap<PsiElement, String>();//todo
+  }
+
+  @Override
+  protected boolean preprocessUsages(Ref<UsageInfo[]> refUsages) {
+    return showConflicts(findConflicts(refUsages));
+  }
+
+  static class GrChangeInfoImpl implements ChangeInfo {
+    private GrMethod myMethod;
+    private String myNewName;
+    private CanonicalTypes.Type myReturnType;
+    private String myVisibilityModifier;
+    private List<GrParameterInfo> myParameters;
+    private boolean myChangeParameters = false;
+
+    public GrChangeInfoImpl(GrMethod method,
+                             String visibilityModifier,
+                             CanonicalTypes.Type returnType,
+                             String newName,
+                             List<GrParameterInfo> parameters) {
+      myMethod = method;
+      myVisibilityModifier = visibilityModifier;
+      myReturnType = returnType;
+      myParameters = parameters;
+      myNewName = newName;
+
+      final int oldParameterCount = myMethod.getParameters().length;
+      if (oldParameterCount != myParameters.size()) {
+        myChangeParameters = true;
+      }
+
+      for (int i = 0, parametersSize = parameters.size(); i < parametersSize; i++) {
+        GrParameterInfo parameter = parameters.get(i);
+        if (parameter.getOldIndex() != i) {
+          myChangeParameters = true;
+        }
+      }
+    }
+
+    @NotNull
+    public ParameterInfo[] getNewParameters() {
+      return myParameters.toArray(new GrParameterInfo[myParameters.size()]);
+    }
+
+    public boolean isParameterSetOrOrderChanged() {
+      return myChangeParameters;
+    }
+
+    public PsiMethod getMethod() {
+      return myMethod;
+    }
+
+    public boolean isChangeVisibility() {
+      return !myMethod.getModifierList().hasModifierProperty(myVisibilityModifier);
+    }
+
+    public boolean isChangeName() {
+      return !myMethod.getName().equals(myNewName);
+    }
+
+    public String getNewName() {
+      return myNewName;
+    }
+
+    public String getVisibilityModifier() {
+      return myVisibilityModifier;
+    }
   }
 }