a rough fix for dfa false positive with nested for loop over a reassigned array variable (IDEA-CR-25468)

This commit is contained in:
peter
2017-10-14 07:53:14 +02:00
parent e854317f90
commit 45c3906af1
2 changed files with 17 additions and 4 deletions
@@ -17,6 +17,7 @@ package com.intellij.codeInspection.dataFlow;
import com.intellij.codeInsight.AnnotationUtil;
import com.intellij.codeInsight.NullableNotNullManager;
import com.intellij.codeInsight.daemon.impl.analysis.HighlightControlFlowUtil;
import com.intellij.codeInsight.daemon.impl.analysis.JavaGenericsUtil;
import com.intellij.codeInspection.dataFlow.instructions.Instruction;
import com.intellij.codeInspection.dataFlow.instructions.MethodCallInstruction;
@@ -33,6 +34,7 @@ import com.intellij.util.ArrayUtil;
import com.intellij.util.NullableFunction;
import com.intellij.util.ObjectUtils;
import com.intellij.util.containers.ContainerUtil;
import com.intellij.util.containers.HashMap;
import com.intellij.util.containers.JBIterable;
import com.intellij.util.containers.MultiMap;
import com.intellij.util.containers.Stack;
@@ -151,10 +153,12 @@ public class DfaPsiUtil {
PsiType iteratedType = iteratedValue.getType();
if (iteratedValue instanceof PsiReferenceExpression) {
PsiElement target = ((PsiReferenceExpression)iteratedValue).resolve();
if (target instanceof PsiParameter &&
target.getParent() instanceof PsiForeachStatement &&
PsiTreeUtil.isAncestor(target.getParent(), loop, true)) {
iteratedType = inferLoopParameterTypeWithNullability((PsiForeachStatement)target.getParent());
if (target instanceof PsiParameter && target.getParent() instanceof PsiForeachStatement) {
PsiForeachStatement targetLoop = (PsiForeachStatement)target.getParent();
if (PsiTreeUtil.isAncestor(targetLoop, loop, true) &&
!HighlightControlFlowUtil.isReassigned((PsiParameter)target, new HashMap<>())) {
iteratedType = inferLoopParameterTypeWithNullability(targetLoop);
}
}
}
return JavaGenericsUtil.getCollectionItemType(iteratedType, iteratedValue.getResolveScope());
@@ -9,4 +9,13 @@ class Foo {
}
}
void test3(final @Nullable Object @NotNull[]@NotNull[] values) {
for (Object[] line : values) {
line = new Object[]{"a"};
for (Object item : line) {
System.out.println(item.hashCode());
}
}
}
}