From 1056b3a3298d40b1d4d1abdc962362644a11d52d Mon Sep 17 00:00:00 2001 From: Tagir Valeev Date: Fri, 9 Nov 2018 15:31:53 +0700 Subject: [PATCH] SimplifyOptionalCallChainsInspection: specify lambda parameter types when converting method reference to lambda Fixes IDEA-201902 Simplify optional chain (use Optional.stream()) --- .../SimplifyOptionalCallChainsInspection.java | 10 ++++++---- .../inspection/optionalChains/afterStreamJava9.java | 6 ++++-- .../inspection/optionalChains/beforeStreamJava9.java | 4 +++- 3 files changed, 13 insertions(+), 7 deletions(-) diff --git a/java/java-impl/src/com/intellij/codeInspection/SimplifyOptionalCallChainsInspection.java b/java/java-impl/src/com/intellij/codeInspection/SimplifyOptionalCallChainsInspection.java index 3e3d7713e87d..1518bdb863e6 100644 --- a/java/java-impl/src/com/intellij/codeInspection/SimplifyOptionalCallChainsInspection.java +++ b/java/java-impl/src/com/intellij/codeInspection/SimplifyOptionalCallChainsInspection.java @@ -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; } diff --git a/java/java-tests/testData/inspection/optionalChains/afterStreamJava9.java b/java/java-tests/testData/inspection/optionalChains/afterStreamJava9.java index 262a2dc78e5b..fc61ac021f16 100644 --- a/java/java-tests/testData/inspection/optionalChains/afterStreamJava9.java +++ b/java/java-tests/testData/inspection/optionalChains/afterStreamJava9.java @@ -8,12 +8,14 @@ public final class MyClass { Optional name(); } - public static void testStream(Person p) { - p.name().stream().flatMap(Stream::of).forEach(System.out::println); + public static void testStream(Person p, Optional 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 stream = opt.stream(); } } \ No newline at end of file diff --git a/java/java-tests/testData/inspection/optionalChains/beforeStreamJava9.java b/java/java-tests/testData/inspection/optionalChains/beforeStreamJava9.java index 7f7327b7a918..c989c77ff3ca 100644 --- a/java/java-tests/testData/inspection/optionalChains/beforeStreamJava9.java +++ b/java/java-tests/testData/inspection/optionalChains/beforeStreamJava9.java @@ -8,12 +8,14 @@ public final class MyClass { Optional name(); } - public static void testStream(Person p) { + public static void testStream(Person p, Optional opt) { p.name().map(Stream::of).orElse(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 stream = opt.map(Stream::of).orElseGet(Stream::empty); } } \ No newline at end of file