replace with collect: insert cast for method reference and simplify when redundant (IDEA-139704)

This commit is contained in:
Anna Kozlova
2015-04-28 13:04:58 +02:00
parent 02e86e0ab9
commit 95dfffccb0
3 changed files with 59 additions and 3 deletions
@@ -22,7 +22,6 @@ import com.intellij.codeInsight.daemon.impl.analysis.HighlightControlFlowUtil;
import com.intellij.openapi.diagnostic.Logger;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.util.Condition;
import com.intellij.openapi.util.Ref;
import com.intellij.openapi.util.text.StringUtil;
import com.intellij.pom.java.LanguageLevel;
import com.intellij.psi.*;
@@ -35,12 +34,16 @@ import com.intellij.psi.search.searches.ReferencesSearch;
import com.intellij.psi.util.InheritanceUtil;
import com.intellij.psi.util.PsiTreeUtil;
import com.intellij.psi.util.PsiUtil;
import com.intellij.psi.util.RedundantCastUtil;
import com.intellij.util.containers.ContainerUtil;
import com.intellij.util.containers.IntArrayList;
import org.jetbrains.annotations.Nls;
import org.jetbrains.annotations.NotNull;
import java.util.*;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.List;
/**
* User: anna
@@ -297,6 +300,8 @@ public class StreamApiMigrationInspection extends BaseJavaBatchLocalInspectionTo
(PsiExpressionStatement)callStatement.replace(elementFactory.createStatementFromText(buffer.toString() + "(" + parameter.getText() + ") -> " + wrapInBlock(body) + ");", callStatement));
}
simplifyRedundantCast(callStatement);
CodeStyleManager.getInstance(project).reformat(callStatement);
}
}
@@ -383,6 +388,7 @@ public class StreamApiMigrationInspection extends BaseJavaBatchLocalInspectionTo
restoreComments(foreachStatement, body);
final String callText = builder.toString() + createInitializerReplacementText(initializer) + ")";
result = initializer.replace(elementFactory.createExpressionFromText(callText, null));
simplifyRedundantCast(result);
foreachStatement.delete();
return;
}
@@ -394,6 +400,7 @@ public class StreamApiMigrationInspection extends BaseJavaBatchLocalInspectionTo
final String qualifierText = qualifierExpression != null ? qualifierExpression.getText() : "";
final String callText = StringUtil.getQualifiedName(qualifierText, "addAll(" + builder.toString() + "toList()));");
result = foreachStatement.replace(elementFactory.createStatementFromText(callText, foreachStatement));
simplifyRedundantCast(result);
}
finally {
if (result != null) {
@@ -427,7 +434,8 @@ public class StreamApiMigrationInspection extends BaseJavaBatchLocalInspectionTo
.canBeMethodReferenceProblem(expression, new PsiParameter[]{parameter}, functionalInterfaceType);
final String methodReferenceText = LambdaCanBeMethodReferenceInspection.createMethodReferenceText(toConvertCall, functionalInterfaceType, new PsiParameter[]{parameter});
if (methodReferenceText != null) {
iteration += methodReferenceText;
LOG.assertTrue(functionalInterfaceType != null);
iteration += "(" + functionalInterfaceType.getCanonicalText() + ")" + methodReferenceText;
} else {
iteration += parameter.getName() + " -> " + expression.getText();
}
@@ -441,6 +449,20 @@ public class StreamApiMigrationInspection extends BaseJavaBatchLocalInspectionTo
}
}
private static void simplifyRedundantCast(PsiElement result) {
final PsiMethodReferenceExpression methodReferenceExpression = PsiTreeUtil.findChildOfType(result, PsiMethodReferenceExpression.class);
if (methodReferenceExpression != null) {
final PsiElement parent = methodReferenceExpression.getParent();
if (parent instanceof PsiTypeCastExpression) {
if (RedundantCastUtil.isCastRedundant((PsiTypeCastExpression)parent)) {
final PsiExpression operand = ((PsiTypeCastExpression)parent).getOperand();
LOG.assertTrue(operand != null);
parent.replace(operand);
}
}
}
}
private static void restoreComments(PsiForeachStatement foreachStatement, PsiStatement body) {
final PsiElement parent = foreachStatement.getParent();
for (PsiElement comment : PsiTreeUtil.findChildrenOfType(body, PsiComment.class)) {
@@ -0,0 +1,16 @@
// "Replace with collect" "true"
import java.util.*;
import java.util.function.Function;
import java.util.stream.Collectors;
class Test {
public static <T> List<TokenFilter<T>> fromString(final T src, Function<T, List<String>> extractor) {
final List<TokenFilter<T>> result = extractor.apply(src).stream().map((Function<String, TokenFilter<T>>) TokenFilter::new).collect(Collectors.toList());
return result;
}
static class TokenFilter<T> {
public TokenFilter(String s) {
}
}
}
@@ -0,0 +1,18 @@
// "Replace with collect" "true"
import java.util.*;
import java.util.function.Function;
class Test {
public static <T> List<TokenFilter<T>> fromString(final T src, Function<T, List<String>> extractor) {
final List<TokenFilter<T>> result = new ArrayList<>();
for (final String st : extrac<caret>tor.apply(src)) {
result.add(new TokenFilter<T>(st));
}
return result;
}
static class TokenFilter<T> {
public TokenFilter(String s) {
}
}
}