GrChangeSignature parameterTableModel
[idea/community.git] / plugins / groovy / src / org / jetbrains / plugins / groovy / refactoring / changeSignature / GrChangeSignatureProcessor.java
1 /*
2  * Copyright 2000-2010 JetBrains s.r.o.
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  * http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 package org.jetbrains.plugins.groovy.refactoring.changeSignature;
17
18 import com.intellij.openapi.project.Project;
19 import com.intellij.openapi.util.Ref;
20 import com.intellij.psi.PsiElement;
21 import com.intellij.psi.PsiMethod;
22 import com.intellij.psi.PsiReference;
23 import com.intellij.psi.search.searches.MethodReferencesSearch;
24 import com.intellij.refactoring.BaseRefactoringProcessor;
25 import com.intellij.refactoring.changeSignature.ChangeInfo;
26 import com.intellij.refactoring.changeSignature.ChangeSignatureViewDescriptor;
27 import com.intellij.refactoring.changeSignature.ParameterInfo;
28 import com.intellij.refactoring.util.CanonicalTypes;
29 import com.intellij.usageView.UsageInfo;
30 import com.intellij.usageView.UsageViewDescriptor;
31 import com.intellij.util.containers.MultiMap;
32 import org.jetbrains.annotations.NotNull;
33 import org.jetbrains.plugins.groovy.lang.psi.api.statements.typedef.members.GrMethod;
34
35 import java.util.Collection;
36 import java.util.List;
37
38 /**
39  * @author Maxim.Medvedev
40  */
41 public class GrChangeSignatureProcessor extends BaseRefactoringProcessor {
42   private final GrChangeInfoImpl myInfo;
43
44   //private
45
46   public GrChangeSignatureProcessor(Project project, GrChangeInfoImpl changeInfo) {
47     super(project);
48     myInfo = changeInfo;
49   }
50
51   @Override
52   protected UsageViewDescriptor createUsageViewDescriptor(UsageInfo[] usages) {
53     return new ChangeSignatureViewDescriptor(myInfo.getMethod());
54   }
55
56   @NotNull
57   @Override
58   protected UsageInfo[] findUsages() {
59     final Collection<PsiReference> collection = MethodReferencesSearch.search(myInfo.getMethod()).findAll();
60     return new UsageInfo[0];  //To change body of implemented methods use File | Settings | File Templates.
61   }
62
63   @Override
64   protected void refreshElements(PsiElement[] elements) {
65     //To change body of implemented methods use File | Settings | File Templates.
66   }
67
68   @Override
69   protected void performRefactoring(UsageInfo[] usages) {
70     changeMethod();
71   }
72
73   private void changeMethod() {
74     final PsiMethod method = myInfo.getMethod();
75     if (myInfo.isChangeName()) {
76       method.setName(myInfo.getNewName());
77     }
78
79     if (myInfo.isChangeVisibility()) {
80       method.getModifierList().setModifierProperty(myInfo.getVisibilityModifier(), true);
81     }
82   }
83
84   @Override
85   protected String getCommandName() {
86     return "";
87     //return RefactoringBundle.message("changing.signature.of.0", UsageViewUtil.getDescriptiveName(myInfo.getMethod()));
88   }
89
90
91   private MultiMap<PsiElement, String> findConflicts(Ref<UsageInfo[]> refUsages) {
92     return new MultiMap<PsiElement, String>();//todo
93   }
94
95   @Override
96   protected boolean preprocessUsages(Ref<UsageInfo[]> refUsages) {
97     return showConflicts(findConflicts(refUsages));
98   }
99
100   static class GrChangeInfoImpl implements ChangeInfo {
101     private GrMethod myMethod;
102     private String myNewName;
103     private CanonicalTypes.Type myReturnType;
104     private String myVisibilityModifier;
105     private List<GrParameterInfo> myParameters;
106     private boolean myChangeParameters = false;
107
108     public GrChangeInfoImpl(GrMethod method,
109                              String visibilityModifier,
110                              CanonicalTypes.Type returnType,
111                              String newName,
112                              List<GrParameterInfo> parameters) {
113       myMethod = method;
114       myVisibilityModifier = visibilityModifier;
115       myReturnType = returnType;
116       myParameters = parameters;
117       myNewName = newName;
118
119       final int oldParameterCount = myMethod.getParameters().length;
120       if (oldParameterCount != myParameters.size()) {
121         myChangeParameters = true;
122       }
123
124       for (int i = 0, parametersSize = parameters.size(); i < parametersSize; i++) {
125         GrParameterInfo parameter = parameters.get(i);
126         if (parameter.getOldIndex() != i) {
127           myChangeParameters = true;
128         }
129       }
130     }
131
132     @NotNull
133     public ParameterInfo[] getNewParameters() {
134       return myParameters.toArray(new GrParameterInfo[myParameters.size()]);
135     }
136
137     public boolean isParameterSetOrOrderChanged() {
138       return myChangeParameters;
139     }
140
141     public PsiMethod getMethod() {
142       return myMethod;
143     }
144
145     public boolean isChangeVisibility() {
146       return !myMethod.getModifierList().hasModifierProperty(myVisibilityModifier);
147     }
148
149     public boolean isChangeName() {
150       return !myMethod.getName().equals(myNewName);
151     }
152
153     public String getNewName() {
154       return myNewName;
155     }
156
157     public String getVisibilityModifier() {
158       return myVisibilityModifier;
159     }
160   }
161 }