StreamApiUtil: fix addition of map operation when object-object cast is involved

This commit is contained in:
Tagir Valeev
2017-03-14 13:19:47 +07:00
parent b3ecc77af5
commit b2cd46bdeb
4 changed files with 35 additions and 3 deletions
@@ -19,6 +19,7 @@ import com.intellij.codeInspection.LambdaCanBeMethodReferenceInspection;
import com.intellij.codeInspection.util.OptionalUtil;
import com.intellij.openapi.extensions.ExtensionPointName;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.util.text.StringUtil;
import com.intellij.psi.*;
import com.intellij.psi.codeStyle.CodeStyleManager;
import com.intellij.psi.util.PsiTreeUtil;
@@ -104,7 +105,8 @@ public interface ChainCallExtractor {
PsiMethodCallExpression call = tryCast(args.getParent(), PsiMethodCallExpression.class);
if (call == null) return null;
for(ChainCallExtractor extractor : KEY.getExtensions()) {
if(extractor.canExtractChainCall(call, expression, targetType)) {
if(extractor.canExtractChainCall(call, expression, targetType) &&
StringUtil.isNotEmpty(extractor.getMethodName(parameter, expression, targetType))) {
return extractor;
}
}
@@ -0,0 +1,12 @@
// "Replace with collect" "true"
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;
public class Main {
List<String> getStrings(List<?> list) {
List<String> result = list.stream().filter(o -> o instanceof String).map(o -> (String) o).collect(Collectors.toList());
return result;
}
}
@@ -0,0 +1,18 @@
// "Replace with collect" "true"
import java.util.ArrayList;
import java.util.List;
public class Main {
List<String> getStrings(List<?> list) {
List<String> result = new ArrayList<>();
for (Object o : li<caret>st) {
if (o instanceof String) {
String s = (String) o;
result.add(s);
}
}
return result;
}
}
@@ -114,11 +114,11 @@ public class StreamApiUtil {
public static String getShortcutMappingMethod(PsiVariable variable, @Nullable PsiType outType, PsiElement mapper) {
if (!(mapper instanceof PsiExpression)) return null;
PsiExpression expression = PsiUtil.skipParenthesizedExprDown(((PsiExpression)mapper));
if (expression instanceof PsiTypeCastExpression && Objects.equals(expression.getType(), outType)) {
PsiType inType = variable.getType();
if (expression instanceof PsiTypeCastExpression && inType instanceof PsiPrimitiveType && Objects.equals(expression.getType(), outType)) {
expression = ((PsiTypeCastExpression)expression).getOperand();
}
if (ExpressionUtils.isReferenceTo(expression, variable)) {
PsiType inType = variable.getType();
if (!(outType instanceof PsiPrimitiveType)) {
return inType instanceof PsiPrimitiveType ? "boxed" : "";
}