From 2b49ac9eb4533072eae2bcd494598003ae7a1076 Mon Sep 17 00:00:00 2001 From: anna Date: Fri, 29 Nov 2013 21:09:50 +0100 Subject: [PATCH] introduce variable inside lambda: do not step out of lambda block --- .../IntroduceVariableBase.java | 1 + .../codeInsight/JavaPsiEquivalenceUtil.java | 7 ++++-- .../introduceVariable/Lambda.after.java | 22 +++++++++++++++++++ .../refactoring/introduceVariable/Lambda.java | 20 +++++++++++++++++ .../refactoring/IntroduceVariableTest.java | 4 ++++ 5 files changed, 52 insertions(+), 2 deletions(-) create mode 100644 java/java-tests/testData/refactoring/introduceVariable/Lambda.after.java create mode 100644 java/java-tests/testData/refactoring/introduceVariable/Lambda.java diff --git a/java/java-impl/src/com/intellij/refactoring/introduceVariable/IntroduceVariableBase.java b/java/java-impl/src/com/intellij/refactoring/introduceVariable/IntroduceVariableBase.java index d33c9b0da205..b6cae991bf1f 100644 --- a/java/java-impl/src/com/intellij/refactoring/introduceVariable/IntroduceVariableBase.java +++ b/java/java-impl/src/com/intellij/refactoring/introduceVariable/IntroduceVariableBase.java @@ -737,6 +737,7 @@ public abstract class IntroduceVariableBase extends IntroduceHandlerBase { while (true) { if (containerParent instanceof PsiFile) break; if (containerParent instanceof PsiMethod) break; + if (containerParent instanceof PsiLambdaExpression) break; if (!skipForStatement && containerParent instanceof PsiForStatement) break; containerParent = containerParent.getParent(); if (containerParent instanceof PsiCodeBlock) { diff --git a/java/java-psi-impl/src/com/intellij/codeInsight/JavaPsiEquivalenceUtil.java b/java/java-psi-impl/src/com/intellij/codeInsight/JavaPsiEquivalenceUtil.java index 7b463a8e5bb8..fca20e67ecaa 100644 --- a/java/java-psi-impl/src/com/intellij/codeInsight/JavaPsiEquivalenceUtil.java +++ b/java/java-psi-impl/src/com/intellij/codeInsight/JavaPsiEquivalenceUtil.java @@ -29,8 +29,11 @@ public class JavaPsiEquivalenceUtil { if (o1 instanceof PsiParameter && o2 instanceof PsiParameter) { final PsiElement scope1 = ((PsiParameter)o1).getDeclarationScope(); final PsiElement scope2 = ((PsiParameter)o2).getDeclarationScope(); - if (scope1 instanceof PsiMethod && scope2 instanceof PsiMethod && !scope1.getTextRange().intersects(scope2.getTextRange())) { - return ((PsiParameter)o1).getName().compareTo(((PsiParameter)o2).getName()); + if (scope1 instanceof PsiMethod && scope2 instanceof PsiMethod || + scope1 instanceof PsiLambdaExpression && scope2 instanceof PsiLambdaExpression) { + if (!scope1.getTextRange().intersects(scope2.getTextRange())) { + return ((PsiParameter)o1).getName().compareTo(((PsiParameter)o2).getName()); + } } } return 1; diff --git a/java/java-tests/testData/refactoring/introduceVariable/Lambda.after.java b/java/java-tests/testData/refactoring/introduceVariable/Lambda.after.java new file mode 100644 index 000000000000..3d952827c70c --- /dev/null +++ b/java/java-tests/testData/refactoring/introduceVariable/Lambda.after.java @@ -0,0 +1,22 @@ + +import java.util.ArrayList; +import java.util.Collection; + +public class ExtractVariableSample { + interface I { + void foo(String s); + } + + public static void main(String[] args) { + Collection strings = new ArrayList<>(); + I i = (s) -> { + int j = s.hashCode(); + System.out.println(j); }; + + for (String s : strings) { + System.out.println(s.hashCode()); + } + } + + +} \ No newline at end of file diff --git a/java/java-tests/testData/refactoring/introduceVariable/Lambda.java b/java/java-tests/testData/refactoring/introduceVariable/Lambda.java new file mode 100644 index 000000000000..e331f2b10e23 --- /dev/null +++ b/java/java-tests/testData/refactoring/introduceVariable/Lambda.java @@ -0,0 +1,20 @@ + +import java.util.ArrayList; +import java.util.Collection; + +public class ExtractVariableSample { + interface I { + void foo(String s); + } + + public static void main(String[] args) { + Collection strings = new ArrayList<>(); + I i = (s) -> { System.out.println(s.hashCode()); }; + + for (String s : strings) { + System.out.println(s.hashCode()); + } + } + + +} \ No newline at end of file diff --git a/java/java-tests/testSrc/com/intellij/refactoring/IntroduceVariableTest.java b/java/java-tests/testSrc/com/intellij/refactoring/IntroduceVariableTest.java index dd0a6b631545..3ab688544753 100644 --- a/java/java-tests/testSrc/com/intellij/refactoring/IntroduceVariableTest.java +++ b/java/java-tests/testSrc/com/intellij/refactoring/IntroduceVariableTest.java @@ -90,6 +90,10 @@ public class IntroduceVariableTest extends LightCodeInsightTestCase { doTest(new MockIntroduceVariableHandler("j", true, false, false, "int")); } + public void testLambda() throws Exception { + doTest(new MockIntroduceVariableHandler("j", true, false, false, "int")); + } + public void testParenthized() throws Exception { doTest(new MockIntroduceVariableHandler("temp", true, false, false, "int")); }