From b1b602553c63d6056956627102d2e6a31ac44de4 Mon Sep 17 00:00:00 2001 From: Anna Kozlova Date: Thu, 15 May 2014 17:07:12 +0400 Subject: [PATCH] extract field from auto closable (IDEA-125141) --- .../introduceField/LocalToFieldHandler.java | 23 +++++++++--------- .../inplaceIntroduceField/localResource.java | 22 +++++++++++++++++ .../localResource_after.java | 24 +++++++++++++++++++ .../InplaceIntroduceFieldTest.java | 9 +++++++ 4 files changed, 66 insertions(+), 12 deletions(-) create mode 100644 java/java-tests/testData/refactoring/inplaceIntroduceField/localResource.java create mode 100644 java/java-tests/testData/refactoring/inplaceIntroduceField/localResource_after.java diff --git a/java/java-impl/src/com/intellij/refactoring/introduceField/LocalToFieldHandler.java b/java/java-impl/src/com/intellij/refactoring/introduceField/LocalToFieldHandler.java index c308bcf84daa..5b5c39fb10a8 100644 --- a/java/java-impl/src/com/intellij/refactoring/introduceField/LocalToFieldHandler.java +++ b/java/java-impl/src/com/intellij/refactoring/introduceField/LocalToFieldHandler.java @@ -168,7 +168,7 @@ public abstract class LocalToFieldHandler { } } - private static PsiStatement createAssignment(PsiLocalVariable local, String fieldname, PsiElementFactory factory) { + private static PsiExpressionStatement createAssignment(PsiLocalVariable local, String fieldname, PsiElementFactory factory) { try { String pattern = fieldname + "=0;"; PsiExpressionStatement statement = (PsiExpressionStatement)factory.createStatementFromText(pattern, null); @@ -262,7 +262,6 @@ public abstract class LocalToFieldHandler { private final BaseExpressionToFieldHandler.InitializationPlace myInitializerPlace; private final PsiExpression[] myOccurences; private PsiField myField; - private PsiStatement myAssignmentStatement; public IntroduceFieldRunnable(boolean rebindNeeded, PsiLocalVariable local, @@ -303,7 +302,7 @@ public abstract class LocalToFieldHandler { } myLocal.normalizeDeclaration(); - PsiDeclarationStatement declarationStatement = (PsiDeclarationStatement)myLocal.getParent(); + PsiElement declarationStatement = myLocal.getParent(); final BaseExpressionToFieldHandler.InitializationPlace finalInitializerPlace; if (myLocal.getInitializer() == null) { finalInitializerPlace = IN_FIELD_DECLARATION; @@ -319,20 +318,24 @@ public abstract class LocalToFieldHandler { break; case IN_CURRENT_METHOD: - PsiStatement statement = createAssignment(myLocal, myFieldName, factory); - myAssignmentStatement = (PsiStatement)declarationStatement.replace(statement); + PsiExpressionStatement statement = createAssignment(myLocal, myFieldName, factory); + if (declarationStatement instanceof PsiDeclarationStatement) { + declarationStatement.replace(statement); + } else { + myLocal.replace(statement.getExpression()); + } break; case IN_CONSTRUCTOR: - myAssignmentStatement = addInitializationToConstructors(myLocal, myField, enclosingConstructor, factory); + addInitializationToConstructors(myLocal, myField, enclosingConstructor, factory); break; case IN_SETUP_METHOD: - myAssignmentStatement = addInitializationToSetUp(myLocal, myField, factory); + addInitializationToSetUp(myLocal, myField, factory); } if (enclosingConstructor != null && myInitializerPlace == IN_CONSTRUCTOR) { PsiStatement statement = createAssignment(myLocal, myFieldName, factory); - myAssignmentStatement = (PsiStatement)declarationStatement.replace(statement); + declarationStatement.replace(statement); } if (rebindNeeded2) { @@ -355,9 +358,5 @@ public abstract class LocalToFieldHandler { public PsiField getField() { return myField; } - - public PsiStatement getAssignmentStatement() { - return myAssignmentStatement; - } } } diff --git a/java/java-tests/testData/refactoring/inplaceIntroduceField/localResource.java b/java/java-tests/testData/refactoring/inplaceIntroduceField/localResource.java new file mode 100644 index 000000000000..c2277326f402 --- /dev/null +++ b/java/java-tests/testData/refactoring/inplaceIntroduceField/localResource.java @@ -0,0 +1,22 @@ +import java.io.BufferedReader; +import java.io.FileNotFoundException; +import java.io.FileReader; +import java.io.IOException; + +class JavaClass { + + static String readFirstLineFromFile() throws IOException { + try (BufferedReader br = createReader("any")) { + return br.readLine(); + } + } + + private static BufferedReader createReader(String path) { + try { + return new BufferedReader(new FileReader(path)); + } catch (FileNotFoundException e) { + // for example purposes #createReader shouldn't throw any checked exception + throw new RuntimeException(e); + } + } +} diff --git a/java/java-tests/testData/refactoring/inplaceIntroduceField/localResource_after.java b/java/java-tests/testData/refactoring/inplaceIntroduceField/localResource_after.java new file mode 100644 index 000000000000..7be3979cd0d8 --- /dev/null +++ b/java/java-tests/testData/refactoring/inplaceIntroduceField/localResource_after.java @@ -0,0 +1,24 @@ +import java.io.BufferedReader; +import java.io.FileNotFoundException; +import java.io.FileReader; +import java.io.IOException; + +class JavaClass { + + private static BufferedReader br; + + static String readFirstLineFromFile() throws IOException { + try (br = createReader("any")) { + return br.readLine(); + } + } + + private static BufferedReader createReader(String path) { + try { + return new BufferedReader(new FileReader(path)); + } catch (FileNotFoundException e) { + // for example purposes #createReader shouldn't throw any checked exception + throw new RuntimeException(e); + } + } +} diff --git a/java/java-tests/testSrc/com/intellij/refactoring/InplaceIntroduceFieldTest.java b/java/java-tests/testSrc/com/intellij/refactoring/InplaceIntroduceFieldTest.java index 8463eaa09a56..5fcc07b3afed 100644 --- a/java/java-tests/testSrc/com/intellij/refactoring/InplaceIntroduceFieldTest.java +++ b/java/java-tests/testSrc/com/intellij/refactoring/InplaceIntroduceFieldTest.java @@ -107,6 +107,15 @@ public class InplaceIntroduceFieldTest extends AbstractJavaInplaceIntroduceTest }); } + public void testLocalResource() throws Exception { + doTest(new Pass() { + @Override + public void pass(AbstractInplaceIntroducer inplaceIntroduceFieldPopup) { + inplaceIntroduceFieldPopup.setReplaceAllOccurrences(true); + } + }); + } + public void testEscapePosition() throws Exception { doTestEscape(); }