From 8e43e69c1e5c276671dd5d8236627053ea0835c9 Mon Sep 17 00:00:00 2001 From: peter Date: Fri, 25 Jul 2014 15:03:47 +0200 Subject: [PATCH] source contract inference: handle boxing during delegation (CR-IC-5787) --- .../codeInspection/dataFlow/ContractInference.java | 12 +++++++----- .../ContractInferenceFromSourceTest.groovy | 12 ++++++++++++ 2 files changed, 19 insertions(+), 5 deletions(-) diff --git a/java/java-analysis-impl/src/com/intellij/codeInspection/dataFlow/ContractInference.java b/java/java-analysis-impl/src/com/intellij/codeInspection/dataFlow/ContractInference.java index 75f49f6bc97a..17f9426efed9 100644 --- a/java/java-analysis-impl/src/com/intellij/codeInspection/dataFlow/ContractInference.java +++ b/java/java-analysis-impl/src/com/intellij/codeInspection/dataFlow/ContractInference.java @@ -72,14 +72,16 @@ class ContractInferenceInterpreter { if (statements[0] instanceof PsiReturnStatement) { List result = handleDelegation(((PsiReturnStatement)statements[0]).getReturnValue(), false); if (result != null) { + PsiTypeElement typeElement = myMethod.getReturnTypeElement(); + final boolean returningObject = typeElement == null || !(typeElement.getType() instanceof PsiClassType); return ContainerUtil.findAll(result, new Condition() { @Override public boolean value(MethodContract contract) { - if (contract.returnValue == NULL_VALUE || contract.returnValue == NOT_NULL_VALUE) { - PsiTypeElement typeElement = myMethod.getReturnTypeElement(); - if (typeElement == null || !(typeElement.getType() instanceof PsiClassType)) { - return false; - } + if ((contract.returnValue == NULL_VALUE || contract.returnValue == NOT_NULL_VALUE) && returningObject) { + return false; + } + if ((contract.returnValue == TRUE_VALUE || contract.returnValue == FALSE_VALUE) && !returningObject) { + return false; } return true; diff --git a/java/java-tests/testSrc/com/intellij/codeInspection/ContractInferenceFromSourceTest.groovy b/java/java-tests/testSrc/com/intellij/codeInspection/ContractInferenceFromSourceTest.groovy index d17b83bf4416..89762efe5dd2 100644 --- a/java/java-tests/testSrc/com/intellij/codeInspection/ContractInferenceFromSourceTest.groovy +++ b/java/java-tests/testSrc/com/intellij/codeInspection/ContractInferenceFromSourceTest.groovy @@ -228,6 +228,18 @@ class ContractInferenceFromSourceTest extends LightCodeInsightFixtureTestCase { assert c == [] } + public void "test boolean autoboxing in delegation"() { + def c = inferContracts(""" + static Boolean test04(String s) { + return test03(s); + } + static boolean test03(String s) { + return s == null; + } + """) + assert c == [] + } + public void "test boolean auto-unboxing"() { def c = inferContracts(""" static boolean test02(String s) {