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

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

            if (ifStatement == null)
            {
                return;
            }

            AddBracesToIfElseChain(context, ifStatement);

            if (ifStatement.Condition != null &&
                ifStatement.Condition.Span.Contains(context.Span) &&
                context.Document.SupportsSemanticModel)
            {
                SemanticModel semanticModel = await context.Document.GetSemanticModelAsync(context.CancellationToken);

                AddBooleanComparisonRefactoring.Refactor(ifStatement.Condition, context, semanticModel);
            }

            FormatBinaryExpressionRefactoring.Refactor(context, ifStatement);

            SwapStatements(context, ifStatement);
        }
Exemplo n.º 2
0
        public override async Task ComputeRefactoringsAsync(CodeRefactoringContext context)
        {
            SyntaxNode root = await context.Document.GetSyntaxRootAsync(context.CancellationToken);

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

            if (returnStatement == null)
            {
                return;
            }

            if (returnStatement.Expression != null &&
                returnStatement.Expression.Span.Contains(context.Span) &&
                context.Document.SupportsSemanticModel)
            {
                MemberDeclarationSyntax declaration = GetDeclaration(returnStatement);

                if (declaration != null)
                {
                    TypeSyntax memberType = GetMemberType(declaration);

                    if (memberType != null)
                    {
                        SemanticModel semanticModel = await context.Document.GetSemanticModelAsync(context.CancellationToken);

                        ITypeSymbol memberTypeSymbol = semanticModel
                                                       .GetTypeInfo(memberType, context.CancellationToken)
                                                       .Type;

                        if (memberTypeSymbol?.IsKind(SymbolKind.ErrorType) == false)
                        {
                            ITypeSymbol typeSymbol = semanticModel
                                                     .GetTypeInfo(returnStatement.Expression, context.CancellationToken)
                                                     .Type;

                            if (typeSymbol?.IsKind(SymbolKind.ErrorType) == false)
                            {
                                if (memberTypeSymbol.SpecialType == SpecialType.System_Boolean &&
                                    typeSymbol.IsKind(SymbolKind.NamedType))
                                {
                                    var namedTypeSymbol = (INamedTypeSymbol)typeSymbol;

                                    if (namedTypeSymbol?.ConstructedFrom.SpecialType == SpecialType.System_Nullable_T &&
                                        namedTypeSymbol.TypeArguments[0].SpecialType == SpecialType.System_Boolean)
                                    {
                                        CodeAction codeAction = CodeAction.Create(
                                            AddBooleanComparisonRefactoring.Title,
                                            cancellationToken =>
                                        {
                                            return(AddBooleanComparisonRefactoring.RefactorAsync(
                                                       context.Document,
                                                       returnStatement.Expression,
                                                       context.CancellationToken));
                                        });

                                        context.RegisterRefactoring(codeAction);
                                    }
                                }

                                if (!memberTypeSymbol.Equals(typeSymbol))
                                {
                                    TypeSyntax newType = TypeSyntaxRefactoring.CreateTypeSyntax(typeSymbol);

                                    if (newType != null)
                                    {
                                        CodeAction codeAction = CodeAction.Create(
                                            $"Change {GetText(declaration)} type to '{typeSymbol.ToDisplayString(TypeSyntaxRefactoring.SymbolDisplayFormat)}'",
                                            cancellationToken =>
                                        {
                                            return(ChangeReturnTypeAsync(
                                                       context.Document,
                                                       memberType,
                                                       newType,
                                                       cancellationToken));
                                        });

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

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

            if (binaryExpression == null)
            {
                return;
            }

            if (binaryExpression.IsAnyKind(SyntaxKind.LogicalAndExpression, SyntaxKind.LogicalOrExpression) &&
                binaryExpression.Left?.IsMissing == false &&
                binaryExpression.Right?.IsMissing == false)
            {
                if (context.Document.SupportsSemanticModel)
                {
                    SemanticModel semanticModel = null;

                    if (binaryExpression.Left.Span.Contains(context.Span))
                    {
                        if (semanticModel == null)
                        {
                            semanticModel = await context.Document.GetSemanticModelAsync(context.CancellationToken);
                        }

                        AddBooleanComparisonRefactoring.Refactor(binaryExpression.Left, context, semanticModel);
                    }
                    else if (binaryExpression.Right.Span.Contains(context.Span))
                    {
                        if (semanticModel == null)
                        {
                            semanticModel = await context.Document.GetSemanticModelAsync(context.CancellationToken);
                        }

                        AddBooleanComparisonRefactoring.Refactor(binaryExpression.Right, context, semanticModel);
                    }
                }

                context.RegisterRefactoring(
                    "Negate binary expression",
                    cancellationToken =>
                {
                    return(NegateBinaryExpressionAsync(
                               context.Document,
                               GetTopmostExpression(binaryExpression),
                               cancellationToken));
                });
            }

            if (binaryExpression.OperatorToken.Span.Contains(context.Span) &&
                ExpandCoalesceExpressionRefactoring.CanRefactor(binaryExpression))
            {
                context.RegisterRefactoring(
                    "Expand coalesce expression",
                    cancellationToken =>
                {
                    return(ExpandCoalesceExpressionRefactoring.RefactorAsync(
                               context.Document,
                               binaryExpression,
                               cancellationToken));
                });
            }

            SwapExpressionsRefactoring.Refactor(context, binaryExpression);
        }