move instance method: resolve conflict local var/field in target class

IDEA-174017
This commit is contained in:
Anna Kozlova
2017-06-08 17:49:06 +03:00
parent 46c37550c0
commit e32734234d
4 changed files with 59 additions and 5 deletions
@@ -147,7 +147,7 @@ public class MoveInstanceMethodProcessor extends BaseRefactoringProcessor{
try {
ConflictsUtil.checkMethodConflicts(myTargetClass, myMethod, getPatternMethod(), conflicts);
}
catch (IncorrectOperationException e) {}
catch (IncorrectOperationException ignored) {}
return showConflicts(conflicts, usages);
}
@@ -455,16 +455,16 @@ public class MoveInstanceMethodProcessor extends BaseRefactoringProcessor{
}
catch (IncorrectOperationException e) {
LOG.error(e);
return null;
}
return null;
}
private PsiMethod createMethodToAdd () {
ChangeContextUtil.encodeContextInfo(myMethod, true);
try {
final PsiManager manager = myMethod.getManager();
final PsiElementFactory factory = JavaPsiFacade.getInstance(manager.getProject()).getElementFactory();
JavaPsiFacade facade = JavaPsiFacade.getInstance(manager.getProject());
final PsiElementFactory factory = facade.getElementFactory();
//correct internal references
final PsiCodeBlock body = myMethod.getBody();
@@ -492,8 +492,11 @@ public class MoveInstanceMethodProcessor extends BaseRefactoringProcessor{
final PsiElement resolved = expression.resolve();
if (ExpressionUtils.isReferenceTo(qualifier, myTargetVariable)) {
if (resolved instanceof PsiField) {
String fieldName = ((PsiField)resolved).getName();
LOG.assertTrue(fieldName != null);
for (PsiParameter parameter : myMethod.getParameterList().getParameters()) {
if (Comparing.strEqual(parameter.getName(), ((PsiField)resolved).getName())) {
if (Comparing.strEqual(parameter.getName(), fieldName) ||
facade.getResolveHelper().resolveReferencedVariable(fieldName, expression) != null) {
qualifier.replace(factory.createExpressionFromText("this", null));
return;
}
@@ -0,0 +1,23 @@
import java.util.ArrayList;
import java.util.List;
class Data {
final List<Datum> datums;
Data(List<Datum> datums) {
this.datums = datums;
}
static class Datum { }
}
class DataUser {
public List<Data.Datum> fi<caret>lter(Data data) {
List<Data.Datum> datums = new ArrayList<>();
for (Data.Datum datum : data.datums) {
if (datum != null) datums.add(datum);
}
return datums;
}
}
@@ -0,0 +1,24 @@
import java.util.ArrayList;
import java.util.List;
class Data {
final List<Datum> datums;
Data(List<Datum> datums) {
this.datums = datums;
}
public List<Datum> filter() {
List<Datum> datums = new ArrayList<>();
for (Datum datum : this.datums) {
if (datum != null) datums.add(datum);
}
return datums;
}
static class Datum { }
}
class DataUser {
}
@@ -104,6 +104,10 @@ public class MoveInstanceMethodTest extends LightRefactoringTestCase {
doTest(true, 0);
}
public void testConflictingLocalVariableAndTargetClassField() throws Exception {
doTest(true, 0);
}
public void testMethodReference() throws Exception {
BaseRefactoringProcessor.ConflictsInTestsException.withIgnoredConflicts(() -> doTest(true, 0));
}