move static members: correct result ref (IDEA-93582)

This commit is contained in:
anna
2012-10-25 15:52:43 +02:00
parent f8756f2991
commit 75335192ab
7 changed files with 81 additions and 1 deletions
@@ -287,6 +287,7 @@ public class ChangeContextUtil {
try{
PsiExpression qualifier = refExpr.getQualifierExpression();
if (!(qualifier instanceof PsiReferenceExpression)) return false;
if (refExpr.getTypeParameters().length > 0) return false;
PsiElement qualifierRefElement = ((PsiReferenceExpression)qualifier).resolve();
if (!(qualifierRefElement instanceof PsiClass)) return false;
PsiElement refElement = refExpr.resolve();
@@ -17,8 +17,10 @@ package com.intellij.refactoring.move.moveMembers;
import com.intellij.codeInsight.ChangeContextUtil;
import com.intellij.codeInsight.highlighting.ReadWriteAccessDetector;
import com.intellij.openapi.project.Project;
import com.intellij.psi.*;
import com.intellij.psi.impl.source.resolve.JavaResolveUtil;
import com.intellij.psi.search.GlobalSearchScope;
import com.intellij.psi.search.LocalSearchScope;
import com.intellij.psi.search.searches.ReferencesSearch;
import com.intellij.psi.util.*;
@@ -171,7 +173,17 @@ public class MoveJavaMemberHandler implements MoveMemberHandler {
changeQualifier(refExpr, usage.qualifierClass, usage.member);
}
else {
refExpr.setQualifierExpression(null);
final PsiReferenceParameterList parameterList = refExpr.getParameterList();
if (parameterList != null && parameterList.getTypeArguments().length == 0){
refExpr.setQualifierExpression(null);
} else {
final Project project = element.getProject();
final PsiClass targetClass =
JavaPsiFacade.getInstance(project).findClass(options.getTargetClassName(), GlobalSearchScope.projectScope(project));
if (targetClass != null) {
changeQualifier(refExpr, targetClass, usage.member);
}
}
}
}
else { // no qualifier
@@ -0,0 +1,16 @@
package pack1;
interface Eff<A, B> {
B f(A a);
}
abstract class POne<A> {
abstract A _1();
}
final class Hooray<A> {
public <B> Hooray<B> map(final Eff<A, B> f) {
return null;
}
}
@@ -0,0 +1,15 @@
package pack1;
public class C {
static <A> POne<Hooray<A>> sequence(final Hooray<POne<A>> as) {
return new POne<Hooray<A>>() {
public Hooray<A> _1() {
return as.map(C.<A>__1());
}
};
}
static <A> Eff<POne<A>, A> __1() {
return POne::_1;
}
}
@@ -0,0 +1,28 @@
package pack1;
interface Eff<A, B> {
B f(A a);
}
abstract class POne<A> {
abstract A _1();
static <A> POne<Hooray<A>> sequence(final Hooray<POne<A>> as) {
return new POne<Hooray<A>>() {
public Hooray<A> _1() {
return as.map(POne.<A>__1());
}
};
}
static <A> Eff<POne<A>, A> __1() {
return POne::_1;
}
}
final class Hooray<A> {
public <B> Hooray<B> map(final Eff<A, B> f) {
return null;
}
}
@@ -0,0 +1,4 @@
package pack1;
public class C {
}
@@ -57,6 +57,10 @@ public class MoveMembersTest extends MultiFileTestCase {
doTest("pack1.A", "pack1.C", 0, 1, 2);
}
public void testParameterizedRefOn() throws Exception {
doTest("pack1.POne", "pack1.C", 1, 2);
}
public void testIDEADEV12448() throws Exception {
doTest("B", "A", false, 0);
}