mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-09-27 10:03:11 +07:00
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:
+6
-4
@@ -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);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user