diff --git a/java/java-analysis-impl/src/com/intellij/codeInspection/dataFlow/CommonDataflow.java b/java/java-analysis-impl/src/com/intellij/codeInspection/dataFlow/CommonDataflow.java index 00b6a73c6d21..e89909e45dee 100644 --- a/java/java-analysis-impl/src/com/intellij/codeInspection/dataFlow/CommonDataflow.java +++ b/java/java-analysis-impl/src/com/intellij/codeInspection/dataFlow/CommonDataflow.java @@ -86,7 +86,7 @@ public class CommonDataflow { if (myFacts == DfaFactMap.EMPTY) return; DfaFactMap newMap = DataflowResult.getFactMap(memState, value); if (value instanceof DfaVariableValue) { - SpecialField field = SpecialField.fromQualifierType(value.getType()); + SpecialField field = SpecialField.fromQualifier(value); if (field != null) { DfaValue specialField = field.createValue(value.getFactory(), value); if (specialField instanceof DfaVariableValue) { diff --git a/java/java-analysis-impl/src/com/intellij/codeInspection/dataFlow/DfaMemoryStateImpl.java b/java/java-analysis-impl/src/com/intellij/codeInspection/dataFlow/DfaMemoryStateImpl.java index fdc672e93298..348807b22592 100644 --- a/java/java-analysis-impl/src/com/intellij/codeInspection/dataFlow/DfaMemoryStateImpl.java +++ b/java/java-analysis-impl/src/com/intellij/codeInspection/dataFlow/DfaMemoryStateImpl.java @@ -1198,7 +1198,7 @@ public class DfaMemoryStateImpl implements DfaMemoryState { private Couple getSpecialEquivalencePair(DfaVariableValue left, DfaValue right) { if (right instanceof DfaVariableValue) return null; - SpecialField field = SpecialField.fromQualifierType(left.getType()); + SpecialField field = SpecialField.fromQualifier(left); if (field == null) return null; DfaValue leftValue = field.createValue(myFactory, left); DfaValue rightValue = field.createValue(myFactory, right); diff --git a/java/java-analysis-impl/src/com/intellij/codeInspection/dataFlow/SpecialField.java b/java/java-analysis-impl/src/com/intellij/codeInspection/dataFlow/SpecialField.java index 909354002295..ca31c81a84d8 100644 --- a/java/java-analysis-impl/src/com/intellij/codeInspection/dataFlow/SpecialField.java +++ b/java/java-analysis-impl/src/com/intellij/codeInspection/dataFlow/SpecialField.java @@ -368,7 +368,29 @@ public enum SpecialField implements VariableDescriptor { } return null; } - + + /** + * Returns a special field which corresponds to given qualifier + * + * @param value a qualifier value + * @return a special field; null if no special field is detected to be related to given qualifier + */ + @Nullable + public static SpecialField fromQualifier(@NotNull DfaValue value) { + if (value instanceof DfaFactMapValue) { + DfaFactMap facts = ((DfaFactMapValue)value).getFacts(); + SpecialFieldValue sfValue = facts.get(DfaFactType.SPECIAL_FIELD_VALUE); + if (sfValue != null) { + return sfValue.getField(); + } + TypeConstraint constraint = facts.get(DfaFactType.TYPE_CONSTRAINT); + if (constraint != null) { + return fromQualifierType(constraint.getPsiType()); + } + } + return fromQualifierType(value.getType()); + } + @Override public String toString() { return myTitle; diff --git a/java/java-analysis-impl/src/com/intellij/codeInspection/dataFlow/TrackingRunner.java b/java/java-analysis-impl/src/com/intellij/codeInspection/dataFlow/TrackingRunner.java index e6407d4c4ccc..fe04893c9d7f 100644 --- a/java/java-analysis-impl/src/com/intellij/codeInspection/dataFlow/TrackingRunner.java +++ b/java/java-analysis-impl/src/com/intellij/codeInspection/dataFlow/TrackingRunner.java @@ -828,8 +828,8 @@ public class TrackingRunner extends StandardDataFlowRunner { } } if (relationType == RelationType.NE) { - SpecialField leftField = SpecialField.fromQualifierType(leftValue.getType()); - SpecialField rightField = SpecialField.fromQualifierType(leftValue.getType()); + SpecialField leftField = SpecialField.fromQualifier(leftValue); + SpecialField rightField = SpecialField.fromQualifier(rightValue); if (leftField != null && leftField == rightField) { DfaValue leftSpecial = leftField.createValue(getFactory(), leftValue); DfaValue rightSpecial = rightField.createValue(getFactory(), rightValue);