boolean (@NotNull PsiPolyadicExpression expression, PsiExpression[] operands, boolean shift) { CommonDataflow.DataflowResult dfr = CommonDataflow.getDataflowResult(expression); if (dfr != null) { long min = 1, max = 1; for (PsiExpression operand : operands) { LongRangeSet set = DfLongType.extractRange(dfr.getDfType(PsiUtil.skipParenthesizedExprDown(operand))); if (operand == operands[0]) { min = set.min(); max = set.max(); continue; } long r1, r2, r3, r4; if (shift) { set = set.bitwiseAnd(LongRangeSet.point(0x3F)); long nextMin = set.min(); long nextMax = set.max(); if (nextMax >= 0x20) return false; r1 = min << nextMin; r2 = max << nextMin; r3 = min << nextMax; r4 = max << nextMax; } else { long nextMin = set.min(); long nextMax = set.max(); if (intOverflow(nextMin) || intOverflow(nextMax)) return false; r1 = min * nextMin; r2 = max * nextMin; r3 = min * nextMax; r4 = max * nextMax; } if (intOverflow(r1) || intOverflow(r2) || intOverflow(r3) || intOverflow(r4)) return false; min = Math.min(Math.min(r1, r2), Math.min(r3, r4)); max = Math.max(Math.max(r1, r2), Math.max(r3, r4)); } } return true; }