From 5b7611c45ecb19601d5912a98607e4996d6669ea Mon Sep 17 00:00:00 2001 From: Mikhail Pyltsin Date: Thu, 21 Nov 2024 10:25:34 +0100 Subject: [PATCH] [java-inspection] IDEA-310567 'Constant values' false positive for switch expression - skip 'constant values' for switch expressions if they contain always failed methods GitOrigin-RevId: 1207911bd11f94f37293254fa609e47b42aa96e1 --- .../dataFlow/ConstantValueInspection.java | 9 ++++++++- .../fixture/SkipSwitchExpressionWithThrow.java | 18 ++++++++++++++++++ 2 files changed, 26 insertions(+), 1 deletion(-) diff --git a/java/java-impl-inspections/src/com/intellij/codeInspection/dataFlow/ConstantValueInspection.java b/java/java-impl-inspections/src/com/intellij/codeInspection/dataFlow/ConstantValueInspection.java index 29bbcd23c5e3..08a0b46c4cfc 100644 --- a/java/java-impl-inspections/src/com/intellij/codeInspection/dataFlow/ConstantValueInspection.java +++ b/java/java-impl-inspections/src/com/intellij/codeInspection/dataFlow/ConstantValueInspection.java @@ -1,4 +1,4 @@ -// Copyright 2000-2023 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license. +// Copyright 2000-2024 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license. package com.intellij.codeInspection.dataFlow; import com.intellij.codeInsight.daemon.impl.quickfix.SimplifyBooleanExpressionFix; @@ -400,6 +400,13 @@ public final class ConstantValueInspection extends AbstractBaseJavaLocalInspecti ref.set(true); return false; } + if (element instanceof PsiMethodCallExpression methodCallExpression) { + List contracts = JavaMethodContractUtil.getMethodCallContracts(methodCallExpression); + if (ContainerUtil.exists(contracts, contract -> contract.isTrivial() && contract.getReturnValue().isFail())) { + ref.set(true); + return false; + } + } return true; }); return ref.get(); diff --git a/java/java-tests/testData/inspection/dataFlow/fixture/SkipSwitchExpressionWithThrow.java b/java/java-tests/testData/inspection/dataFlow/fixture/SkipSwitchExpressionWithThrow.java index 6297b6690a57..2c3378260a90 100644 --- a/java/java-tests/testData/inspection/dataFlow/fixture/SkipSwitchExpressionWithThrow.java +++ b/java/java-tests/testData/inspection/dataFlow/fixture/SkipSwitchExpressionWithThrow.java @@ -1,3 +1,5 @@ +import org.jetbrains.annotations.Nullable; + class SkipSwitchExpressionWithThrow { static boolean test(int x) { return switch (x) { @@ -7,4 +9,20 @@ class SkipSwitchExpressionWithThrow { default -> throw new IllegalStateException(); }; } + + public enum Foo { + A, B + } + + public static R exception() { + throw new RuntimeException(); + } + + @Nullable + public static Object test2(Foo foo) { + return switch (foo) { + case A -> null; + case B -> exception(); + }; + } } \ No newline at end of file