public override async Task ComputeRefactoringsAsync(CodeRefactoringContext context)
        {
            SyntaxNode root = await context.Document.GetSyntaxRootAsync(context.CancellationToken);

            AssignmentExpressionSyntax assignmentExpression = root
                                                              .FindNode(context.Span, getInnermostNodeForTie: true)?
                                                              .FirstAncestorOrSelf <AssignmentExpressionSyntax>();

            if (assignmentExpression == null)
            {
                return;
            }

            if (AssignmentExpressionRefactoring.CanExpand(assignmentExpression) &&
                assignmentExpression.OperatorToken.Span.Contains(context.Span))
            {
                context.RegisterRefactoring(
                    "Expand assignment expression",
                    cancellationToken =>
                {
                    return(AssignmentExpressionRefactoring.ExpandAsync(
                               context.Document,
                               assignmentExpression,
                               cancellationToken));
                });
            }

            if (assignmentExpression.IsKind(SyntaxKind.SimpleAssignmentExpression) &&
                assignmentExpression.Left?.IsMissing == false &&
                assignmentExpression.Right?.IsMissing == false &&
                assignmentExpression.Right.Span.Contains(context.Span) &&
                context.Document.SupportsSemanticModel)
            {
                SemanticModel semanticModel = await context.Document.GetSemanticModelAsync(context.CancellationToken);

                ITypeSymbol leftSymbol = semanticModel.GetTypeInfo(assignmentExpression.Left).Type;

                if (leftSymbol != null)
                {
                    ITypeSymbol rightSymbol = semanticModel.GetTypeInfo(assignmentExpression.Right).Type;

                    if (!leftSymbol.Equals(rightSymbol))
                    {
                        context.RegisterRefactoring(
                            $"Add cast to '{leftSymbol.ToDisplayString(TypeSyntaxRefactoring.SymbolDisplayFormat)}'",
                            cancellationToken =>
                        {
                            return(AddCastRefactoring.RefactorAsync(
                                       context.Document,
                                       assignmentExpression.Right,
                                       leftSymbol,
                                       cancellationToken));
                        });
                    }
                }
            }
        }
        private static async Task <Document> SimplifyAssignmentExpressionAsync(
            Document document,
            AssignmentExpressionSyntax assignmentExpression,
            CancellationToken cancellationToken)
        {
            SyntaxNode oldRoot = await document.GetSyntaxRootAsync(cancellationToken);

            AssignmentExpressionSyntax newNode = AssignmentExpressionRefactoring.Simplify(assignmentExpression)
                                                 .WithTriviaFrom(assignmentExpression)
                                                 .WithAdditionalAnnotations(Formatter.Annotation);

            SyntaxNode newRoot = oldRoot.ReplaceNode(assignmentExpression, newNode);

            return(document.WithSyntaxRoot(newRoot));
        }