From 2e36ae10882c1298223572e8c49f1ade4d3ac8ce Mon Sep 17 00:00:00 2001 From: Anna Kozlova Date: Thu, 20 Jun 2013 21:14:21 +0400 Subject: [PATCH] allow to inline array definition when accessExpression is used for write; exclude new expressions --- .../refactoring/inline/InlineLocalHandler.java | 5 +++-- .../refactoring/inline/InlineParameterHandler.java | 2 +- .../inlineLocal/ArrayMethodCallInitialized.java | 11 +++++++++++ .../inlineLocal/ArrayMethodCallInitialized.java.after | 10 ++++++++++ .../intellij/refactoring/inline/InlineLocalTest.java | 4 ++++ 5 files changed, 29 insertions(+), 3 deletions(-) create mode 100644 java/java-tests/testData/refactoring/inlineLocal/ArrayMethodCallInitialized.java create mode 100644 java/java-tests/testData/refactoring/inlineLocal/ArrayMethodCallInitialized.java.after diff --git a/java/java-impl/src/com/intellij/refactoring/inline/InlineLocalHandler.java b/java/java-impl/src/com/intellij/refactoring/inline/InlineLocalHandler.java index 317117537ac7..3c90eecd11f9 100644 --- a/java/java-impl/src/com/intellij/refactoring/inline/InlineLocalHandler.java +++ b/java/java-impl/src/com/intellij/refactoring/inline/InlineLocalHandler.java @@ -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(); } diff --git a/java/java-impl/src/com/intellij/refactoring/inline/InlineParameterHandler.java b/java/java-impl/src/com/intellij/refactoring/inline/InlineParameterHandler.java index e22f0b86e2cd..58d4d1eb282d 100644 --- a/java/java-impl/src/com/intellij/refactoring/inline/InlineParameterHandler.java +++ b/java/java-impl/src/com/intellij/refactoring/inline/InlineParameterHandler.java @@ -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 { diff --git a/java/java-tests/testData/refactoring/inlineLocal/ArrayMethodCallInitialized.java b/java/java-tests/testData/refactoring/inlineLocal/ArrayMethodCallInitialized.java new file mode 100644 index 000000000000..aa7c17cf6fb1 --- /dev/null +++ b/java/java-tests/testData/refactoring/inlineLocal/ArrayMethodCallInitialized.java @@ -0,0 +1,11 @@ +public class A { + + public void testInlineRefactoring() { + int[] array = ar(); + array[1] = 22; + } + + private int[] ar() { + return new int[0]; + } +} \ No newline at end of file diff --git a/java/java-tests/testData/refactoring/inlineLocal/ArrayMethodCallInitialized.java.after b/java/java-tests/testData/refactoring/inlineLocal/ArrayMethodCallInitialized.java.after new file mode 100644 index 000000000000..72d6b9f2b18e --- /dev/null +++ b/java/java-tests/testData/refactoring/inlineLocal/ArrayMethodCallInitialized.java.after @@ -0,0 +1,10 @@ +public class A { + + public void testInlineRefactoring() { + ar()[1] = 22; + } + + private int[] ar() { + return new int[0]; + } +} \ No newline at end of file diff --git a/java/java-tests/testSrc/com/intellij/refactoring/inline/InlineLocalTest.java b/java/java-tests/testSrc/com/intellij/refactoring/inline/InlineLocalTest.java index 709db9911ea5..811d52f817c1 100644 --- a/java/java-tests/testSrc/com/intellij/refactoring/inline/InlineLocalTest.java +++ b/java/java-tests/testSrc/com/intellij/refactoring/inline/InlineLocalTest.java @@ -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); }