@Override
  public boolean meetDfType(@NotNull DfaValue value, @NotNull DfType dfType) {
    if (dfType == DfType.TOP) return true;
    if (dfType == DfType.BOTTOM) return false;
    if (value instanceof DfaBinOpValue) {
      return propagateRangeBack(ObjectUtils.tryCast(dfType, DfIntegralType.class), (DfaBinOpValue)value);
    }
    if (value instanceof DfaVariableValue var) {
      DfType type = getDfType(var);
      DfType result = type.meet(dfType);
      if (result.equals(type)) return true;
      if (result == DfType.BOTTOM) return false;
      return meetVariableType(var, type, result);
    }
    return value.getDfType().meet(dfType) != DfType.BOTTOM;
  }
@Override
  public boolean meetDfType(@NotNull DfaValue value, @NotNull DfType dfType)