SimplifyOptionalCallChainsInspection: specify lambda parameter types when converting method reference to lambda

Fixes IDEA-201902 Simplify optional chain (use Optional.stream())
This commit is contained in:
Tagir Valeev
2018-11-09 15:33:48 +07:00
parent ce8074fefd
commit 1056b3a329
3 changed files with 13 additions and 7 deletions
@@ -4,7 +4,6 @@ package com.intellij.codeInspection;
import com.intellij.codeInspection.dataFlow.CommonDataflow;
import com.intellij.codeInspection.dataFlow.DfaFactType;
import com.intellij.codeInspection.util.LambdaGenerationUtil;
import com.intellij.codeInspection.util.OptionalUtil;
import com.intellij.openapi.project.Project;
import com.intellij.pom.java.LanguageLevel;
import com.intellij.psi.*;
@@ -151,7 +150,7 @@ public class SimplifyOptionalCallChainsInspection extends AbstractBaseJavaLocalI
if (qualifier == null) return;
String opt = qualifier.getText();
PsiParameter parameter = parameters[0];
String proposed = OptionalUtil.generateOptionalUnwrap(opt, parameter, trueArg, falseArg, call.getType(), useOrElseGet);
String proposed = generateOptionalUnwrap(opt, parameter, trueArg, falseArg, call.getType(), useOrElseGet);
String canonicalOrElse;
if (useOrElseGet && !ExpressionUtils.isSafelyRecomputableExpression(falseArg)) {
canonicalOrElse = ".orElseGet(() -> " + falseArg.getText() + ")";
@@ -167,7 +166,7 @@ public class SimplifyOptionalCallChainsInspection extends AbstractBaseJavaLocalI
} else if(opt.length() > 10) {
// should be a parseable expression
opt = "(($))";
String template = OptionalUtil.generateOptionalUnwrap(opt, parameter, trueArg, falseArg, call.getType(), useOrElseGet);
String template = generateOptionalUnwrap(opt, parameter, trueArg, falseArg, call.getType(), useOrElseGet);
displayCode =
PsiExpressionTrimRenderer.render(JavaPsiFacade.getElementFactory(parameter.getProject()).createExpressionFromText(template, call));
displayCode = displayCode.replaceFirst(Pattern.quote(opt), "..");
@@ -206,7 +205,10 @@ public class SimplifyOptionalCallChainsInspection extends AbstractBaseJavaLocalI
return (PsiLambdaExpression)expression;
}
if (expression instanceof PsiMethodReferenceExpression) {
return LambdaRefactoringUtil.createLambda((PsiMethodReferenceExpression)expression, true);
PsiMethodReferenceExpression methodRef = (PsiMethodReferenceExpression)expression;
PsiLambdaExpression lambda = LambdaRefactoringUtil.createLambda(methodRef, true);
LambdaRefactoringUtil.specifyLambdaParameterTypes(methodRef.getFunctionalInterfaceType(), lambda);
return lambda;
}
return null;
}
@@ -8,12 +8,14 @@ public final class MyClass {
Optional<String> name();
}
public static void testStream(Person p) {
p.name().stream().flatMap(Stream::of).forEach(System.out::println);
public static void testStream(Person p, Optional<Integer> opt) {
p.name().stream().forEach(System.out::println);
p.name().stream().map(String::trim).forEach(System.out::println);
p.name().stream().flatMap(n -> Stream.of(n.split(""))).forEach(System.out::println);
p.name().stream().mapToInt(String::length).forEach(System.out::println);
p.name().stream().flatMapToInt(String::chars).forEach(System.out::println);
p.name().filter(n -> !n.isEmpty()).stream().forEach(System.out::println);
Stream<Integer> stream = opt.stream();
}
}
@@ -8,12 +8,14 @@ public final class MyClass {
Optional<String> name();
}
public static void testStream(Person p) {
public static void testStream(Person p, Optional<Integer> opt) {
p.name().map(Stream::of).or<caret>Else(Stream.empty()).forEach(System.out::println);
p.name().map(n -> Stream.of(n.trim())).orElseGet(() -> Stream.empty()).forEach(System.out::println);
p.name().map(n -> Stream.of(n.split(""))).orElse(Stream.empty()).forEach(System.out::println);
p.name().map(n -> IntStream.of(n.length())).orElseGet(IntStream::empty).forEach(System.out::println);
p.name().map(String::chars).orElseGet(IntStream::empty).forEach(System.out::println);
p.name().map(n -> n.isEmpty() ? Stream.empty() : Stream.of(n)).orElseGet(Stream::empty).forEach(System.out::println);
Stream<Integer> stream = opt.map(Stream::of).orElseGet(Stream::empty);
}
}