PsiExpression (@NotNull ConditionalModel model) { @NotNull PsiExpression thenExpression = model.getThenExpression(); @NotNull PsiExpression elseExpression = model.getElseExpression(); PsiBinaryExpression binOp = tryCast(PsiUtil.skipParenthesizedExprDown(model.getCondition()), PsiBinaryExpression.class); if (binOp == null) return null; IElementType tokenType = binOp.getOperationTokenType(); boolean equals = tokenType.equals(JavaTokenType.EQEQ); if (!equals && !tokenType.equals(JavaTokenType.NE)) return null; PsiExpression left = PsiUtil.skipParenthesizedExprDown(binOp.getLOperand()); PsiExpression right = PsiUtil.skipParenthesizedExprDown(binOp.getROperand()); if (!ExpressionUtils.isSafelyRecomputableExpression(left) || !ExpressionUtils.isSafelyRecomputableExpression(right)) return null; if (TypeConversionUtil.isFloatOrDoubleType(left.getType()) && TypeConversionUtil.isFloatOrDoubleType(right.getType())) { // Simplifying the comparison of two floats/doubles like "if(a == 0.0) return 0.0; else return a;" // will cause a semantics change for "a == -0.0" return null; } EquivalenceChecker equivalence = EquivalenceChecker.getCanonicalPsiEquivalence(); if (equivalence.expressionsAreEquivalent(left, thenExpression) && equivalence.expressionsAreEquivalent(right, elseExpression) || equivalence.expressionsAreEquivalent(right, thenExpression) && equivalence.expressionsAreEquivalent(left, elseExpression)) { return equals ? elseExpression : thenExpression; } return null; }