mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-09-27 10:03:11 +07:00
extract class: do not warn about usages of statics in class initializers, preserve static imports (IDEA-106017)
This commit is contained in:
+11
-3
@@ -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));
|
||||
|
||||
+3
@@ -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);
|
||||
}
|
||||
|
||||
+7
@@ -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();
|
||||
|
||||
Reference in New Issue
Block a user