public static async Task <Document> RefactorAsync( Document document, ConditionalExpressionSyntax conditionalExpressionSyntax, CancellationToken cancellationToken) { ConditionalExpressionInfo conditionalExpression; if (ConditionalExpressionInfo.TryCreate(conditionalExpressionSyntax, out conditionalExpression)) { SemanticModel semanticModel = await document.GetSemanticModelAsync().ConfigureAwait(false); NullCheckExpression nullCheck; if (NullCheckExpression.TryCreate(conditionalExpression.Condition, semanticModel, out nullCheck, cancellationToken)) { ExpressionSyntax whenNotNull = (nullCheck.IsCheckingNotNull) ? conditionalExpression.WhenTrue : conditionalExpression.WhenFalse; ExpressionSyntax whenNull = (nullCheck.IsCheckingNull) ? conditionalExpression.WhenTrue : conditionalExpression.WhenFalse; ExpressionSyntax expression = FindExpressionThatCanBeConditionallyAccessed(nullCheck.Expression, whenNotNull); ExpressionSyntax newNode; if (expression.Parent == whenNotNull && whenNotNull.IsKind(SyntaxKind.SimpleMemberAccessExpression) && SemanticUtilities.IsPropertyOfNullableOfT(whenNotNull, "Value", semanticModel, cancellationToken)) { newNode = expression; } else { newNode = SyntaxFactory.ParseExpression(whenNotNull.ToString().Insert(expression.Span.End - whenNotNull.SpanStart, "?")); } if (!semanticModel.GetTypeSymbol(whenNotNull, cancellationToken).IsReferenceType) { newNode = CSharpFactory.CoalesceExpression(newNode.Parenthesize(), whenNull.Parenthesize()); } newNode = newNode .WithTriviaFrom(conditionalExpressionSyntax) .Parenthesize(); return(await document.ReplaceNodeAsync(conditionalExpressionSyntax, newNode, cancellationToken).ConfigureAwait(false)); } } Debug.Fail(conditionalExpressionSyntax.ToString()); return(document); }