From 56311ae33e2cf3dc0d63b6e6bdde1414cd9ef491 Mon Sep 17 00:00:00 2001 From: Anna Kozlova Date: Fri, 18 May 2012 13:00:19 +0400 Subject: [PATCH] inline to anonymous: wrap code with code block when needed (IDEA-86007) --- ...InlineToAnonymousConstructorProcessor.java | 22 +++++++++++++--- .../inlineToAnonymousClass/Braces.java | 26 +++++++++++++++++++ .../inlineToAnonymousClass/Braces.java.after | 22 ++++++++++++++++ .../inline/InlineToAnonymousClassTest.java | 4 +++ 4 files changed, 71 insertions(+), 3 deletions(-) create mode 100644 java/java-tests/testData/refactoring/inlineToAnonymousClass/Braces.java create mode 100644 java/java-tests/testData/refactoring/inlineToAnonymousClass/Braces.java.after diff --git a/java/java-impl/src/com/intellij/refactoring/inline/InlineToAnonymousConstructorProcessor.java b/java/java-impl/src/com/intellij/refactoring/inline/InlineToAnonymousConstructorProcessor.java index 31fbe26be597..b762395a7a2a 100644 --- a/java/java-impl/src/com/intellij/refactoring/inline/InlineToAnonymousConstructorProcessor.java +++ b/java/java-impl/src/com/intellij/refactoring/inline/InlineToAnonymousConstructorProcessor.java @@ -57,11 +57,11 @@ class InlineToAnonymousConstructorProcessor { psiElement().withText(PsiKeyword.THIS))); private final PsiClass myClass; - private final PsiNewExpression myNewExpression; + private PsiNewExpression myNewExpression; private final PsiType mySuperType; private final Map myFieldInitializers = new HashMap(); private final Map myLocalsForParameters = new HashMap(); - private final PsiStatement myNewStatement; + private PsiStatement myNewStatement; private final PsiElementFactory myElementFactory; private PsiMethod myConstructor; private PsiExpressionList myConstructorArguments; @@ -263,7 +263,23 @@ class InlineToAnonymousConstructorProcessor { final PsiDeclarationStatement declaration = myElementFactory.createVariableDeclarationStatement(localName, type, initializer); PsiVariable variable = (PsiVariable)declaration.getDeclaredElements()[0]; PsiUtil.setModifierProperty(variable, PsiModifier.FINAL, true); - myNewStatement.getParent().addBefore(declaration, myNewStatement); + final PsiElement parent = myNewStatement.getParent(); + if (parent instanceof PsiCodeBlock) { + variable = (PsiVariable)((PsiDeclarationStatement)parent.addBefore(declaration, myNewStatement)).getDeclaredElements()[0]; + } + else { + final int offsetInStatement = myNewExpression.getTextRange().getStartOffset() - myNewStatement.getTextRange().getStartOffset(); + final PsiBlockStatement blockStatement = (PsiBlockStatement)myElementFactory.createStatementFromText("{}", null); + PsiCodeBlock block = blockStatement.getCodeBlock(); + block.add(declaration); + block.add(myNewStatement); + block = ((PsiBlockStatement)myNewStatement.replace(blockStatement)).getCodeBlock(); + + variable = (PsiVariable)((PsiDeclarationStatement)block.getStatements()[0]).getDeclaredElements()[0]; + myNewStatement = block.getStatements()[1]; + myNewExpression = PsiTreeUtil.getParentOfType(myNewStatement.findElementAt(offsetInStatement), PsiNewExpression.class); + } + return variable; } catch (IncorrectOperationException e) { diff --git a/java/java-tests/testData/refactoring/inlineToAnonymousClass/Braces.java b/java/java-tests/testData/refactoring/inlineToAnonymousClass/Braces.java new file mode 100644 index 000000000000..fc3eddbb1b9c --- /dev/null +++ b/java/java-tests/testData/refactoring/inlineToAnonymousClass/Braces.java @@ -0,0 +1,26 @@ +public class Demo { + + static class MyParent { + private final String value; + + MyParent(String value) { + this.value = value; + } + } + + static class MyChild extends MyParent { + MyChild(String value) { + super(value); + } + } + + public static void main(String[] args) { + + String value = "something"; + final MyParent p; + if (true) + p = new MyChild(value); + else + p = new MyParent("value"); + } +} \ No newline at end of file diff --git a/java/java-tests/testData/refactoring/inlineToAnonymousClass/Braces.java.after b/java/java-tests/testData/refactoring/inlineToAnonymousClass/Braces.java.after new file mode 100644 index 000000000000..8a2d39edbd07 --- /dev/null +++ b/java/java-tests/testData/refactoring/inlineToAnonymousClass/Braces.java.after @@ -0,0 +1,22 @@ +public class Demo { + + static class MyParent { + private final String value; + + MyParent(String value) { + this.value = value; + } + } + + public static void main(String[] args) { + + String value = "something"; + final MyParent p; + if (true) { + final String value1 = value; + p = new MyParent(value1); + } + else + p = new MyParent("value"); + } +} \ No newline at end of file diff --git a/java/java-tests/testSrc/com/intellij/refactoring/inline/InlineToAnonymousClassTest.java b/java/java-tests/testSrc/com/intellij/refactoring/inline/InlineToAnonymousClassTest.java index f9edb4b24490..469acd2a150f 100644 --- a/java/java-tests/testSrc/com/intellij/refactoring/inline/InlineToAnonymousClassTest.java +++ b/java/java-tests/testSrc/com/intellij/refactoring/inline/InlineToAnonymousClassTest.java @@ -226,6 +226,10 @@ public class InlineToAnonymousClassTest extends LightRefactoringTestCase { doTest(false, true); } + public void testBraces() throws Exception { + doTest(false, false); + } + public void testNoInlineAbstract() throws Exception { doTestNoInline("Abstract classes cannot be inlined"); }