diff --git a/java/java-analysis-impl/src/com/intellij/codeInspection/dataFlow/ControlFlowAnalyzer.java b/java/java-analysis-impl/src/com/intellij/codeInspection/dataFlow/ControlFlowAnalyzer.java index a3d85d0c301f..5970172f778d 100644 --- a/java/java-analysis-impl/src/com/intellij/codeInspection/dataFlow/ControlFlowAnalyzer.java +++ b/java/java-analysis-impl/src/com/intellij/codeInspection/dataFlow/ControlFlowAnalyzer.java @@ -1414,14 +1414,14 @@ public class ControlFlowAnalyzer extends JavaElementVisitor { if (contracts.size() > 1) { addInstruction(new DupInstruction(args.length, contracts.size() - 1)); } - for (MethodContract contract : contracts) { - handleContract(expression, contract); + for (int i = 0; i < contracts.size(); i++) { + handleContract(expression, contracts.get(i), contracts.size() - 1 - i); } pushUnknownReturnValue(expression); // goto here if all contracts are false return true; } - private void handleContract(PsiMethodCallExpression expression, MethodContract contract) { + private void handleContract(PsiMethodCallExpression expression, MethodContract contract, int remainingContracts) { PsiExpression[] args = expression.getArgumentList().getExpressions(); final ControlFlow.ControlFlowOffset exitPoint = getEndOffset(expression); @@ -1448,6 +1448,10 @@ public class ControlFlowAnalyzer extends JavaElementVisitor { continueCheckingContract.setOffset(myCurrentFlow.getInstructionCount()); } + for (int j = 0; j < remainingContracts * args.length; j++) { + addInstruction(new PopInstruction()); + } + // if contract is true switch (contract.returnValue) { case ANY_VALUE: diff --git a/java/java-tests/testData/inspection/dataFlow/fixture/ContractSeveralClauses.java b/java/java-tests/testData/inspection/dataFlow/fixture/ContractSeveralClauses.java index 554e979d56cd..f201cf432f1c 100644 --- a/java/java-tests/testData/inspection/dataFlow/fixture/ContractSeveralClauses.java +++ b/java/java-tests/testData/inspection/dataFlow/fixture/ContractSeveralClauses.java @@ -1,4 +1,5 @@ import org.jetbrains.annotations.Contract; +import org.jetbrains.annotations.Nullable; public class Foo { @@ -6,8 +7,21 @@ public class Foo { return escapeStr(s, escaper); } + String foo2(Object escaper, @Nullable String s) { + return escapeStr(s, escaper); + } + + void foo3(@Nullable String s) { + foo2(this, escapeStr(s)); + } + @Contract("null,_->null;!null,_->!null") String escapeStr(String s, Object o) { return s; } + + @Contract("null->null;!null->!null") + String escapeStr(String s) { + return s; + } } \ No newline at end of file