From 2d7473841bf497dd2a8eb2371444103aef8813aa Mon Sep 17 00:00:00 2001 From: anna Date: Thu, 11 Feb 2010 17:54:13 +0300 Subject: [PATCH] inline parameter: assignment to local variable between its declaration and the call causes the incompilable code (IDEA-52164) --- .../inline/InlineParameterExpressionProcessor.java | 7 +++++ .../refactoring/inlineParameter/WriteAccess.java | 31 ++++++++++++++++++++++ .../refactoring/inline/InlineParameterTest.java | 9 +++++++ 3 files changed, 47 insertions(+) create mode 100644 java/java-tests/testData/refactoring/inlineParameter/WriteAccess.java diff --git a/java/java-impl/src/com/intellij/refactoring/inline/InlineParameterExpressionProcessor.java b/java/java-impl/src/com/intellij/refactoring/inline/InlineParameterExpressionProcessor.java index 4a84da37f7..28d8ea1543 100644 --- a/java/java-impl/src/com/intellij/refactoring/inline/InlineParameterExpressionProcessor.java +++ b/java/java-impl/src/com/intellij/refactoring/inline/InlineParameterExpressionProcessor.java @@ -121,6 +121,13 @@ public class InlineParameterExpressionProcessor extends BaseRefactoringProcessor else if (elements[0] instanceof PsiAssignmentExpression) { localInitializer = ((PsiAssignmentExpression)elements[0]).getRExpression(); } + else if (elements[0] instanceof PsiReferenceExpression) { + final PsiReferenceExpression refElement = (PsiReferenceExpression)elements[0]; + final PsiElement parent = refElement.getParent(); + if (parent instanceof PsiAssignmentExpression && ((PsiAssignmentExpression)parent).getLExpression() == refElement) { + localInitializer = ((PsiAssignmentExpression)parent).getRExpression(); + } + } if (localInitializer != null) { final PsiElement replacement; if (localToParamRef.containsKey(localVariable)) { diff --git a/java/java-tests/testData/refactoring/inlineParameter/WriteAccess.java b/java/java-tests/testData/refactoring/inlineParameter/WriteAccess.java new file mode 100644 index 0000000000..92d3e29ff0 --- /dev/null +++ b/java/java-tests/testData/refactoring/inlineParameter/WriteAccess.java @@ -0,0 +1,31 @@ +public class ExpData { + public void use(Object p) { + System.out.println(p); + } + + public void context() { + ObjectType v1 = new ObjectType(); + v1 = v1.provide(); + inline1(v1); + + int v2 = 1; + v2 += System.identityHashCode(new Object()); + inline2(v2); + } + + public void inline1(ObjectType subj) { + use(subj); + } + + public void inline2(int subj) { + use(subj); + } +} + +class ObjectType { + private int value = 1; + + public ObjectType provide() { + return new ObjectType(); + } +} diff --git a/java/java-tests/testSrc/com/intellij/refactoring/inline/InlineParameterTest.java b/java/java-tests/testSrc/com/intellij/refactoring/inline/InlineParameterTest.java index 7f427f5107..1e3a7529b2 100644 --- a/java/java-tests/testSrc/com/intellij/refactoring/inline/InlineParameterTest.java +++ b/java/java-tests/testSrc/com/intellij/refactoring/inline/InlineParameterTest.java @@ -228,6 +228,15 @@ public class InlineParameterTest extends LightCodeInsightTestCase { } } + public void testWriteAccess() throws Exception { + try { + doTest(false); + } + catch (BaseRefactoringProcessor.ConflictsInTestsException e) { + assertEquals("Parameter initializer depends on value which is not available inside method and cannot be inlined", e.getMessage()); + } + } + private void doTest(final boolean createLocal) throws Exception { getProject().putUserData(InlineParameterExpressionProcessor.CREATE_LOCAL_FOR_TESTS,createLocal); -- 2.11.4.GIT