From e8f211bdd9b2443a339e529af490075c1a2c64ff Mon Sep 17 00:00:00 2001 From: Anna Kozlova Date: Tue, 11 Sep 2012 18:08:07 +0400 Subject: [PATCH] extract method: detect used lambda params in selection (IDEA-91345) --- .../psi/controlFlow/LocalsControlFlowPolicy.java | 15 ++++++++------- .../refactoring/extractMethod/OneLineLambda.java | 5 +++++ .../extractMethod/OneLineLambda_after.java | 9 +++++++++ .../intellij/refactoring/ExtractMethodTest.java | 4 ++++ 4 files changed, 26 insertions(+), 7 deletions(-) create mode 100644 java/java-tests/testData/refactoring/extractMethod/OneLineLambda.java create mode 100644 java/java-tests/testData/refactoring/extractMethod/OneLineLambda_after.java diff --git a/java/java-impl/src/com/intellij/psi/controlFlow/LocalsControlFlowPolicy.java b/java/java-impl/src/com/intellij/psi/controlFlow/LocalsControlFlowPolicy.java index dc106dbcc9de..2ef15db7e70d 100644 --- a/java/java-impl/src/com/intellij/psi/controlFlow/LocalsControlFlowPolicy.java +++ b/java/java-impl/src/com/intellij/psi/controlFlow/LocalsControlFlowPolicy.java @@ -40,13 +40,14 @@ public class LocalsControlFlowPolicy implements ControlFlowPolicy { @Nullable private PsiVariable checkCodeFragment(PsiElement refElement) { - PsiElement codeFragement; - if (refElement instanceof PsiParameter - && ((PsiParameter)refElement).getDeclarationScope() instanceof PsiMethod){ - codeFragement = ((PsiMethod)((PsiParameter)refElement).getDeclarationScope()).getBody(); - } - else{ - codeFragement = ControlFlowUtil.findCodeFragment(refElement); + PsiElement codeFragement = ControlFlowUtil.findCodeFragment(refElement); + if (refElement instanceof PsiParameter) { + final PsiElement declarationScope = ((PsiParameter)refElement).getDeclarationScope(); + if (declarationScope instanceof PsiMethod){ + codeFragement = ((PsiMethod)declarationScope).getBody(); + } else if (declarationScope instanceof PsiLambdaExpression) { + codeFragement = ((PsiLambdaExpression)declarationScope).getBody(); + } } if (codeFragement == null) return null; if (myCodeFragment.getContainingFile() == codeFragement.getContainingFile() && //In order for jsp includes to work diff --git a/java/java-tests/testData/refactoring/extractMethod/OneLineLambda.java b/java/java-tests/testData/refactoring/extractMethod/OneLineLambda.java new file mode 100644 index 000000000000..db109ef4b5cd --- /dev/null +++ b/java/java-tests/testData/refactoring/extractMethod/OneLineLambda.java @@ -0,0 +1,5 @@ +class Test { + public void foo() { + Comparable c = o -> o.indexOf("foo"); + } +} diff --git a/java/java-tests/testData/refactoring/extractMethod/OneLineLambda_after.java b/java/java-tests/testData/refactoring/extractMethod/OneLineLambda_after.java new file mode 100644 index 000000000000..c5196b4e9ced --- /dev/null +++ b/java/java-tests/testData/refactoring/extractMethod/OneLineLambda_after.java @@ -0,0 +1,9 @@ +class Test { + public void foo() { + Comparable c = o -> newMethod(o); + } + + private int newMethod(String o) { + return o.indexOf("foo"); + } +} diff --git a/java/java-tests/testSrc/com/intellij/refactoring/ExtractMethodTest.java b/java/java-tests/testSrc/com/intellij/refactoring/ExtractMethodTest.java index 776fedc344f9..81e598136243 100644 --- a/java/java-tests/testSrc/com/intellij/refactoring/ExtractMethodTest.java +++ b/java/java-tests/testSrc/com/intellij/refactoring/ExtractMethodTest.java @@ -540,6 +540,10 @@ public class ExtractMethodTest extends LightCodeInsightTestCase { doTest(); } + public void testOneLineLambda() throws Exception { + doTest(); + } + private void doTestDisabledParam() throws PrepareFailedException { final CodeStyleSettings settings = CodeStyleSettingsManager.getSettings(getProject()); settings.ELSE_ON_NEW_LINE = true;