From f26681a21253d52d92fd0cdd593af723e2899d62 Mon Sep 17 00:00:00 2001 From: Tagir Valeev Date: Wed, 1 Jul 2026 10:15:59 +0200 Subject: [PATCH] IDEA-391061 [java-inspections] Wrong "Null check can be eliminated" in ternary expression with Optional.orElse (cherry picked from commit 981d5220655ad40e0ee687528bc8e658230ad64d) IJ-CR-211319 GitOrigin-RevId: 8cd81496b1e49802e669c541af701825caed3c0a --- .../SimplifyOptionalCallChainsInspection.java | 4 ++-- .../optionalChains/beforeNullQualifier.java | 22 +++++++++++++++++++ ...plifyOptionalCallChainsInspectionTest.java | 3 +++ 3 files changed, 27 insertions(+), 2 deletions(-) create mode 100644 java/java-tests/testData/inspection/optionalChains/beforeNullQualifier.java diff --git a/java/java-impl-inspections/src/com/intellij/codeInspection/SimplifyOptionalCallChainsInspection.java b/java/java-impl-inspections/src/com/intellij/codeInspection/SimplifyOptionalCallChainsInspection.java index 86a1b79fbb87..bb67a262a42a 100644 --- a/java/java-impl-inspections/src/com/intellij/codeInspection/SimplifyOptionalCallChainsInspection.java +++ b/java/java-impl-inspections/src/com/intellij/codeInspection/SimplifyOptionalCallChainsInspection.java @@ -45,6 +45,7 @@ import com.intellij.psi.util.PsiExpressionTrimRenderer; import com.intellij.psi.util.PsiTreeUtil; import com.intellij.psi.util.PsiUtil; import com.intellij.refactoring.util.LambdaRefactoringUtil; +import com.intellij.util.ObjectUtils; import com.intellij.util.containers.ContainerUtil; import com.siyeh.InspectionGadgetsBundle; import com.siyeh.ig.callMatcher.CallHandler; @@ -554,8 +555,7 @@ public final class SimplifyOptionalCallChainsInspection extends AbstractBaseJava public @Nullable Context extractContext(@NotNull Project project, @NotNull PsiMethodCallExpression call) { PsiExpression falseArg = getOrElseArgument(call, myType); if (!ExpressionUtils.isNullLiteral(falseArg)) return null; - PsiLocalVariable returnVar = PsiTreeUtil.getParentOfType(call, PsiLocalVariable.class, true); - if (returnVar == null) return null; + if (!(PsiUtil.skipParenthesizedExprUp(call.getParent()) instanceof PsiLocalVariable returnVar)) return null; PsiStatement nextStatement = tryCast(PsiTreeUtil.skipWhitespacesForward(returnVar.getParent()), PsiStatement.class); if (nextStatement == null) return null; diff --git a/java/java-tests/testData/inspection/optionalChains/beforeNullQualifier.java b/java/java-tests/testData/inspection/optionalChains/beforeNullQualifier.java new file mode 100644 index 000000000000..44fe7060c90a --- /dev/null +++ b/java/java-tests/testData/inspection/optionalChains/beforeNullQualifier.java @@ -0,0 +1,22 @@ +// "Replace null check with orElse("")" "false" +import java.util.Optional; + +class Test { + public static final class Example { + private final Optional optional; + + public Example(Optional optional) { this.optional = optional; } + + public static Example get() { + return null; + } + + public Optional optional() { return optional; } + } + + public static String test() { + Example example = Example.get(); + String value = example == null ? null : example.optional().orElse(null); + return value == null ? "" : value; + } +} \ No newline at end of file diff --git a/java/java-tests/testSrc/com/intellij/java/codeInspection/SimplifyOptionalCallChainsInspectionTest.java b/java/java-tests/testSrc/com/intellij/java/codeInspection/SimplifyOptionalCallChainsInspectionTest.java index 23ee0e0bb89e..e4197020ecac 100644 --- a/java/java-tests/testSrc/com/intellij/java/codeInspection/SimplifyOptionalCallChainsInspectionTest.java +++ b/java/java-tests/testSrc/com/intellij/java/codeInspection/SimplifyOptionalCallChainsInspectionTest.java @@ -20,9 +20,12 @@ import com.intellij.codeInspection.LocalInspectionTool; import com.intellij.codeInspection.SimplifyOptionalCallChainsInspection; import com.intellij.openapi.projectRoots.Sdk; import com.intellij.testFramework.IdeaTestUtil; +import com.intellij.testFramework.LightProjectDescriptor; import com.intellij.testFramework.PsiTestUtil; import org.jetbrains.annotations.NotNull; +import static com.intellij.testFramework.fixtures.LightJavaCodeInsightFixtureTestCase.JAVA_21; + public class SimplifyOptionalCallChainsInspectionTest extends LightQuickFixParameterizedTestCase { @Override protected Sdk getProjectJDK() {