@Override
  public void beforeAssignment(@NotNull DfaValue value,
                               @NotNull DfaValue target,
                               @NotNull DfaMemoryState memState,
                               @Nullable DfaAnchor anchor) {
    if (!(anchor instanceof JavaExpressionAnchor)) return;
    PsiAssignmentExpression assignment = tryCast(((JavaExpressionAnchor)anchor).getExpression(), PsiAssignmentExpression.class);
    if (assignment == null) return;
    PsiExpression left = assignment.getLExpression();
    if (!Boolean.FALSE.equals(mySameValueAssigned.get(left))) {
      if (!left.isPhysical()) {
        if (LOG.isDebugEnabled()) {
          LOG.debug("Non-physical element in assignment instruction: " + left.getParent().getText(), new Throwable());
        }
      } else {
        DfType dfType = memState.getDfType(value);
        // Reporting strings is skipped because string reassignment might be intentionally used to deduplicate the heap objects
        // (we compare strings by contents)
        if (memState.areEqual(value, target) &&
            !isFloatingZero(dfType.getConstantOfType(Number.class)) &&
            !(TypeUtils.isJavaLangString(left.getType()) && dfType != DfTypes.NULL) &&
            !isAssignmentToDefaultValueInConstructor(target, assignment.getRExpression())) {
          mySameValueAssigned.merge(left, Boolean.TRUE, Boolean::logicalAnd);
        }
        else {
          mySameValueAssigned.put(left, Boolean.FALSE);
        }
      }
    }
  }
@Override
  public void beforeAssignment(@NotNull DfaValue value,
                               @NotNull DfaValue target,
                               @NotNull DfaMemoryState memState,
                               @Nullable DfaAnchor anchor)