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 4a84da37f701..28d8ea1543d9 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 000000000000..92d3e29ff012 --- /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 7f427f510796..1e3a7529b21d 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);