private static @Nullable AnalysisStartingPoint fromBinOp(@Nullable PsiExpression target,
                                                           @NotNull IElementType type,
                                                           @Nullable PsiExpression constant) {
    if (constant == null) return null;
    DfType constantType = fromConstant(constant);
    if (constantType == null) {
      return null;
    }
    PsiExpression anchor = extractAnchor(target);
    if (anchor != null) {
      PsiType anchorType = anchor.getType();
      if (anchorType == null || TypeUtils.isJavaLangString(anchorType)) return null;
      if (anchorType.equals(PsiTypes.byteType()) || anchorType.equals(PsiTypes.charType()) || anchorType.equals(PsiTypes.shortType())) {
        anchorType = PsiTypes.intType();
      }
      if (constantType == DfTypes.NULL || DfTypes.typedObject(anchorType, Nullability.NOT_NULL).meet(constantType) != DfType.BOTTOM) {
        if (type.equals(JavaTokenType.EQEQ)) {
          return new AnalysisStartingPoint(constantType, anchor);
        }
        if (type.equals(JavaTokenType.NE)) {
          return tryNegate(new AnalysisStartingPoint(constantType, anchor));
        }
      }
    }
    RelationType relationType = DfaPsiUtil.getRelationByToken(type);
    if (relationType != null) {
      LongRangeSet set = DfLongType.extractRange(constantType).fromRelation(relationType);
      if (anchor == null) return null;
      PsiType anchorType = anchor.getType();
      if (PsiTypes.longType().equals(anchorType)) {
        return new AnalysisStartingPoint(DfTypes.longRange(set), anchor);
      }
      if (PsiTypes.intType().equals(anchorType) ||
          PsiTypes.shortType().equals(anchorType) ||
          PsiTypes.byteType().equals(anchorType) ||
          PsiTypes.charType().equals(anchorType)) {
        set = set.meet(Objects.requireNonNull(JvmPsiRangeSetUtil.typeRange(anchorType)));
        return new AnalysisStartingPoint(DfTypes.intRangeClamped(set), anchor);
      }
    }
    return null;
  }
private static @Nullable AnalysisStartingPoint fromBinOp(@Nullable PsiExpression target,
                                                           @NotNull IElementType type,
                                                           @Nullable PsiExpression constant)