StreamToLoop: support parentheses inside flatMap

This commit is contained in:
Tagir Valeev
2018-09-19 12:26:21 +07:00
parent 65049765b0
commit 85f0872d9b
2 changed files with 8 additions and 7 deletions

View File

@@ -18,6 +18,7 @@ package com.intellij.codeInspection.streamToLoop;
import com.intellij.codeInspection.streamToLoop.StreamToLoopInspection.StreamToLoopReplacementContext;
import com.intellij.psi.*;
import com.intellij.psi.util.PsiTypesUtil;
import com.intellij.psi.util.PsiUtil;
import com.siyeh.ig.psiutils.BoolUtils;
import com.siyeh.ig.psiutils.ExpressionUtils;
import com.siyeh.ig.psiutils.StreamApiUtil;
@@ -300,14 +301,14 @@ abstract class Operation {
if(fn == null) return null;
String varName = fn.tryLightTransform();
if(varName == null) return null;
PsiExpression body = fn.getExpression();
PsiExpression body = PsiUtil.skipParenthesizedExprDown(fn.getExpression());
PsiExpression condition = null;
boolean inverted = false;
if(body instanceof PsiConditionalExpression) {
PsiConditionalExpression ternary = (PsiConditionalExpression)body;
condition = ternary.getCondition();
PsiExpression thenExpression = ternary.getThenExpression();
PsiExpression elseExpression = ternary.getElseExpression();
PsiExpression thenExpression = PsiUtil.skipParenthesizedExprDown(ternary.getThenExpression());
PsiExpression elseExpression = PsiUtil.skipParenthesizedExprDown(ternary.getElseExpression());
if(StreamApiUtil.isNullOrEmptyStream(thenExpression)) {
body = elseExpression;
inverted = true;
@@ -319,8 +320,8 @@ abstract class Operation {
}
if(!(body instanceof PsiMethodCallExpression)) return null;
PsiMethodCallExpression terminalCall = (PsiMethodCallExpression)body;
List<StreamToLoopInspection.OperationRecord> records = StreamToLoopInspection.extractOperations(outVar, terminalCall,
supportUnknownSources);
List<StreamToLoopInspection.OperationRecord> records =
StreamToLoopInspection.extractOperations(outVar, terminalCall, supportUnknownSources);
if(records == null || StreamToLoopInspection.getTerminal(records) != null) return null;
return new FlatMapOperation(varName, fn, records, condition, inverted);
}

View File

@@ -16,12 +16,12 @@ public class Main {
public static void testComplexFilter(List<String> list) {
System.out.println(list.stream()
.filter(x -> x != null)
.flatMap(s -> IntStream.range(0, 10).boxed().filter(Predicate.isEqual(s.length())))
.flatMap(s -> (IntStream.range(0, 10).boxed().filter(Predicate.isEqual(s.length()))))
.collect(Collectors.toList()));
}
public void testConditional(List<List<String>> list) {
list.stream().flatMap(lst -> lst == null ? Stream.empty() : lst.stream()).forEach(System.out::println);
list.stream().flatMap(lst -> lst == null ? (Stream.empty()) : (lst.stream())).forEach(System.out::println);
}
private static long testDistinctUnpluralize(List<List<String>> nested) {