2 * Copyright 2000-2009 JetBrains s.r.o.
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
8 * http://www.apache.org/licenses/LICENSE-2.0
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.
16 package com
.intellij
.refactoring
.makeStatic
;
18 import com
.intellij
.openapi
.diagnostic
.Logger
;
19 import com
.intellij
.openapi
.project
.Project
;
20 import com
.intellij
.psi
.*;
21 import com
.intellij
.psi
.codeStyle
.CodeStyleManager
;
22 import com
.intellij
.psi
.javadoc
.PsiDocTag
;
23 import com
.intellij
.psi
.util
.InheritanceUtil
;
24 import com
.intellij
.psi
.util
.PsiTreeUtil
;
25 import com
.intellij
.psi
.util
.PsiUtil
;
26 import com
.intellij
.refactoring
.util
.RefactoringUtil
;
27 import com
.intellij
.refactoring
.util
.javadoc
.MethodJavaDocHelper
;
28 import com
.intellij
.usageView
.UsageInfo
;
29 import com
.intellij
.util
.IncorrectOperationException
;
31 import java
.util
.ArrayList
;
32 import java
.util
.List
;
37 public class MakeMethodStaticProcessor
extends MakeMethodOrClassStaticProcessor
<PsiMethod
> {
38 private static final Logger LOG
= Logger
.getInstance("#com.intellij.refactoring.makeMethodStatic.MakeMethodStaticProcessor");
40 public MakeMethodStaticProcessor(final Project project
, final PsiMethod method
, final Settings settings
) {
41 super(project
, method
, settings
);
44 protected void changeSelfUsage(SelfUsageInfo usageInfo
) throws IncorrectOperationException
{
45 PsiElement parent
= usageInfo
.getElement().getParent();
46 LOG
.assertTrue(parent
instanceof PsiMethodCallExpression
);
47 PsiMethodCallExpression methodCall
= (PsiMethodCallExpression
) parent
;
48 final PsiExpression qualifier
= methodCall
.getMethodExpression().getQualifierExpression();
49 if (qualifier
!= null) qualifier
.delete();
51 PsiElementFactory factory
= JavaPsiFacade
.getInstance(methodCall
.getProject()).getElementFactory();
52 PsiExpressionList args
= methodCall
.getArgumentList();
53 PsiElement addParameterAfter
= null;
55 if(mySettings
.isMakeClassParameter()) {
56 PsiElement arg
= factory
.createExpressionFromText(mySettings
.getClassParameterName(), null);
57 addParameterAfter
= args
.addAfter(arg
, null);
60 if(mySettings
.isMakeFieldParameters()) {
61 List
<Settings
.FieldParameter
> parameters
= mySettings
.getParameterOrderList();
62 for (Settings
.FieldParameter fieldParameter
: parameters
) {
63 PsiElement arg
= factory
.createExpressionFromText(fieldParameter
.name
, null);
64 if (addParameterAfter
== null) {
65 addParameterAfter
= args
.addAfter(arg
, null);
68 addParameterAfter
= args
.addAfter(arg
, addParameterAfter
);
74 protected void changeSelf(PsiElementFactory factory
, UsageInfo
[] usages
)
75 throws IncorrectOperationException
{
76 final MethodJavaDocHelper javaDocHelper
= new MethodJavaDocHelper(myMember
);
77 PsiParameterList paramList
= myMember
.getParameterList();
78 PsiElement addParameterAfter
= null;
79 PsiDocTag anchor
= null;
80 List
<PsiType
> addedTypes
= new ArrayList
<PsiType
>();
82 if (mySettings
.isMakeClassParameter()) {
83 // Add parameter for object
84 PsiType parameterType
= factory
.createType(myMember
.getContainingClass(), PsiSubstitutor
.EMPTY
);
85 addedTypes
.add(parameterType
);
87 final String classParameterName
= mySettings
.getClassParameterName();
88 PsiParameter parameter
= factory
.createParameter(classParameterName
, parameterType
);
89 if(makeClassParameterFinal(usages
)) {
90 PsiUtil
.setModifierProperty(parameter
, PsiModifier
.FINAL
, true);
92 addParameterAfter
= paramList
.addAfter(parameter
, null);
93 anchor
= javaDocHelper
.addParameterAfter(classParameterName
, anchor
);
96 if (mySettings
.isMakeFieldParameters()) {
97 List
<Settings
.FieldParameter
> parameters
= mySettings
.getParameterOrderList();
99 for (Settings
.FieldParameter fieldParameter
: parameters
) {
100 final PsiType fieldParameterType
= fieldParameter
.field
.getType();
101 final PsiParameter parameter
= factory
.createParameter(fieldParameter
.name
, fieldParameterType
);
102 addedTypes
.add(fieldParameterType
);
103 if (makeFieldParameterFinal(fieldParameter
.field
, usages
)) {
104 PsiUtil
.setModifierProperty(parameter
, PsiModifier
.FINAL
, true);
106 addParameterAfter
= paramList
.addAfter(parameter
, addParameterAfter
);
107 anchor
= javaDocHelper
.addParameterAfter(fieldParameter
.name
, anchor
);
110 setupTypeParameterList();
111 // Add static modifier
112 final PsiModifierList modifierList
= myMember
.getModifierList();
113 modifierList
.setModifierProperty(PsiModifier
.STATIC
, true);
114 modifierList
.setModifierProperty(PsiModifier
.FINAL
, false);
117 protected void changeInternalUsage(InternalUsageInfo usage
, PsiElementFactory factory
)
118 throws IncorrectOperationException
{
119 if (!mySettings
.isChangeSignature()) return;
121 PsiElement element
= usage
.getElement();
123 if (element
instanceof PsiReferenceExpression
) {
124 PsiReferenceExpression newRef
= null;
126 if (mySettings
.isMakeFieldParameters()) {
127 PsiElement resolved
= ((PsiReferenceExpression
) element
).resolve();
128 if (resolved
instanceof PsiField
) {
129 String name
= mySettings
.getNameForField((PsiField
) resolved
);
131 newRef
= (PsiReferenceExpression
) factory
.createExpressionFromText(name
, null);
136 if (newRef
== null && mySettings
.isMakeClassParameter()) {
138 (PsiReferenceExpression
) factory
.createExpressionFromText(
139 mySettings
.getClassParameterName() + "." + element
.getText(), null);
142 if (newRef
!= null) {
143 CodeStyleManager codeStyleManager
= CodeStyleManager
.getInstance(myProject
);
144 newRef
= (PsiReferenceExpression
) codeStyleManager
.reformat(newRef
);
145 element
.replace(newRef
);
148 else if (element
instanceof PsiThisExpression
&& mySettings
.isMakeClassParameter()) {
149 element
.replace(factory
.createExpressionFromText(mySettings
.getClassParameterName(), null));
151 else if (element
instanceof PsiSuperExpression
&& mySettings
.isMakeClassParameter()) {
152 element
.replace(factory
.createExpressionFromText(mySettings
.getClassParameterName(), null));
154 else if (element
instanceof PsiNewExpression
&& mySettings
.isMakeClassParameter()) {
155 final PsiNewExpression newExpression
= ((PsiNewExpression
)element
);
156 LOG
.assertTrue(newExpression
.getQualifier() == null);
157 final String newText
= mySettings
.getClassParameterName() + "." + newExpression
.getText();
158 final PsiExpression expr
= factory
.createExpressionFromText(newText
, null);
159 element
.replace(expr
);
163 protected void changeExternalUsage(UsageInfo usage
, PsiElementFactory factory
)
164 throws IncorrectOperationException
{
165 final PsiElement element
= usage
.getElement();
166 if (!(element
instanceof PsiReferenceExpression
)) return;
168 PsiReferenceExpression methodRef
= (PsiReferenceExpression
) element
;
169 PsiElement parent
= methodRef
.getParent();
170 LOG
.assertTrue(parent
instanceof PsiMethodCallExpression
);
172 PsiMethodCallExpression methodCall
= (PsiMethodCallExpression
) parent
;
173 PsiExpression instanceRef
;
175 instanceRef
= methodRef
.getQualifierExpression();
176 PsiElement newQualifier
;
178 final PsiClass memberClass
= myMember
.getContainingClass();
179 if (instanceRef
== null || instanceRef
instanceof PsiSuperExpression
) {
180 PsiClass contextClass
= PsiTreeUtil
.getParentOfType(element
, PsiClass
.class);
181 if (!InheritanceUtil
.isInheritorOrSelf(contextClass
, memberClass
, true)) {
182 instanceRef
= factory
.createExpressionFromText(memberClass
.getQualifiedName() + ".this", null);
184 instanceRef
= factory
.createExpressionFromText("this", null);
189 newQualifier
= factory
.createReferenceExpression(memberClass
);
192 if (mySettings
.getNewParametersNumber() > 1) {
193 int copyingSafetyLevel
= RefactoringUtil
.verifySafeCopyExpression(instanceRef
);
194 if (copyingSafetyLevel
== RefactoringUtil
.EXPR_COPY_PROHIBITED
) {
195 String tempVar
= RefactoringUtil
.createTempVar(instanceRef
, methodCall
, true);
196 instanceRef
= factory
.createExpressionFromText(tempVar
, null);
201 PsiElement anchor
= null;
202 PsiExpressionList argList
= methodCall
.getArgumentList();
203 PsiExpression
[] exprs
= argList
.getExpressions();
204 if (mySettings
.isMakeClassParameter()) {
205 if (exprs
.length
> 0) {
206 anchor
= argList
.addBefore(instanceRef
, exprs
[0]);
209 anchor
= argList
.add(instanceRef
);
214 if (mySettings
.isMakeFieldParameters()) {
215 List
<Settings
.FieldParameter
> parameters
= mySettings
.getParameterOrderList();
217 for (Settings
.FieldParameter fieldParameter
: parameters
) {
218 PsiReferenceExpression fieldRef
;
219 if (newQualifier
!= null) {
220 fieldRef
= (PsiReferenceExpression
)factory
.createExpressionFromText(
221 "a." + fieldParameter
.field
.getName(), null);
222 fieldRef
.getQualifierExpression().replace(instanceRef
);
225 fieldRef
= (PsiReferenceExpression
)factory
.createExpressionFromText(fieldParameter
.field
.getName(), null);
228 if (anchor
!= null) {
229 anchor
= argList
.addAfter(fieldRef
, anchor
);
232 if (exprs
.length
> 0) {
233 anchor
= argList
.addBefore(fieldRef
, exprs
[0]);
236 anchor
= argList
.add(fieldRef
);
242 if (newQualifier
!= null) {
243 methodRef
.getQualifierExpression().replace(newQualifier
);
247 protected void findExternalUsages(final ArrayList
<UsageInfo
> result
) {
248 findExternalReferences(myMember
, result
);