IDEA-123289 Infer nullability of 'for each' variable from type annotations of the collection parameter

This commit is contained in:
peter
2014-04-18 22:37:31 +02:00
parent c18c4ff742
commit 019a68bcc8
2 changed files with 18 additions and 0 deletions
@@ -25,6 +25,7 @@
package com.intellij.codeInspection.dataFlow.value;
import com.intellij.codeInsight.NullableNotNullManager;
import com.intellij.codeInsight.daemon.impl.analysis.JavaGenericsUtil;
import com.intellij.codeInspection.dataFlow.DfaPsiUtil;
import com.intellij.codeInspection.dataFlow.Nullness;
import com.intellij.openapi.util.Comparing;
@@ -160,6 +161,16 @@ public class DfaVariableValue extends DfaValue {
return nullability;
}
if (var instanceof PsiParameter && var.getParent() instanceof PsiForeachStatement) {
PsiExpression iteratedValue = ((PsiForeachStatement)var.getParent()).getIteratedValue();
if (iteratedValue != null) {
PsiType itemType = JavaGenericsUtil.getCollectionItemType(iteratedValue);
if (itemType != null) {
return DfaPsiUtil.getElementNullability(itemType, var);
}
}
}
if (var instanceof PsiField && DfaPsiUtil.isFinalField((PsiVariable)var) && myFactory.isHonorFieldInitializers()) {
List<PsiExpression> initializers = DfaPsiUtil.findAllConstructorInitializers((PsiField)var);
if (initializers.isEmpty()) {
@@ -14,6 +14,13 @@ class Foo {
System.out.println(<warning descr="Method invocation 'i.intValue()' may produce 'java.lang.NullPointerException'">i.intValue()</warning>);
}
}
void foo3() {
List<@Nullable String> list = new ArrayList<>();
list.add(null);
for (String s : list) {
System.out.println(<warning descr="Method invocation 's.length()' may produce 'java.lang.NullPointerException'">s.length()</warning>);
}
}
}