diff --git a/java/java-analysis-impl/src/com/intellij/codeInspection/dataFlow/HardcodedContracts.java b/java/java-analysis-impl/src/com/intellij/codeInspection/dataFlow/HardcodedContracts.java index 2619d4c4afb2..5d18c48f5338 100644 --- a/java/java-analysis-impl/src/com/intellij/codeInspection/dataFlow/HardcodedContracts.java +++ b/java/java-analysis-impl/src/com/intellij/codeInspection/dataFlow/HardcodedContracts.java @@ -154,7 +154,17 @@ public class HardcodedContracts { StandardMethodContract.fromText("null,!null->false"), StandardMethodContract.fromText("!null,null->false") )) - .register(enumValues(), ContractProvider.of(StandardMethodContract.fromText("->new"))); + .register(enumValues(), ContractProvider.of(StandardMethodContract.fromText("->new"))) + // Convert the following to external annotation once we support Java 9+ external annotations (IDEA-198249) + .register(staticCall(JAVA_UTIL_OBJECTS, "requireNonNullElse").parameterCount(2), + ContractProvider.of( + StandardMethodContract.fromText("!null,_->param1"), + StandardMethodContract.fromText("null,!null->param2"), + StandardMethodContract.fromText("null,null->fail"))) + .register(staticCall(JAVA_UTIL_OBJECTS, "requireNonNullElseGet").parameterCount(2), + ContractProvider.of( + StandardMethodContract.fromText("!null,_->param1"), + StandardMethodContract.fromText("null,_->!null"))); public static List getHardcodedContracts(@NotNull PsiMethod method, @Nullable PsiMethodCallExpression call) { PsiClass owner = method.getContainingClass(); diff --git a/java/java-tests/testData/inspection/dataFlow/fixture/ObjectsRequireNonNullElse.java b/java/java-tests/testData/inspection/dataFlow/fixture/ObjectsRequireNonNullElse.java new file mode 100644 index 000000000000..a6319924d612 --- /dev/null +++ b/java/java-tests/testData/inspection/dataFlow/fixture/ObjectsRequireNonNullElse.java @@ -0,0 +1,23 @@ +import java.util.*; +import org.jetbrains.annotations.*; + +public class ObjectsRequireNonNullElse { + public int requireNonNullElse(@Nullable String str) { + str = Objects.requireNonNullElse(str, ""); + if (str == null) {} + return str.length(); + } + + void test2(String s) { + String s1 = Objects.requireNonNullElse(s, ""); + if (!s1.equals(s)) { + if (!s1.isEmpty()) {} + } + } + + void test3(@Nullable String s) { + String s2 = Objects.requireNonNullElseGet(s, () -> ""); + if (s2 == null) {} + } + +} diff --git a/java/java-tests/testSrc/com/intellij/java/codeInspection/DataFlowInspection9Test.java b/java/java-tests/testSrc/com/intellij/java/codeInspection/DataFlowInspection9Test.java index 1efb8294c863..509ffb5965af 100644 --- a/java/java-tests/testSrc/com/intellij/java/codeInspection/DataFlowInspection9Test.java +++ b/java/java-tests/testSrc/com/intellij/java/codeInspection/DataFlowInspection9Test.java @@ -20,4 +20,5 @@ public class DataFlowInspection9Test extends DataFlowInspectionTestCase { public void testNullabilityJdk9() { doTest();} public void testMutabilityJdk9() { doTest();} public void testMutabilityInferred() { doTest(); } + public void testObjectsRequireNonNullElse() { doTest(); } } \ No newline at end of file