diff --git a/java/java-analysis-impl/src/com/intellij/codeInspection/StreamApiMigrationInspection.java b/java/java-analysis-impl/src/com/intellij/codeInspection/StreamApiMigrationInspection.java index 547e092e4729..b87145469a46 100644 --- a/java/java-analysis-impl/src/com/intellij/codeInspection/StreamApiMigrationInspection.java +++ b/java/java-analysis-impl/src/com/intellij/codeInspection/StreamApiMigrationInspection.java @@ -1014,9 +1014,10 @@ public class StreamApiMigrationInspection extends BaseJavaBatchLocalInspectionTo // extract filter if(getSingleStatement() instanceof PsiIfStatement) { PsiIfStatement ifStatement = (PsiIfStatement)getSingleStatement(); - if(ifStatement.getElseBranch() != null || ifStatement.getCondition() == null) return null; - replaceWith(ifStatement.getThenBranch()); - return new FilterOp(ifStatement.getCondition(), myVariable, false); + if(ifStatement.getElseBranch() == null && ifStatement.getCondition() != null) { + replaceWith(ifStatement.getThenBranch()); + return new FilterOp(ifStatement.getCondition(), myVariable, false); + } } // extract flatMap if(getSingleStatement() instanceof PsiForeachStatement) { @@ -1047,7 +1048,7 @@ public class StreamApiMigrationInspection extends BaseJavaBatchLocalInspectionTo } } } - if(myStatements.length > 1) { + if(myStatements.length >= 1) { PsiStatement first = myStatements[0]; // extract map if(first instanceof PsiDeclarationStatement) { @@ -1077,15 +1078,19 @@ public class StreamApiMigrationInspection extends BaseJavaBatchLocalInspectionTo // extract filter with negation if(first instanceof PsiIfStatement) { PsiIfStatement ifStatement = (PsiIfStatement)first; - if(ifStatement.getElseBranch() != null || ifStatement.getCondition() == null) return null; + if(ifStatement.getCondition() == null) return null; PsiStatement branch = ifStatement.getThenBranch(); if(branch instanceof PsiBlockStatement) { PsiStatement[] statements = ((PsiBlockStatement)branch).getCodeBlock().getStatements(); if(statements.length == 1) branch = statements[0]; } - if(!(branch instanceof PsiContinueStatement)) return null; - myStatements = Arrays.copyOfRange(myStatements, 1, myStatements.length); + if(!(branch instanceof PsiContinueStatement) || ((PsiContinueStatement)branch).getLabelIdentifier() != null) return null; + if(ifStatement.getElseBranch() != null) { + myStatements[0] = ifStatement.getElseBranch(); + } else { + myStatements = Arrays.copyOfRange(myStatements, 1, myStatements.length); + } flatten(); return new FilterOp(ifStatement.getCondition(), myVariable, true); } diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/streamApiMigration/afterContinueNested.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/streamApiMigration/afterContinueNested.java new file mode 100644 index 000000000000..c54f06a9c72c --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/streamApiMigration/afterContinueNested.java @@ -0,0 +1,12 @@ +// "Replace with collect" "true" + +import java.util.*; +import java.util.stream.Collectors; + +public class Main { + + public List test(Map> map) { + List result = map.entrySet().stream().filter(entry -> !entry.getKey().isEmpty()).map(Map.Entry::getValue).filter(Objects::nonNull).flatMap(Collection::stream).map(String::trim).filter(trimmed -> !trimmed.isEmpty()).collect(Collectors.toList()); + return result; + } +} \ No newline at end of file diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/streamApiMigration/afterContinueNestedElse.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/streamApiMigration/afterContinueNestedElse.java new file mode 100644 index 000000000000..c54f06a9c72c --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/streamApiMigration/afterContinueNestedElse.java @@ -0,0 +1,12 @@ +// "Replace with collect" "true" + +import java.util.*; +import java.util.stream.Collectors; + +public class Main { + + public List test(Map> map) { + List result = map.entrySet().stream().filter(entry -> !entry.getKey().isEmpty()).map(Map.Entry::getValue).filter(Objects::nonNull).flatMap(Collection::stream).map(String::trim).filter(trimmed -> !trimmed.isEmpty()).collect(Collectors.toList()); + return result; + } +} \ No newline at end of file diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/streamApiMigration/beforeContinueNested.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/streamApiMigration/beforeContinueNested.java new file mode 100644 index 000000000000..00d414ebda5f --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/streamApiMigration/beforeContinueNested.java @@ -0,0 +1,23 @@ +// "Replace with collect" "true" + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +public class Main { + + public List test(Map> map) { + List result = new ArrayList<>(); + for(Map.Entry> entry : map.entrySet()) { + if(entry.getKey().isEmpty()) continue; + List list = entry.getValue(); + if(list == null) continue; + for(String str : list) { + String trimmed = str.trim(); + if(trimmed.isEmpty()) continue; + result.add(trimmed); + } + } + return result; + } +} \ No newline at end of file diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/streamApiMigration/beforeContinueNestedElse.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/streamApiMigration/beforeContinueNestedElse.java new file mode 100644 index 000000000000..883044a7bd3e --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/streamApiMigration/beforeContinueNestedElse.java @@ -0,0 +1,25 @@ +// "Replace with collect" "true" + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +public class Main { + + public List test(Map> map) { + List result = new ArrayList<>(); + for(Map.Entry> entry : map.entrySet()) { + if(entry.getKey().isEmpty()) continue; + else { + List list = entry.getValue(); + if (list == null) continue; + for (String str : list) { + String trimmed = str.trim(); + if (trimmed.isEmpty()) continue; + else result.add(trimmed); + } + } + } + return result; + } +} \ No newline at end of file diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/streamApiMigration/beforeContinueNestedLabel.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/streamApiMigration/beforeContinueNestedLabel.java new file mode 100644 index 000000000000..bf6338270b87 --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/streamApiMigration/beforeContinueNestedLabel.java @@ -0,0 +1,24 @@ +// "Replace with forEach" "false" + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +public class Main { + + public List test(Map> map) { + List result = new ArrayList<>(); + outer: + for(Map.Entry> entry : map.entrySet()) { + if(entry.getKey().isEmpty()) continue; + List list = entry.getValue(); + if(list == null) continue; + for(String str : list) { + String trimmed = str.trim(); + if(trimmed.isEmpty()) continue outer; + result.add(trimmed); + } + } + return result; + } +} \ No newline at end of file