extract class: do not warn about usages of statics in class initializers, preserve static imports (IDEA-106017)

This commit is contained in:
anna
2013-04-23 16:53:58 +02:00
parent 1b0f032a13
commit 6100f5a690
8 changed files with 58 additions and 5 deletions
@@ -212,8 +212,8 @@ public class ExtractClassProcessor extends FixableUsagesRefactoringProcessor {
public void visitReferenceExpression(final PsiReferenceExpression expression) {
super.visitReferenceExpression(expression);
final PsiElement resolved = expression.resolve();
if (resolved != null) {
dependsOnMoved[0] |= isInMovedElement(resolved);
if (resolved instanceof PsiMember) {
dependsOnMoved[0] |= !((PsiMember)resolved).hasModifierProperty(PsiModifier.STATIC) && isInMovedElement(resolved);
}
}
});
@@ -550,6 +550,7 @@ public class ExtractClassProcessor extends FixableUsagesRefactoringProcessor {
final Project project = psiManager.getProject();
final GlobalSearchScope scope = GlobalSearchScope.allScope(project);
final Iterable<PsiReference> calls = ReferencesSearch.search(method, scope);
final String fullyQualifiedName = StringUtil.getQualifiedName(newPackageName, newClassName);
for (PsiReference reference : calls) {
final PsiElement referenceElement = reference.getElement();
@@ -557,9 +558,16 @@ public class ExtractClassProcessor extends FixableUsagesRefactoringProcessor {
if (parent instanceof PsiMethodCallExpression) {
final PsiMethodCallExpression call = (PsiMethodCallExpression)parent;
if (!isInMovedElement(call)) {
final String fullyQualifiedName = StringUtil.getQualifiedName(newPackageName, newClassName);
usages.add(new RetargetStaticMethodCall(call, fullyQualifiedName));
}
} else if (parent instanceof PsiImportStaticStatement) {
final PsiJavaCodeReferenceElement importReference = ((PsiImportStaticStatement)parent).getImportReference();
if (importReference != null) {
final PsiElement qualifier = importReference.getQualifier();
if (qualifier instanceof PsiJavaCodeReferenceElement) {
usages.add(new ReplaceClassReference((PsiJavaCodeReferenceElement)qualifier, fullyQualifiedName));
}
}
}
}
usages.add(new RemoveMethod(method));
@@ -34,7 +34,10 @@ public class RetargetStaticMethodCall extends FixableUsageInfo {
final PsiReferenceExpression methodExpression = call.getMethodExpression();
final PsiExpression qualifier = (PsiExpression) methodExpression.getQualifier();
if (qualifier == null) {
final PsiElement resolveScope = call.resolveMethodGenerics().getCurrentFileResolveScope();
if (!(resolveScope instanceof PsiImportStaticStatement)) {
MutationUtils.replaceExpression(delegateClassName + '.' + call.getText(), call);
}
} else {
MutationUtils.replaceExpression(delegateClassName , qualifier);
}
@@ -0,0 +1,7 @@
package foo;
public class Extracted {
public static <T> T foo() {
return null;
}
}
@@ -0,0 +1,3 @@
package foo;
class Test {
}
@@ -0,0 +1,8 @@
package foo;
import static foo.Extracted.foo;
class Usage {
{
foo();
}
}
@@ -0,0 +1,4 @@
package foo;
class Test {
public static <T> T foo() { return null; }
}
@@ -0,0 +1,8 @@
package foo;
import static foo.Test.foo;
class Usage {
{
foo();
}
}
@@ -6,6 +6,7 @@ package com.intellij.refactoring;
import com.intellij.JavaTestUtil;
import com.intellij.openapi.fileEditor.FileDocumentManager;
import com.intellij.openapi.util.text.StringUtil;
import com.intellij.openapi.vfs.LocalFileSystem;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.psi.PsiClass;
@@ -42,10 +43,16 @@ public class ExtractClassTest extends MultiFileTestCase{
}
private void doTestMethod(final String methodName, final String conflicts) throws Exception {
doTestMethod(methodName, conflicts, "Test");
}
private void doTestMethod(final String methodName,
final String conflicts,
final String qualifiedName) throws Exception {
doTest(new PerformAction() {
@Override
public void performAction(final VirtualFile rootDir, final VirtualFile rootAfter) throws Exception {
PsiClass aClass = myJavaFacade.findClass("Test", GlobalSearchScope.projectScope(myProject));
PsiClass aClass = myJavaFacade.findClass(qualifiedName, GlobalSearchScope.projectScope(myProject));
assertNotNull("Class Test not found", aClass);
@@ -105,6 +112,10 @@ public class ExtractClassTest extends MultiFileTestCase{
doTestMethod();
}
public void testStaticImports() throws Exception {
doTestMethod("foo", null, "foo.Test");
}
public void testNoConstructorParams() throws Exception {
doTestFieldAndMethod();
}
@@ -165,7 +176,8 @@ public class ExtractClassTest extends MultiFileTestCase{
private static void doTest(final PsiClass aClass, final ArrayList<PsiMethod> methods, final ArrayList<PsiField> fields, final String conflicts,
boolean generateGettersSetters) {
try {
ExtractClassProcessor processor = new ExtractClassProcessor(aClass, fields, methods, new ArrayList<PsiClass>(), "", null, "Extracted", null, generateGettersSetters, Collections.<MemberInfo>emptyList());
ExtractClassProcessor processor = new ExtractClassProcessor(aClass, fields, methods, new ArrayList<PsiClass>(), StringUtil.getPackageName(aClass.getQualifiedName()), null,
"Extracted", null, generateGettersSetters, Collections.<MemberInfo>emptyList());
processor.run();
LocalFileSystem.getInstance().refresh(false);
FileDocumentManager.getInstance().saveAllDocuments();