public static IEnumerable<ReplaceAction> GetSimplifications(ConditionalExpressionSyntax ternaryNode, ISemanticModel model, Assumptions assume, CancellationToken cancellationToken = default(CancellationToken)) { if (!ternaryNode.DefinitelyHasBooleanType(model)) yield break; var whenTrueFalseCmp = ternaryNode.WhenTrue.TryEvalAlternativeComparison(ternaryNode.WhenFalse, model, assume); if (whenTrueFalseCmp == true) { // (c ? b : b) --> b yield return new ReplaceAction( "Simplify", ternaryNode, ternaryNode.WhenTrue); // if condition has side effects we may need to keep it // (c ? b : b) --> ((c && false) || b) if (ternaryNode.Condition.HasSideEffects(model, assume) != false) { var replacement = ternaryNode.Condition .BracketedOrProtected() .BOpLogicalAnd(false.AsLiteral()) .Bracketed() .BOpLogicalOr(ternaryNode.WhenTrue); yield return new ReplaceAction( "Simplify (keeping condition evaluation)", ternaryNode, replacement); } } if (whenTrueFalseCmp == false) { // (c ? b : !b) --> (c == b) var replacement = ternaryNode.Condition .BracketedOrProtected() .BOpEquals(ternaryNode.WhenTrue); yield return new ReplaceAction( "Simplify", ternaryNode, replacement); } }