From 1b4d301a50d57439767cc5ceea9139ab51ca8c56 Mon Sep 17 00:00:00 2001 From: peter Date: Mon, 8 Dec 2014 17:29:01 +0100 Subject: [PATCH] treat lambdas as notnull in dfa & nullity inference (IDEA-134045) --- .../codeInspection/dataFlow/NullityInference.java | 13 +++++++++++-- .../dataFlow/value/DfaExpressionFactory.java | 2 +- .../NullityInferenceFromSourceTestCase.groovy | 4 ++++ 3 files changed, 16 insertions(+), 3 deletions(-) diff --git a/java/java-analysis-impl/src/com/intellij/codeInspection/dataFlow/NullityInference.java b/java/java-analysis-impl/src/com/intellij/codeInspection/dataFlow/NullityInference.java index e77a9478334b..dbf8a4569bbf 100644 --- a/java/java-analysis-impl/src/com/intellij/codeInspection/dataFlow/NullityInference.java +++ b/java/java-analysis-impl/src/com/intellij/codeInspection/dataFlow/NullityInference.java @@ -83,14 +83,15 @@ public class NullityInference { hasNotNulls.set(true); } } - else if (value.getType() instanceof PsiPrimitiveType) { + else if (value instanceof PsiLambdaExpression || value.getType() instanceof PsiPrimitiveType) { hasNotNulls.set(true); } else if (value instanceof PsiMethodCallExpression) { PsiMethod target = ((PsiMethodCallExpression)value).resolveMethod(); if (target == null) { hasUnknowns.set(true); - } else { + } + else { delegates.add(target); } } @@ -100,6 +101,14 @@ public class NullityInference { super.visitReturnStatement(statement); } + @Override + public void visitClass(PsiClass aClass) { + } + + @Override + public void visitLambdaExpression(PsiLambdaExpression expression) { + } + @Override public void visitErrorElement(PsiErrorElement element) { hasErrors.set(true); diff --git a/java/java-analysis-impl/src/com/intellij/codeInspection/dataFlow/value/DfaExpressionFactory.java b/java/java-analysis-impl/src/com/intellij/codeInspection/dataFlow/value/DfaExpressionFactory.java index bbc5de57df94..92df8c858229 100644 --- a/java/java-analysis-impl/src/com/intellij/codeInspection/dataFlow/value/DfaExpressionFactory.java +++ b/java/java-analysis-impl/src/com/intellij/codeInspection/dataFlow/value/DfaExpressionFactory.java @@ -94,7 +94,7 @@ public class DfaExpressionFactory { return myFactory.createLiteralValue((PsiLiteralExpression)expression); } - if (expression instanceof PsiNewExpression) { + if (expression instanceof PsiNewExpression || expression instanceof PsiLambdaExpression) { return myFactory.createTypeValue(expression.getType(), Nullness.NOT_NULL); } diff --git a/java/java-tests/testSrc/com/intellij/codeInspection/NullityInferenceFromSourceTestCase.groovy b/java/java-tests/testSrc/com/intellij/codeInspection/NullityInferenceFromSourceTestCase.groovy index c6b6bfd65149..66c31010bc70 100644 --- a/java/java-tests/testSrc/com/intellij/codeInspection/NullityInferenceFromSourceTestCase.groovy +++ b/java/java-tests/testSrc/com/intellij/codeInspection/NullityInferenceFromSourceTestCase.groovy @@ -73,6 +73,10 @@ String bar() { return "z"; } assert inferNullity(parse('Object foo() { return 1; }')) == NOT_NULL } + void "test null inside lambda"() { + assert inferNullity(parse('Object foo() { return () -> { return null; }; }')) == NOT_NULL + } + protected abstract Nullness inferNullity(PsiMethod method) protected PsiMethod parse(String method) {