From 0184274f8c8970892c8dfb281a29ce32ca058440 Mon Sep 17 00:00:00 2001 From: Tagir Valeev Date: Wed, 11 Jul 2018 09:56:21 +0700 Subject: [PATCH] ExtractChainedMapAction: disable on non-first variable; enable for parenthesized lambda --- .../intention/impl/ExtractChainedMapAction.java | 3 ++- .../refactoring/chainCall/ChainCallExtractor.java | 3 ++- .../extractStreamMap/afterAsLongStream.java | 2 +- .../extractStreamMap/beforeAnyMatchNotFirst.java | 14 ++++++++++++++ .../extractStreamMap/beforeAsLongStream.java | 4 ++-- 5 files changed, 21 insertions(+), 5 deletions(-) create mode 100644 java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/extractStreamMap/beforeAnyMatchNotFirst.java diff --git a/java/java-impl/src/com/intellij/codeInsight/intention/impl/ExtractChainedMapAction.java b/java/java-impl/src/com/intellij/codeInsight/intention/impl/ExtractChainedMapAction.java index 2e9eddfa1121..676144ef789c 100644 --- a/java/java-impl/src/com/intellij/codeInsight/intention/impl/ExtractChainedMapAction.java +++ b/java/java-impl/src/com/intellij/codeInsight/intention/impl/ExtractChainedMapAction.java @@ -23,6 +23,7 @@ import com.intellij.psi.*; import com.intellij.psi.search.searches.ReferencesSearch; import com.intellij.psi.util.PsiTreeUtil; import com.intellij.refactoring.chainCall.ChainCallExtractor; +import com.intellij.util.ArrayUtil; import com.intellij.util.IncorrectOperationException; import com.intellij.util.Processor; import org.jetbrains.annotations.Nls; @@ -41,7 +42,7 @@ public class ExtractChainedMapAction extends PsiElementBaseIntentionAction { PsiDeclarationStatement declaration = tryCast(variable.getParent(), PsiDeclarationStatement.class); if (declaration == null || declaration.getDeclaredElements().length != 1) return false; PsiCodeBlock block = tryCast(declaration.getParent(), PsiCodeBlock.class); - if (block == null) return false; + if (block == null || ArrayUtil.getFirstElement(block.getStatements()) != declaration) return false; PsiLambdaExpression lambda = tryCast(block.getParent(), PsiLambdaExpression.class); ChainCallExtractor extractor = ChainCallExtractor.findExtractor(lambda, initializer, variable.getType()); if (extractor == null) return false; diff --git a/java/java-impl/src/com/intellij/refactoring/chainCall/ChainCallExtractor.java b/java/java-impl/src/com/intellij/refactoring/chainCall/ChainCallExtractor.java index 500118de76e5..2cc8ea229761 100644 --- a/java/java-impl/src/com/intellij/refactoring/chainCall/ChainCallExtractor.java +++ b/java/java-impl/src/com/intellij/refactoring/chainCall/ChainCallExtractor.java @@ -23,6 +23,7 @@ import com.intellij.openapi.util.text.StringUtil; import com.intellij.psi.*; import com.intellij.psi.codeStyle.CodeStyleManager; import com.intellij.psi.util.PsiTreeUtil; +import com.intellij.psi.util.PsiUtil; import com.intellij.refactoring.util.LambdaRefactoringUtil; import com.intellij.refactoring.util.RefactoringUtil; import com.intellij.util.ArrayUtil; @@ -92,7 +93,7 @@ public interface ChainCallExtractor { if (lambda == null) return null; PsiParameterList parameters = lambda.getParameterList(); if (parameters.getParametersCount() != 1) return null; - PsiExpressionList args = tryCast(lambda.getParent(), PsiExpressionList.class); + PsiExpressionList args = tryCast(PsiUtil.skipParenthesizedExprUp(lambda.getParent()), PsiExpressionList.class); if (args == null || args.getExpressionCount() != 1) return null; PsiParameter parameter = parameters.getParameters()[0]; if (ExpressionUtils.isReferenceTo(expression, parameter) && parameter.getType().equals(targetType)) { diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/extractStreamMap/afterAsLongStream.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/extractStreamMap/afterAsLongStream.java index 4baaf6be8024..3034781a4674 100644 --- a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/extractStreamMap/afterAsLongStream.java +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/extractStreamMap/afterAsLongStream.java @@ -4,6 +4,6 @@ import java.util.stream.*; public class Test { long[] testAsLongStream(int[] x) { - return Arrays.stream(x).map(i -> i * 2).mapToLong(l -> l).toArray(); + return Arrays.stream(x).map(i -> i * 2).mapToLong((l -> l)).toArray(); } } \ No newline at end of file diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/extractStreamMap/beforeAnyMatchNotFirst.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/extractStreamMap/beforeAnyMatchNotFirst.java new file mode 100644 index 000000000000..62b75b55d9d3 --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/extractStreamMap/beforeAnyMatchNotFirst.java @@ -0,0 +1,14 @@ +// "Extract variable 'lowerCase' to 'map' operation" "false" +import java.util.*; +import java.util.stream.*; + +public class Test { + boolean test(List list) { + return list.stream() + .anyMatch(s -> { + System.out.println(s); + String lowerCase = s.toLowerCase(); + return "test".equals(lowerCase); + }); + } +} \ No newline at end of file diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/extractStreamMap/beforeAsLongStream.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/extractStreamMap/beforeAsLongStream.java index a03a88316555..eb5250dfbcf1 100644 --- a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/extractStreamMap/beforeAsLongStream.java +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/extractStreamMap/beforeAsLongStream.java @@ -4,9 +4,9 @@ import java.util.stream.*; public class Test { long[] testAsLongStream(int[] x) { - return Arrays.stream(x).mapToLong(i -> { + return Arrays.stream(x).mapToLong((i -> { int l = i * 2; return l; - }).toArray(); + })).toArray(); } } \ No newline at end of file