StreamToLoop: disallow peek which cannot finish normally as the result will not be compilable

This commit is contained in:
Tagir Valeev
2018-09-07 17:02:26 +07:00
parent 12b1c5a4e0
commit 1e73838ca1
3 changed files with 16 additions and 5 deletions
@@ -14,10 +14,7 @@ import com.intellij.psi.util.PsiTreeUtil;
import com.intellij.psi.util.PsiUtil;
import com.intellij.refactoring.util.LambdaRefactoringUtil;
import com.intellij.util.ArrayUtil;
import com.siyeh.ig.psiutils.EquivalenceChecker;
import com.siyeh.ig.psiutils.ExpressionUtils;
import com.siyeh.ig.psiutils.FunctionalExpressionUtils;
import com.siyeh.ig.psiutils.MethodCallUtils;
import com.siyeh.ig.psiutils.*;
import one.util.streamex.EntryStream;
import one.util.streamex.StreamEx;
import org.jetbrains.annotations.Contract;
@@ -153,7 +150,7 @@ abstract class FunctionHelper {
if (lambdaExpression == null) {
if (PsiType.VOID.equals(returnType) && body instanceof PsiCodeBlock) {
List<PsiReturnStatement> returns = getReturns(body);
if (!allowReturns && !returns.isEmpty()) return null;
if (!allowReturns && (!returns.isEmpty() || !ControlFlowUtils.codeBlockMayCompleteNormally((PsiCodeBlock)body))) return null;
// Return inside loop is not supported yet
for (PsiReturnStatement ret : returns) {
if (PsiTreeUtil.getParentOfType(ret, PsiLoopStatement.class, true, PsiLambdaExpression.class) != null) {
@@ -3,6 +3,7 @@
import java.util.Arrays;
import java.util.List;
import java.util.LongSummaryStatistics;
import java.util.stream.IntStream;
public class Main {
public static int test(List<String> list) {
@@ -25,6 +26,12 @@ public class Main {
return stat;
}
void peekThrows() {
final int sum = IntStream.of(1, 2, 3, 4).peek(x -> {
throw new RuntimeException();
}).reduce(0, (l, r) -> l + r);
}
public static void main(String[] args) {
System.out.println(test(Arrays.asList("aaa", "b", "cc", "dddd")));
System.out.println(testSummaryStatistics(Arrays.asList("aaa", "b", "cc", "dddd")));
@@ -2,6 +2,7 @@
import java.util.Arrays;
import java.util.List;
import java.util.stream.IntStream;
public class Main {
public static int test(List<String> list) {
@@ -12,6 +13,12 @@ public class Main {
return list.stream().peek(s -> System.out.println(s)).mapToLong(l -> l.length()).summaryStatistics();
}
void peekThrows() {
final int sum = IntStream.of(1, 2, 3, 4).peek(x -> {
throw new RuntimeException();
}).reduce(0, (l, r) -> l + r);
}
public static void main(String[] args) {
System.out.println(test(Arrays.asList("aaa", "b", "cc", "dddd")));
System.out.println(testSummaryStatistics(Arrays.asList("aaa", "b", "cc", "dddd")));