From a03fffe024d921d08cb884f58c953e8dbd72ea3c Mon Sep 17 00:00:00 2001 From: Tagir Valeev Date: Mon, 27 Mar 2017 13:18:00 +0700 Subject: [PATCH] DFA Optional.orElse handling improved (splitting states) --- .../dataFlow/StandardInstructionVisitor.java | 10 ++++++---- .../inspection/dataFlow/fixture/OptionalOrElse.java | 7 +++++++ 2 files changed, 13 insertions(+), 4 deletions(-) diff --git a/java/java-analysis-impl/src/com/intellij/codeInspection/dataFlow/StandardInstructionVisitor.java b/java/java-analysis-impl/src/com/intellij/codeInspection/dataFlow/StandardInstructionVisitor.java index 06a15d328efa..ed0a7cfefab2 100644 --- a/java/java-analysis-impl/src/com/intellij/codeInspection/dataFlow/StandardInstructionVisitor.java +++ b/java/java-analysis-impl/src/com/intellij/codeInspection/dataFlow/StandardInstructionVisitor.java @@ -287,10 +287,12 @@ public class StandardInstructionVisitor extends InstructionVisitor { result = argValues[0]; break; case UNSURE: - Nullness nullness = - memState.isNotNull(argValues[0]) ? Nullness.NOT_NULL : memState.isNull(argValues[0]) ? Nullness.NULLABLE : Nullness.UNKNOWN; - result = runner.getFactory().createTypeValue(instruction.getResultType(), nullness); - break; + DfaMemoryState falseState = memState.createCopy(); + memState.push(runner.getFactory().createTypeValue(instruction.getResultType(), Nullness.NOT_NULL)); + memState.applyIsPresentCheck(true, qualifier); + falseState.push(argValues[0]); + falseState.applyIsPresentCheck(false, qualifier); + return Arrays.asList(memState, falseState); } } break; diff --git a/java/java-tests/testData/inspection/dataFlow/fixture/OptionalOrElse.java b/java/java-tests/testData/inspection/dataFlow/fixture/OptionalOrElse.java index 8fa53bc5e1dc..dfe45c5fde94 100644 --- a/java/java-tests/testData/inspection/dataFlow/fixture/OptionalOrElse.java +++ b/java/java-tests/testData/inspection/dataFlow/fixture/OptionalOrElse.java @@ -42,4 +42,11 @@ class OptionalOrElse { return ""; } } + + void isPresentCheck(Optional opt) { + String result = opt.orElse(null); + if(result == null && opt.isPresent()) { + System.out.println("Impossible"); + } + } } \ No newline at end of file