diff --git a/java/java-impl/src/com/intellij/refactoring/introduceParameter/AbstractJavaInplaceIntroducer.java b/java/java-impl/src/com/intellij/refactoring/introduceParameter/AbstractJavaInplaceIntroducer.java index 8540e95cb12e..5424f7086e51 100644 --- a/java/java-impl/src/com/intellij/refactoring/introduceParameter/AbstractJavaInplaceIntroducer.java +++ b/java/java-impl/src/com/intellij/refactoring/introduceParameter/AbstractJavaInplaceIntroducer.java @@ -135,7 +135,10 @@ public abstract class AbstractJavaInplaceIntroducer extends AbstractInplaceIntro if (exprText == null) return null; if (psiVariable == null || !psiVariable.isValid()) return null; final PsiElement refVariableElement = containingFile.findElementAt(marker.getStartOffset()); - PsiExpression expression = PsiTreeUtil.getParentOfType(refVariableElement, PsiReferenceExpression.class); + final PsiElement refVariableElementParent = refVariableElement != null ? refVariableElement.getParent() : null; + PsiExpression expression = refVariableElement instanceof PsiKeyword && refVariableElementParent instanceof PsiNewExpression + ? (PsiNewExpression)refVariableElementParent + : PsiTreeUtil.getParentOfType(refVariableElement, PsiReferenceExpression.class); if (expression instanceof PsiReferenceExpression) { final String referenceName = ((PsiReferenceExpression)expression).getReferenceName(); if (((PsiReferenceExpression)expression).resolve() == psiVariable || diff --git a/java/java-tests/testData/refactoring/inplaceIntroduceField/restoreNewExpression.java b/java/java-tests/testData/refactoring/inplaceIntroduceField/restoreNewExpression.java new file mode 100644 index 000000000000..40f24801352e --- /dev/null +++ b/java/java-tests/testData/refactoring/inplaceIntroduceField/restoreNewExpression.java @@ -0,0 +1,18 @@ +public class MyClass { + public void test() { + if (new Inner().isWriteReplace()) { + return new Inner().writeReplace(); + } + return false; + } + + private class Inner { + public boolean isWriteReplace() { + return false; + } + + public boolean writeReplace() { + return false; + } + } +} diff --git a/java/java-tests/testData/refactoring/inplaceIntroduceField/restoreNewExpression_after.java b/java/java-tests/testData/refactoring/inplaceIntroduceField/restoreNewExpression_after.java new file mode 100644 index 000000000000..b3aff0346da8 --- /dev/null +++ b/java/java-tests/testData/refactoring/inplaceIntroduceField/restoreNewExpression_after.java @@ -0,0 +1,22 @@ +public class MyClass { + + private Inner inner; + + public void test() { + inner = new Inner(); + if (inner.isWriteReplace()) { + return inner.writeReplace(); + } + return false; + } + + private class Inner { + public boolean isWriteReplace() { + return false; + } + + public boolean writeReplace() { + return false; + } + } +} diff --git a/java/java-tests/testSrc/com/intellij/refactoring/InplaceIntroduceFieldTest.java b/java/java-tests/testSrc/com/intellij/refactoring/InplaceIntroduceFieldTest.java index fa6dea38ce69..93cb9d0aec94 100644 --- a/java/java-tests/testSrc/com/intellij/refactoring/InplaceIntroduceFieldTest.java +++ b/java/java-tests/testSrc/com/intellij/refactoring/InplaceIntroduceFieldTest.java @@ -89,6 +89,15 @@ public class InplaceIntroduceFieldTest extends AbstractJavaInplaceIntroduceTest }); } + public void testRestoreNewExpression() throws Exception { + doTest(new Pass() { + @Override + public void pass(AbstractInplaceIntroducer inplaceIntroduceFieldPopup) { + inplaceIntroduceFieldPopup.setReplaceAllOccurrences(true); + } + }); + } + public void testEscapePosition() throws Exception { doTestEscape(); }