StreamApiMigration: minor fixes in FindFirst scenarios

This commit is contained in:
Tagir Valeev
2017-01-18 13:52:12 +07:00
parent 4c07a74eb5
commit cbd273dda8
3 changed files with 52 additions and 20 deletions
@@ -1,5 +1,5 @@
/*
* Copyright 2000-2016 JetBrains s.r.o.
* Copyright 2000-2017 JetBrains s.r.o.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -24,6 +24,8 @@ import com.intellij.psi.util.PsiTypesUtil;
import com.siyeh.ig.psiutils.ExpressionUtils;
import org.jetbrains.annotations.NotNull;
import static com.intellij.util.ObjectUtils.tryCast;
/**
* @author Tagir Valeev
*/
@@ -63,31 +65,29 @@ class FindFirstMigration extends BaseStreamApiMigration {
return loopStatement.replace(elementFactory.createStatementFromText(
tb.generate() + ".findFirst().ifPresent(" + LambdaUtil.createLambda(tb.getVariable(), expression) + ");", loopStatement));
}
PsiExpression lValue = assignment.getLExpression();
if (!(lValue instanceof PsiReferenceExpression)) return null;
PsiElement element = ((PsiReferenceExpression)lValue).resolve();
if (!(element instanceof PsiVariable)) return null;
PsiVariable var = (PsiVariable)element;
PsiReferenceExpression lValue = tryCast(assignment.getLExpression(), PsiReferenceExpression.class);
if (lValue == null) return null;
PsiVariable var = tryCast(lValue.resolve(), PsiVariable.class);
if (var == null) return null;
PsiExpression value = assignment.getRExpression();
if (value == null) return null;
restoreComments(loopStatement, body);
InitializerUsageStatus status = StreamApiMigrationInspection.getInitializerUsageStatus(var, loopStatement);
if (status != InitializerUsageStatus.UNKNOWN) {
PsiExpression initializer = var.getInitializer();
if (initializer != null) {
String replacementText = generateOptionalUnwrap(tb, value, initializer, var.getType());
return replaceInitializer(loopStatement, var, initializer, replacementText, status);
PsiExpression initializer = var.getInitializer();
PsiExpression falseExpression = lValue;
if (status != InitializerUsageStatus.UNKNOWN &&
(status != InitializerUsageStatus.AT_WANTED_PLACE || ExpressionUtils.isSimpleExpression(initializer))) {
falseExpression = initializer;
} else {
PsiElement maybeAssignment = PsiTreeUtil.skipSiblingsBackward(loopStatement, PsiWhiteSpace.class, PsiComment.class);
PsiExpression prevRValue = ExpressionUtils.getAssignmentTo(maybeAssignment, var);
if (prevRValue != null) {
maybeAssignment.delete();
falseExpression = prevRValue;
}
}
PsiElement maybeAssignment = PsiTreeUtil.skipSiblingsBackward(loopStatement, PsiWhiteSpace.class, PsiComment.class);
PsiExpression prevRValue = ExpressionUtils.getAssignmentTo(maybeAssignment, var);
if(prevRValue != null) {
maybeAssignment.delete();
return loopStatement.replace(elementFactory.createStatementFromText(
var.getName() + " = " + generateOptionalUnwrap(tb, value, prevRValue, var.getType()) + ";", loopStatement));
}
return loopStatement.replace(elementFactory.createStatementFromText(
var.getName() + " = " + generateOptionalUnwrap(tb, value, lValue, var.getType()) + ";", loopStatement));
String replacementText = generateOptionalUnwrap(tb, value, falseExpression, var.getType());
return replaceInitializer(loopStatement, var, initializer, replacementText, status);
}
}
@@ -0,0 +1,14 @@
// "Replace with findFirst()" "true"
import java.util.stream.IntStream;
public class Test {
public static void main(String[] args) {
String s = " hello ";
String res = s.trim();
if(args.length == 0) {
res = IntStream.range(0, s.length()).boxed().filter(x -> s.charAt(x) == 'l').findFirst().map(String::valueOf).orElse(res);
}
System.out.println(res);
}
}
@@ -0,0 +1,18 @@
// "Replace with findFirst()" "true"
public class Test {
public static void main(String[] args) {
String s = " hello ";
String res = s.trim();
if(args.length == 0) {
for (<caret>int i = 0; i < s.length(); i++) {
Integer x = i;
if (s.charAt(x) == 'l') {
res = String.valueOf(x);
break;
}
}
}
System.out.println(res);
}
}