From 0426dbb41166a28e5eac1136116ef55feb8a9544 Mon Sep 17 00:00:00 2001 From: Tagir Valeev Date: Thu, 10 Aug 2017 13:14:43 +0700 Subject: [PATCH] IDEA-177306 False Positive: reporting "useless" Optional map --- .../intellij/codeInspection/util/OptionalUtil.java | 11 ++++++++--- .../inspection/optionalChains/beforeExplicitType.java | 8 ++++++++ .../optionalChains/beforeExplicitType2.java | 8 ++++++++ 3 files changed, 24 insertions(+), 3 deletions(-) create mode 100644 java/java-tests/testData/inspection/optionalChains/beforeExplicitType.java create mode 100644 java/java-tests/testData/inspection/optionalChains/beforeExplicitType2.java diff --git a/java/java-impl/src/com/intellij/codeInspection/util/OptionalUtil.java b/java/java-impl/src/com/intellij/codeInspection/util/OptionalUtil.java index a3ea8061436f..495111574d0a 100644 --- a/java/java-impl/src/com/intellij/codeInspection/util/OptionalUtil.java +++ b/java/java-impl/src/com/intellij/codeInspection/util/OptionalUtil.java @@ -30,6 +30,7 @@ import com.siyeh.ig.psiutils.MethodCallUtils; import com.siyeh.ig.psiutils.StreamApiUtil; import org.jetbrains.annotations.Contract; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; /** * @author Tagir Valeev @@ -108,10 +109,14 @@ public class OptionalUtil { * @return an expression text which will unwrap an {@code Optional}. */ public static String generateOptionalUnwrap(String qualifier, PsiVariable var, - PsiExpression trueExpression, PsiExpression falseExpression, - PsiType targetType, boolean useOrElseGet) { + PsiExpression trueExpression, PsiExpression falseExpression, + @Nullable PsiType targetType, boolean useOrElseGet) { PsiExpression stripped = PsiUtil.skipParenthesizedExprDown(trueExpression); - if (!ExpressionUtils.isReferenceTo(trueExpression, var)) { + boolean trivialMap = ExpressionUtils.isReferenceTo(trueExpression, var) && + targetType != null && + trueExpression.getType() != null && + trueExpression.getType().isAssignableFrom(targetType); + if (!trivialMap) { if (stripped instanceof PsiTypeCastExpression && ExpressionUtils.isNullLiteral(falseExpression)) { PsiTypeCastExpression castExpression = (PsiTypeCastExpression)stripped; PsiTypeElement castType = castExpression.getCastType(); diff --git a/java/java-tests/testData/inspection/optionalChains/beforeExplicitType.java b/java/java-tests/testData/inspection/optionalChains/beforeExplicitType.java new file mode 100644 index 000000000000..86ba9669dfac --- /dev/null +++ b/java/java-tests/testData/inspection/optionalChains/beforeExplicitType.java @@ -0,0 +1,8 @@ +// "Fix all 'Simplify Optional call chains' problems in file" "false" +import java.util.Optional; + +public class Tests { + static void test(Optional opt, T defaultT) { + T t = opt.map(x -> x).orElse(defaultT); + } +} diff --git a/java/java-tests/testData/inspection/optionalChains/beforeExplicitType2.java b/java/java-tests/testData/inspection/optionalChains/beforeExplicitType2.java new file mode 100644 index 000000000000..8ed069bf01a9 --- /dev/null +++ b/java/java-tests/testData/inspection/optionalChains/beforeExplicitType2.java @@ -0,0 +1,8 @@ +// "Fix all 'Simplify Optional call chains' problems in file" "false" +import java.util.Optional; + +public class Tests { + static void test(Optional opt, Integer defaultT) { + Number t = opt.map(x -> x).orElse(defaultT); + } +}