diff --git a/java/java-analysis-impl/src/com/intellij/codeInspection/dataFlow/java/JavaDfaValueFactory.java b/java/java-analysis-impl/src/com/intellij/codeInspection/dataFlow/java/JavaDfaValueFactory.java index e0107dec460e..e1791504d303 100644 --- a/java/java-analysis-impl/src/com/intellij/codeInspection/dataFlow/java/JavaDfaValueFactory.java +++ b/java/java-analysis-impl/src/com/intellij/codeInspection/dataFlow/java/JavaDfaValueFactory.java @@ -23,6 +23,7 @@ import com.intellij.psi.util.InheritanceUtil; import com.intellij.psi.util.PropertyUtilBase; import com.intellij.psi.util.PsiTreeUtil; import com.intellij.psi.util.PsiUtil; +import com.siyeh.ig.callMatcher.CallMatcher; import com.siyeh.ig.psiutils.ClassUtils; import com.siyeh.ig.psiutils.ExpressionUtils; import org.jetbrains.annotations.Contract; @@ -39,7 +40,10 @@ import static com.intellij.util.ObjectUtils.tryCast; * Utility class to help producing values for Java DFA */ public final class JavaDfaValueFactory { - + // Methods that while considered as pure may return different results, as depend on the world state + private static final CallMatcher UNSTABLE_METHODS = CallMatcher.staticCall( + "java.lang.Thread", "currentThread").parameterCount(0); + private JavaDfaValueFactory() { } @@ -205,7 +209,8 @@ public final class JavaDfaValueFactory { if (InheritanceUtil.isInheritor(method.getReturnType(), JAVA_UTIL_STREAM_BASE_STREAM)) return null; if (method.getParameterList().isEmpty() && (PropertyUtilBase.isSimplePropertyGetter(method) || JavaMethodContractUtil.isPure(method) || isClassAnnotatedImmutable(method)) && - isContractAllowedForGetter(method)) { + isContractAllowedForGetter(method) && + !UNSTABLE_METHODS.methodMatches(method)) { return new GetterDescriptor(method); } } diff --git a/java/java-tests/testData/inspection/dataFlow/fixture/ParallelStreamThreadId.java b/java/java-tests/testData/inspection/dataFlow/fixture/ParallelStreamThreadId.java new file mode 100644 index 000000000000..6f31e06e7767 --- /dev/null +++ b/java/java-tests/testData/inspection/dataFlow/fixture/ParallelStreamThreadId.java @@ -0,0 +1,16 @@ +import java.util.stream.Stream; + +class Test { + public static void main(String[] args) { + long thread = Thread.currentThread().getId(); + + Stream.of(1, 2, 3, 4) + .parallel() + .forEach(e -> { + if (Thread.currentThread().getId() == thread) { + + } + }); + + } +} diff --git a/java/java-tests/testSrc/com/intellij/java/codeInspection/DataFlowInspection8Test.java b/java/java-tests/testSrc/com/intellij/java/codeInspection/DataFlowInspection8Test.java index 6774127700db..5b53acbed02a 100644 --- a/java/java-tests/testSrc/com/intellij/java/codeInspection/DataFlowInspection8Test.java +++ b/java/java-tests/testSrc/com/intellij/java/codeInspection/DataFlowInspection8Test.java @@ -400,4 +400,5 @@ public class DataFlowInspection8Test extends DataFlowInspectionTestCase { public void testConsumedStreamDifferentMethods() { doTest(); } public void testConsumedStreamWithoutInline() { doTest(); } public void testLocalityAndConditionalExpression() { doTest(); } + public void testParallelStreamThreadId() { doTest(); } } \ No newline at end of file