0826dcf688e4f577abcb034cb2a73f6838c073b7
[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.refactoring.BaseRefactoringProcessor;
23 import com.intellij.refactoring.changeSignature.ChangeInfo;
24 import com.intellij.refactoring.changeSignature.ChangeSignatureViewDescriptor;
25 import com.intellij.refactoring.changeSignature.ParameterInfo;
26 import com.intellij.refactoring.util.CanonicalTypes;
27 import com.intellij.usageView.UsageInfo;
28 import com.intellij.usageView.UsageViewDescriptor;
29 import com.intellij.util.containers.MultiMap;
30 import org.jetbrains.annotations.NotNull;
31 import org.jetbrains.plugins.groovy.lang.psi.api.statements.typedef.members.GrMethod;
32
33 import java.util.List;
34
35 /**
36  * @author Maxim.Medvedev
37  */
38 public class GrChangeSignatureProcessor extends BaseRefactoringProcessor {
39   private final GrChangeInfoImpl myInfo;
40
41   //private
42
43   public GrChangeSignatureProcessor(Project project, GrChangeInfoImpl changeInfo) {
44     super(project);
45     myInfo = changeInfo;
46   }
47
48   @Override
49   protected UsageViewDescriptor createUsageViewDescriptor(UsageInfo[] usages) {
50     return new ChangeSignatureViewDescriptor(myInfo.getMethod());
51   }
52
53   @NotNull
54   @Override
55   protected UsageInfo[] findUsages() {
56     return new UsageInfo[0];  //To change body of implemented methods use File | Settings | File Templates.
57   }
58
59   @Override
60   protected void refreshElements(PsiElement[] elements) {
61     //To change body of implemented methods use File | Settings | File Templates.
62   }
63
64   @Override
65   protected void performRefactoring(UsageInfo[] usages) {
66     changeMethod();
67   }
68
69   private void changeMethod() {
70     final PsiMethod method = myInfo.getMethod();
71     if (myInfo.isChangeName()) {
72       method.setName(myInfo.getNewName());
73     }
74
75     if (myInfo.isChangeVisibility()) {
76       method.getModifierList().setModifierProperty(myInfo.getVisibilityModifier(), true);
77     }
78   }
79
80   @Override
81   protected String getCommandName() {
82     return "";
83     //return RefactoringBundle.message("changing.signature.of.0", UsageViewUtil.getDescriptiveName(myInfo.getMethod()));
84   }
85
86
87   private MultiMap<PsiElement, String> findConflicts(Ref<UsageInfo[]> refUsages) {
88     return new MultiMap<PsiElement, String>();//todo
89   }
90
91   @Override
92   protected boolean preprocessUsages(Ref<UsageInfo[]> refUsages) {
93     return showConflicts(findConflicts(refUsages));
94   }
95
96   static class GrChangeInfoImpl implements ChangeInfo {
97     private GrMethod myMethod;
98     private String myNewName;
99     private CanonicalTypes.Type myReturnType;
100     private String myVisibilityModifier;
101     private List<GrParameterInfo> myParameters;
102     private boolean myChangeParameters = false;
103
104     public GrChangeInfoImpl(GrMethod method,
105                              String visibilityModifier,
106                              CanonicalTypes.Type returnType,
107                              String newName,
108                              List<GrParameterInfo> parameters) {
109       myMethod = method;
110       myVisibilityModifier = visibilityModifier;
111       myReturnType = returnType;
112       myParameters = parameters;
113       myNewName = newName;
114
115       final int oldParameterCount = myMethod.getParameters().length;
116       if (oldParameterCount != myParameters.size()) {
117         myChangeParameters = true;
118       }
119
120       for (int i = 0, parametersSize = parameters.size(); i < parametersSize; i++) {
121         GrParameterInfo parameter = parameters.get(i);
122         if (parameter.getOldIndex() != i) {
123           myChangeParameters = true;
124         }
125       }
126     }
127
128     @NotNull
129     public ParameterInfo[] getNewParameters() {
130       return myParameters.toArray(new GrParameterInfo[myParameters.size()]);
131     }
132
133     public boolean isParameterSetOrOrderChanged() {
134       return myChangeParameters;
135     }
136
137     public PsiMethod getMethod() {
138       return myMethod;
139     }
140
141     public boolean isChangeVisibility() {
142       return !myMethod.getModifierList().hasModifierProperty(myVisibilityModifier);
143     }
144
145     public boolean isChangeName() {
146       return !myMethod.getName().equals(myNewName);
147     }
148
149     public String getNewName() {
150       return myNewName;
151     }
152
153     public String getVisibilityModifier() {
154       return myVisibilityModifier;
155     }
156   }
157 }