From 3345967b854344aade7b04a91dd07b45f0004653 Mon Sep 17 00:00:00 2001 From: Tagir Valeev Date: Fri, 19 Apr 2019 13:40:47 +0700 Subject: [PATCH] Parameter mapping fixed in case if two vars introduced --- .../inline/InlineMethodProcessor.java | 40 ++++++++++--------- .../ConvertToSingleReturnWithFinished.java | 16 ++++++++ ...nvertToSingleReturnWithFinished.java.after | 21 ++++++++++ .../refactoring/inline/InlineMethodTest.java | 4 ++ 4 files changed, 63 insertions(+), 18 deletions(-) create mode 100644 java/java-tests/testData/refactoring/inlineMethod/ConvertToSingleReturnWithFinished.java create mode 100644 java/java-tests/testData/refactoring/inlineMethod/ConvertToSingleReturnWithFinished.java.after diff --git a/java/java-impl/src/com/intellij/refactoring/inline/InlineMethodProcessor.java b/java/java-impl/src/com/intellij/refactoring/inline/InlineMethodProcessor.java index 5916dd4e7b2e..8c925226473d 100644 --- a/java/java-impl/src/com/intellij/refactoring/inline/InlineMethodProcessor.java +++ b/java/java-impl/src/com/intellij/refactoring/inline/InlineMethodProcessor.java @@ -652,8 +652,6 @@ public class InlineMethodProcessor extends BaseRefactoringProcessor { PsiElement firstAdded = null; if (firstBodyElement != null && firstBodyElement != blockData.block.getRBrace()) { int last = statements.length - 1; - /*PsiElement first = statements[0]; - PsiElement last = statements[statements.length - 1];*/ if (last > 0 && statements[last] instanceof PsiReturnStatement && tailCall != InlineUtil.TailCallType.Return) { @@ -668,22 +666,28 @@ public class InlineMethodProcessor extends BaseRefactoringProcessor { firstAdded = anchorParent.addRangeBefore(firstBodyElement, beforeRBraceStatement, anchor); - PsiElement current = firstAdded.getPrevSibling(); - LOG.assertTrue(current != null); - if (blockData.resultVar != null) { - PsiDeclarationStatement statement = PsiTreeUtil.getNextSiblingOfType(current, PsiDeclarationStatement.class); - resultVar = (PsiLocalVariable)statement.getDeclaredElements()[0]; - current = statement; - } - if (blockData.thisVar != null) { - PsiDeclarationStatement statement = PsiTreeUtil.getNextSiblingOfType(current, PsiDeclarationStatement.class); - thisVar = (PsiLocalVariable)statement.getDeclaredElements()[0]; - current = statement; - } - for (int i = 0; i < parmVars.length; i++) { - PsiDeclarationStatement statement = PsiTreeUtil.getNextSiblingOfType(current, PsiDeclarationStatement.class); - parmVars[i] = (PsiLocalVariable)statement.getDeclaredElements()[0]; - current = statement; + for (PsiElement e = firstAdded; e != anchor; e = e.getNextSibling()) { + if (e instanceof PsiDeclarationStatement) { + PsiElement[] elements = ((PsiDeclarationStatement)e).getDeclaredElements(); + PsiLocalVariable var = ObjectUtils.tryCast(ArrayUtil.getFirstElement(elements), PsiLocalVariable.class); + if (var != null) { + String name = var.getName(); + LOG.assertTrue(name != null); + if (blockData.resultVar != null && name.equals(blockData.resultVar.getName())) { + resultVar = var; + } + else if (blockData.thisVar != null && name.equals(blockData.thisVar.getName())) { + thisVar = var; + } else { + for (int i = 0; i < blockData.parmVars.length; i++) { + if (name.equals(blockData.parmVars[i].getName())) { + parmVars[i] = var; + break; + } + } + } + } + } } if (statements.length > 0) { diff --git a/java/java-tests/testData/refactoring/inlineMethod/ConvertToSingleReturnWithFinished.java b/java/java-tests/testData/refactoring/inlineMethod/ConvertToSingleReturnWithFinished.java new file mode 100644 index 000000000000..15a1838e311b --- /dev/null +++ b/java/java-tests/testData/refactoring/inlineMethod/ConvertToSingleReturnWithFinished.java @@ -0,0 +1,16 @@ +class A { + String foo(int i) { + if (i > 0) { + if (i == 10) return null; + System.out.println(i); + } + return String.valueOf(i); + } + + void bar(int x) { + if (x > 0) { + System.out.println(foo(x)); + } + System.out.println("x < 0"); + } +} diff --git a/java/java-tests/testData/refactoring/inlineMethod/ConvertToSingleReturnWithFinished.java.after b/java/java-tests/testData/refactoring/inlineMethod/ConvertToSingleReturnWithFinished.java.after new file mode 100644 index 000000000000..d159d8b933ba --- /dev/null +++ b/java/java-tests/testData/refactoring/inlineMethod/ConvertToSingleReturnWithFinished.java.after @@ -0,0 +1,21 @@ +class A { + + void bar(int x) { + if (x > 0) { + String result = null; + boolean finished = false; + if (x > 0) { + if (x == 10) { + finished = true; + } else { + System.out.println(x); + } + } + if (!finished) { + result = String.valueOf(x); + } + System.out.println(result); + } + System.out.println("x < 0"); + } +} diff --git a/java/java-tests/testSrc/com/intellij/java/refactoring/inline/InlineMethodTest.java b/java/java-tests/testSrc/com/intellij/java/refactoring/inline/InlineMethodTest.java index 5c17dac0f17c..3ae364041177 100644 --- a/java/java-tests/testSrc/com/intellij/java/refactoring/inline/InlineMethodTest.java +++ b/java/java-tests/testSrc/com/intellij/java/refactoring/inline/InlineMethodTest.java @@ -462,6 +462,10 @@ public class InlineMethodTest extends LightRefactoringTestCase { public void testNotTailCallInsideIf() { doTestAssertBadReturn(); } + + public void testConvertToSingleReturnWithFinished() { + doTestAssertBadReturn(); + } @Override protected Sdk getProjectJDK() {