From b01db09ad70298d424f9d21ada11b995cd23ebe5 Mon Sep 17 00:00:00 2001 From: Tagir Valeev Date: Thu, 19 Sep 2019 11:41:14 +0700 Subject: [PATCH] DFA: provide range info for variable even when qualifier is unknown GitOrigin-RevId: 9cb8bce64df614e5c88572e739ee1ed49a92fd81 --- .../codeInspection/dataFlow/value/DfaFactMapValue.java | 3 ++- .../dataFlow/value/VariableDescriptor.java | 6 +++++- .../dataFlow/fixture/LongRangeKnownMethods.java | 10 +++++++++- 3 files changed, 16 insertions(+), 3 deletions(-) diff --git a/java/java-analysis-impl/src/com/intellij/codeInspection/dataFlow/value/DfaFactMapValue.java b/java/java-analysis-impl/src/com/intellij/codeInspection/dataFlow/value/DfaFactMapValue.java index c56e5bc076cc..6eb02e91c5c4 100644 --- a/java/java-analysis-impl/src/com/intellij/codeInspection/dataFlow/value/DfaFactMapValue.java +++ b/java/java-analysis-impl/src/com/intellij/codeInspection/dataFlow/value/DfaFactMapValue.java @@ -21,7 +21,8 @@ public class DfaFactMapValue extends DfaValue { } public DfaValue withFact(@NotNull DfaFactType factType, @Nullable T value) { - return getFactory().getFactFactory().createValue(myFacts.with(factType, value)); + DfaFactMap newFacts = myFacts.with(factType, value); + return newFacts == myFacts ? this : getFactory().getFactFactory().createValue(newFacts); } public DfaFactMap getFacts() { diff --git a/java/java-analysis-impl/src/com/intellij/codeInspection/dataFlow/value/VariableDescriptor.java b/java/java-analysis-impl/src/com/intellij/codeInspection/dataFlow/value/VariableDescriptor.java index 326112220ee4..ddbfa442c50e 100644 --- a/java/java-analysis-impl/src/com/intellij/codeInspection/dataFlow/value/VariableDescriptor.java +++ b/java/java-analysis-impl/src/com/intellij/codeInspection/dataFlow/value/VariableDescriptor.java @@ -1,7 +1,9 @@ // Copyright 2000-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file. package com.intellij.codeInspection.dataFlow.value; +import com.intellij.codeInspection.dataFlow.DfaFactType; import com.intellij.codeInspection.dataFlow.DfaPsiUtil; +import com.intellij.codeInspection.dataFlow.rangeSet.LongRangeSet; import com.intellij.psi.PsiModifierListOwner; import com.intellij.psi.PsiType; import org.jetbrains.annotations.NotNull; @@ -59,7 +61,9 @@ public interface VariableDescriptor { return factory.getVarFactory().createVariableValue(this, (DfaVariableValue)qualifier); } PsiType type = getType(null); - return factory.createTypeValue(type, DfaPsiUtil.getElementNullability(type, getPsiElement())); + LongRangeSet range = LongRangeSet.fromPsiElement(getPsiElement()); + return factory.withFact(factory.createTypeValue(type, DfaPsiUtil.getElementNullability(type, getPsiElement())), + DfaFactType.RANGE, range); } /** diff --git a/java/java-tests/testData/inspection/dataFlow/fixture/LongRangeKnownMethods.java b/java/java-tests/testData/inspection/dataFlow/fixture/LongRangeKnownMethods.java index 13dfcb6627ed..1a17771bdd74 100644 --- a/java/java-tests/testData/inspection/dataFlow/fixture/LongRangeKnownMethods.java +++ b/java/java-tests/testData/inspection/dataFlow/fixture/LongRangeKnownMethods.java @@ -352,7 +352,15 @@ public class LongRangeKnownMethods { if (s.length() > 7) {} } } - + + void testChainCall() { + if (getByte(0).intValue() == 256) { + + } + } + + native Byte getByte(int x); + void testNumberToStringExact(boolean b) { int i = b ? 123 : 456; String s = Integer.toString(i);