boolean (@Nullable PyExpression expression) { if (expression == null) { return false; } if (expression instanceof PyCallExpression || expression instanceof PyYieldExpression) { return true; } else if (expression instanceof PyListCompExpression) { if (hasEffect(((PyListCompExpression)expression).getResultExpression())) { return true; } } else if (expression instanceof PyBinaryExpression binary) { final PyElementType operator = binary.getOperator(); if (PyTokenTypes.COMPARISON_OPERATIONS.contains(operator)) return false; final PyExpression leftExpression = binary.getLeftExpression(); final PyExpression rightExpression = binary.getRightExpression(); if (hasEffect(leftExpression) || hasEffect(rightExpression)) return true; String method = operator == null ? null : operator.getSpecialMethodName(); if (method != null) { // maybe the op is overridden and may produce side effects, like cout << "hello" PyType type = myTypeEvalContext.getType(leftExpression); if (type != null && !type.isBuiltin() && type.resolveMember(method, null, AccessDirection.READ, getResolveContext()) != null) { return true; } if (rightExpression != null) { type = myTypeEvalContext.getType(rightExpression); if (type != null) { String rmethod = "__r" + method.substring(2); // __add__ -> __radd__ if (!type.isBuiltin() && type.resolveMember(rmethod, null, AccessDirection.READ, getResolveContext()) != null) { return true; } } } } } else if (expression instanceof PyConditionalExpression conditionalExpression) { return hasEffect(conditionalExpression.getTruePart()) || hasEffect(conditionalExpression.getFalsePart()); } else if (expression instanceof PyParenthesizedExpression parenthesizedExpression) { return hasEffect(parenthesizedExpression.getContainedExpression()); } else if (expression instanceof PyReferenceExpression referenceExpression) { ResolveResult[] results = referenceExpression.getReference(getResolveContext()).multiResolve(true); for (ResolveResult res : results) { if (res.getElement() instanceof PyFunction) { registerProblem(expression, PyPsiBundle.message("INSP.statement.effect.statement.having.no.effect.can.be.replaced.with.function.call"), new StatementEffectFunctionCallQuickFix()); return true; } } } else if (expression instanceof PyTupleExpression) { PyExpression[] elements = ((PyTupleExpression)expression).getElements(); for (PyExpression element : elements) { if (hasEffect(element)) { return true; } } } else if (expression instanceof PyPrefixExpression prefixExpr) { return prefixExpr.getOperator() == PyTokenTypes.AWAIT_KEYWORD; } else if (expression instanceof PyNoneLiteralExpression && ((PyNoneLiteralExpression)expression).isEllipsis()) { return true; } return false; }