allow to inline array definition when accessExpression is used for write; exclude new expressions

This commit is contained in:
Anna Kozlova
2013-06-20 21:16:00 +04:00
parent 875c28089f
commit 2e36ae1088
5 changed files with 29 additions and 3 deletions
@@ -195,7 +195,7 @@ public class InlineLocalHandler extends JavaInlineActionHandler {
}
}
final PsiElement writeAccess = checkRefsInAugmentedAssignmentOrUnaryModified(refsToInline);
final PsiElement writeAccess = checkRefsInAugmentedAssignmentOrUnaryModified(refsToInline, defToInline);
if (writeAccess != null) {
HighlightManager.getInstance(project).addOccurrenceHighlights(editor, new PsiElement[]{writeAccess}, writeAttributes, true, null);
String message = RefactoringBundle.getCannotRefactorMessage(RefactoringBundle.message("variable.is.accessed.for.writing", localName));
@@ -273,12 +273,13 @@ public class InlineLocalHandler extends JavaInlineActionHandler {
}
@Nullable
public static PsiElement checkRefsInAugmentedAssignmentOrUnaryModified(final PsiElement[] refsToInline) {
public static PsiElement checkRefsInAugmentedAssignmentOrUnaryModified(final PsiElement[] refsToInline, PsiElement defToInline) {
for (PsiElement element : refsToInline) {
PsiElement parent = element.getParent();
if (parent instanceof PsiArrayAccessExpression) {
if (((PsiArrayAccessExpression)parent).getIndexExpression() == element) continue;
if (defToInline instanceof PsiExpression && !(defToInline instanceof PsiNewExpression)) continue;
element = parent;
parent = parent.getParent();
}
@@ -125,7 +125,7 @@ public class InlineParameterHandler extends JavaInlineActionHandler {
if (rExpr != null) {
final PsiElement[] refs = DefUseUtil.getRefs(codeBlock, psiParameter, refExpr);
if (InlineLocalHandler.checkRefsInAugmentedAssignmentOrUnaryModified(refs) == null) {
if (InlineLocalHandler.checkRefsInAugmentedAssignmentOrUnaryModified(refs, def) == null) {
new WriteCommandAction(project) {
@Override
protected void run(Result result) throws Throwable {
@@ -0,0 +1,11 @@
public class A {
public void testInlineRefactoring() {
int[] array = ar();
arr<caret>ay[1] = 22;
}
private int[] ar() {
return new int[0];
}
}
@@ -0,0 +1,10 @@
public class A {
public void testInlineRefactoring() {
ar()[1] = 22;
}
private int[] ar() {
return new int[0];
}
}
@@ -140,6 +140,10 @@ public class InlineLocalTest extends LightCodeInsightTestCase {
"Variable 'arr' is accessed for writing.");
}
public void testArrayMethodCallInitialized() throws Exception {
doTest(true);
}
public void testArrayIndex() throws Exception {
doTest(true);
}