mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-09-27 10:03:11 +07:00
a rough fix for dfa false positive with nested for loop over a reassigned array variable (IDEA-CR-25468)
This commit is contained in:
@@ -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
@@ -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());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
Reference in New Issue
Block a user