public static async Task ComputeRefactoringsAsync(RefactoringContext context, IfStatementSyntax ifStatement)
        {
            if (context.IsAnyRefactoringEnabled(
                    RefactoringIdentifiers.SwapStatementsInIfElse,
                    RefactoringIdentifiers.ReplaceIfElseWithAssignment,
                    RefactoringIdentifiers.ReplaceIfStatementWithReturnStatement,
                    RefactoringIdentifiers.ReplaceIfElseWithSwitch) &&
                IfElseChain.IsTopmostIf(ifStatement) &&
                context.Span.IsBetweenSpans(ifStatement))
            {
                if (context.IsRefactoringEnabled(RefactoringIdentifiers.ReplaceIfStatementWithReturnStatement))
                {
                    await ReplaceIfWithStatementRefactoring.ComputeRefactoringAsync(context, ifStatement).ConfigureAwait(false);
                }

                if (context.IsRefactoringEnabled(RefactoringIdentifiers.ReplaceIfElseWithAssignment))
                {
                    ReplaceIfElseWithAssignmentRefactoring.ComputeRefactoring(context, ifStatement);
                }

                if (context.IsRefactoringEnabled(RefactoringIdentifiers.SwapStatementsInIfElse))
                {
                    SwapStatementInIfElseRefactoring.ComputeRefactoring(context, ifStatement);
                }

                if (context.IsRefactoringEnabled(RefactoringIdentifiers.ReplaceIfElseWithSwitch))
                {
                    await ReplaceIfElseWithSwitchRefactoring.ComputeRefactoringAsync(context, ifStatement).ConfigureAwait(false);
                }
            }
        }
Exemple #2
0
        private static bool CheckContainingNode(SyntaxNode node)
        {
            switch (node.Kind())
            {
            case SyntaxKind.ForEachStatement:
            case SyntaxKind.ForStatement:
            case SyntaxKind.UsingStatement:
            case SyntaxKind.WhileStatement:
            case SyntaxKind.DoStatement:
            case SyntaxKind.LockStatement:
            case SyntaxKind.FixedStatement:
            case SyntaxKind.UnsafeStatement:
            case SyntaxKind.TryStatement:
            case SyntaxKind.CheckedStatement:
            case SyntaxKind.UncheckedStatement:
                return(true);

            case SyntaxKind.IfStatement:
                return(IfElseChain.IsTopmostIf((IfStatementSyntax)node));

            case SyntaxKind.ElseClause:
                return(IfElseChain.IsEndOfChain((ElseClauseSyntax)node));
            }

            return(false);
        }
        public static void Analyze(SyntaxNodeAnalysisContext context)
        {
            SyntaxNode node = context.Node;

            if (!node.IsKind(SyntaxKind.IfStatement) ||
                !IfElseChain.IsPartOfChain((IfStatementSyntax)node))
            {
                BlockSyntax block = GetBlockThatCanBeEmbeddedStatement(node);

                if (block != null)
                {
                    SyntaxToken openBrace  = block.OpenBraceToken;
                    SyntaxToken closeBrace = block.CloseBraceToken;

                    if (!openBrace.IsMissing &&
                        !closeBrace.IsMissing &&
                        openBrace.GetLeadingAndTrailingTrivia().All(f => f.IsWhitespaceOrEndOfLineTrivia()) &&
                        closeBrace.GetLeadingAndTrailingTrivia().All(f => f.IsWhitespaceOrEndOfLineTrivia()))
                    {
                        context.ReportDiagnostic(
                            DiagnosticDescriptors.RemoveBraces,
                            block,
                            GetName(node));

                        context.ReportBraces(DiagnosticDescriptors.RemoveBracesFadeOut, block);
                    }
                }
            }
        }
Exemple #4
0
        private static HashSet <AwaitExpressionSyntax> GetAwaitExpressionsFromIfStatement(
            IfStatementSyntax ifStatement,
            bool endsWithElse)
        {
            HashSet <AwaitExpressionSyntax> awaitExpressions = null;

            foreach (IfStatementOrElseClause ifOrElse in IfElseChain.GetChain(ifStatement))
            {
                if (ifOrElse.IsElse &&
                    !endsWithElse)
                {
                    return(null);
                }

                AwaitExpressionSyntax awaitExpression = GetLastReturnAwaitExpressionOfDefault(ifOrElse.Statement);

                if (awaitExpression != null)
                {
                    (awaitExpressions ?? (awaitExpressions = new HashSet <AwaitExpressionSyntax>())).Add(awaitExpression);
                }
                else
                {
                    return(null);
                }
            }

            return(awaitExpressions);
        }
        private static IEnumerable <SwitchSectionSyntax> CreateSwitchSections(IfStatementSyntax ifStatement)
        {
            foreach (SyntaxNode node in IfElseChain.GetChain(ifStatement))
            {
                if (node.IsKind(SyntaxKind.IfStatement))
                {
                    ifStatement = (IfStatementSyntax)node;

                    var condition = ifStatement.Condition as BinaryExpressionSyntax;

                    List <SwitchLabelSyntax> labels = CreateSwitchLabels(condition, new List <SwitchLabelSyntax>());
                    labels.Reverse();

                    SwitchSectionSyntax section = SwitchSection(
                        List(labels),
                        AddBreakStatementIfNecessary(ifStatement.Statement));

                    yield return(section);
                }
                else
                {
                    var elseClause = (ElseClauseSyntax)node;

                    yield return(DefaultSwitchSection(AddBreakStatementIfNecessary(elseClause.Statement)));
                }
            }
        }
Exemple #6
0
            public override SyntaxNode VisitIfStatement(IfStatementSyntax node)
            {
                if (node == null)
                {
                    throw new ArgumentNullException(nameof(node));
                }

                if (_previousIf == null || _previousIf.Equals(IfElseChain.GetPreviousIf(node)))
                {
                    if (node.Statement != null &&
                        !node.Statement.IsKind(SyntaxKind.Block))
                    {
                        IfStatementSyntax ifStatement = node.WithStatement(SyntaxFactory.Block(node.Statement));

                        _previousIf = ifStatement;

                        return(base.VisitIfStatement(ifStatement));
                    }
                    else
                    {
                        _previousIf = node;
                    }
                }

                return(base.VisitIfStatement(node));
            }
        private static IEnumerable <SwitchSectionSyntax> CreateSwitchSections(IfStatementSyntax ifStatement)
        {
            foreach (IfStatementOrElseClause ifOrElse in IfElseChain.GetChain(ifStatement))
            {
                if (ifOrElse.IsIf)
                {
                    ifStatement = ifOrElse.AsIf();

                    var condition = ifStatement.Condition as BinaryExpressionSyntax;

                    List <SwitchLabelSyntax> labels = CreateSwitchLabels(condition, new List <SwitchLabelSyntax>());
                    labels.Reverse();

                    SwitchSectionSyntax section = SwitchSection(
                        List(labels),
                        AddBreakStatementIfNecessary(ifStatement.Statement));

                    yield return(section);
                }
                else
                {
                    yield return(DefaultSwitchSection(AddBreakStatementIfNecessary(ifOrElse.Statement)));
                }
            }
        }
Exemple #8
0
        public static async Task <Document> RefactorAsync(
            Document document,
            StatementSyntax statement,
            CancellationToken cancellationToken = default(CancellationToken))
        {
            IEnumerable <StatementSyntax> newNodes = GetNewNodes(statement)
                                                     .Select(f => f.WithFormatterAnnotation());

            if (statement.Parent.IsKind(SyntaxKind.ElseClause))
            {
                IfStatementSyntax ifStatement = IfElseChain.GetTopmostIf((ElseClauseSyntax)statement.Parent);
                var block = (BlockSyntax)ifStatement.Parent;
                int index = block.Statements.IndexOf(ifStatement);

                BlockSyntax newBlock = block.RemoveNode(statement.Parent, SyntaxRemoveOptions.KeepNoTrivia);

                newBlock = newBlock.WithStatements(newBlock.Statements.InsertRange(index + 1, newNodes));

                return(await document.ReplaceNodeAsync(block, newBlock, cancellationToken).ConfigureAwait(false));
            }
            else
            {
                return(await document.ReplaceNodeAsync(statement.Parent, newNodes, cancellationToken).ConfigureAwait(false));
            }
        }
        private static void AnalyzeIfStatement(SyntaxNodeAnalysisContext context)
        {
            SyntaxNode node = context.Node;

            if (IfElseChain.IsPartOfChain((IfStatementSyntax)node))
            {
                Analyze(context, node);
            }
        }
        public static BracesAnalysisResult AnalyzeBraces(IfStatementSyntax ifStatement)
        {
            if (ifStatement == null)
            {
                throw new ArgumentNullException(nameof(ifStatement));
            }

            bool anyHasEmbedded      = false;
            bool anyHasBlock         = false;
            bool allSupportsEmbedded = true;

            int cnt = 0;

            foreach (IfStatementOrElseClause ifOrElse in IfElseChain.GetChain(ifStatement))
            {
                cnt++;

                StatementSyntax statement = ifOrElse.Statement;

                if (!anyHasEmbedded && !statement.IsKind(SyntaxKind.Block))
                {
                    anyHasEmbedded = true;
                }

                if (!anyHasBlock && statement.IsKind(SyntaxKind.Block))
                {
                    anyHasBlock = true;
                }

                if (allSupportsEmbedded && !SupportsEmbedded(statement))
                {
                    allSupportsEmbedded = false;
                }

                if (cnt > 1 && anyHasEmbedded && !allSupportsEmbedded)
                {
                    return(BracesAnalysisResult.AddBraces);
                }
            }

            if (cnt > 1 &&
                allSupportsEmbedded &&
                anyHasBlock)
            {
                if (anyHasEmbedded)
                {
                    return(BracesAnalysisResult.AddBraces | BracesAnalysisResult.RemoveBraces);
                }
                else
                {
                    return(BracesAnalysisResult.RemoveBraces);
                }
            }

            return(BracesAnalysisResult.None);
        }
 private static IEnumerable <IfStatementSyntax> GetIfStatements(IfStatementSyntax ifStatement)
 {
     foreach (IfStatementOrElseClause ifOrElse in IfElseChain.GetChain(ifStatement))
     {
         if (ifOrElse.IsIf)
         {
             yield return(ifOrElse.AsIf());
         }
     }
 }
Exemple #12
0
 private static SyntaxNode GetContainingBlock(SyntaxNode node)
 {
     if (node.IsKind(SyntaxKind.ElseClause))
     {
         return(IfElseChain.GetTopmostIf((ElseClauseSyntax)node)?.Parent);
     }
     else
     {
         return(node.Parent);
     }
 }
Exemple #13
0
        private static IEnumerable <StatementSyntax> GetEmbeddedStatements(IfStatementSyntax topmostIf)
        {
            foreach (IfStatementOrElseClause ifOrElse in IfElseChain.GetChain(topmostIf))
            {
                StatementSyntax statement = ifOrElse.Statement;

                if (statement?.IsKind(SyntaxKind.Block) == false)
                {
                    yield return(statement);
                }
            }
        }
Exemple #14
0
        public static void ComputeRefactoring(RefactoringContext context, SelectedStatementCollection selectedStatements)
        {
            if (selectedStatements.Count == 2)
            {
                StatementSyntax[] statements = selectedStatements.ToArray();

                if (statements[0].IsKind(SyntaxKind.IfStatement) &&
                    statements[1].IsKind(SyntaxKind.ReturnStatement))
                {
                    var ifStatement = (IfStatementSyntax)statements[0];

                    if (!IfElseChain.IsPartOfChain(ifStatement))
                    {
                        ExpressionSyntax returnExpression = ReplaceIfWithStatementRefactoring.GetReturnExpression(ifStatement);

                        if (returnExpression != null)
                        {
                            var returnStatement = (ReturnStatementSyntax)statements[1];
                            ExpressionSyntax returnExpression2 = returnStatement.Expression;

                            if (returnExpression2 != null)
                            {
                                const string title = "Replace if-return with return";

                                if (returnExpression.IsBooleanLiteralExpression() ||
                                    returnExpression2.IsBooleanLiteralExpression())
                                {
                                    context.RegisterRefactoring(
                                        title,
                                        cancellationToken => RefactorAsync(context.Document, selectedStatements.Container, ifStatement, returnStatement, cancellationToken));
                                }
                                else
                                {
                                    context.RegisterRefactoring(
                                        title,
                                        cancellationToken =>
                                    {
                                        return(RefactorAsync(
                                                   context.Document,
                                                   selectedStatements.Container,
                                                   ifStatement,
                                                   returnStatement,
                                                   returnExpression,
                                                   returnExpression2,
                                                   cancellationToken));
                                    });
                                }
                            }
                        }
                    }
                }
            }
        }
        private static IEnumerable <BlockSyntax> GetBlockStatements(IfStatementSyntax ifStatement)
        {
            foreach (IfStatementOrElseClause ifOrElse in IfElseChain.GetChain(ifStatement))
            {
                StatementSyntax statement = ifOrElse.Statement;

                if (statement?.IsKind(SyntaxKind.Block) == true)
                {
                    yield return((BlockSyntax)statement);
                }
            }
        }
Exemple #16
0
        public static void Analyze(SyntaxNodeAnalysisContext context, ContinueStatementSyntax continueStatement)
        {
            SyntaxNode parent = continueStatement.Parent;

            if (parent?.IsKind(SyntaxKind.Block) == true)
            {
                var block = (BlockSyntax)parent;

                parent = parent.Parent;

                if (parent != null)
                {
                    SyntaxKind kind = parent.Kind();

                    if (CanContainContinueStatement(kind))
                    {
                        if (block.Statements.IsLast(continueStatement) &&
                            !continueStatement.SpanContainsDirectives())
                        {
                            context.ReportDiagnostic(DiagnosticDescriptors.RemoveRedundantContinueStatement, continueStatement);
                        }
                    }
                    else if (kind == SyntaxKind.ElseClause)
                    {
                        var elseClause = (ElseClauseSyntax)parent;

                        if (IfElseChain.IsEndOfChain(elseClause))
                        {
                            IfStatementSyntax ifStatement = IfElseChain.GetTopmostIf(elseClause);

                            parent = ifStatement.Parent;

                            if (parent?.IsKind(SyntaxKind.Block) == true)
                            {
                                block = (BlockSyntax)parent;

                                parent = parent.Parent;

                                if (CanContainContinueStatement(parent) &&
                                    block.Statements.IsLast(ifStatement) &&
                                    !elseClause.SpanContainsDirectives())
                                {
                                    context.ReportDiagnostic(DiagnosticDescriptors.RemoveRedundantContinueStatement, continueStatement);
                                }
                            }
                        }
                    }
                }
            }
        }
        public static bool CanRefactor(
            IfStatementSyntax ifStatement,
            SemanticModel semanticModel,
            CancellationToken cancellationToken = default(CancellationToken))
        {
            if (IfElseChain.IsTopmostIf(ifStatement))
            {
                ElseClauseSyntax elseClause = ifStatement.Else;

                if (elseClause != null)
                {
                    ExpressionSyntax condition = ifStatement.Condition;

                    if (condition != null)
                    {
                        ITypeSymbol typeSymbol = semanticModel.GetTypeSymbol(condition, cancellationToken);

                        if (typeSymbol?.IsBoolean() == true)
                        {
                            AssignmentExpressionSyntax trueExpression = GetSimpleAssignmentExpression(ifStatement.Statement);

                            ExpressionSyntax trueRight = trueExpression?.Right;

                            if (trueRight?.IsBooleanLiteralExpression() == true)
                            {
                                AssignmentExpressionSyntax falseExpression = GetSimpleAssignmentExpression(elseClause.Statement);

                                ExpressionSyntax falseRight = falseExpression?.Right;

                                if (falseRight?.IsBooleanLiteralExpression() == true)
                                {
                                    var trueBooleanLiteral  = (LiteralExpressionSyntax)trueRight;
                                    var falseBooleanLiteral = (LiteralExpressionSyntax)falseRight;

                                    if (trueBooleanLiteral.IsKind(SyntaxKind.TrueLiteralExpression) != falseBooleanLiteral.IsKind(SyntaxKind.TrueLiteralExpression) &&
                                        trueExpression.Left?.IsEquivalentTo(falseExpression.Left, topLevel: false) == true)
                                    {
                                        return(true);
                                    }
                                }
                            }
                        }
                    }
                }
            }

            return(false);
        }
Exemple #18
0
        private static IfStatementSyntax GetTopmostIf(BlockSyntax block)
        {
            SyntaxNode parent = block.Parent;

            switch (parent?.Kind())
            {
            case SyntaxKind.IfStatement:
                return(IfElseChain.GetTopmostIf((IfStatementSyntax)parent));

            case SyntaxKind.ElseClause:
                return(IfElseChain.GetTopmostIf((ElseClauseSyntax)parent));

            default:
                return(null);
            }
        }
Exemple #19
0
        public static void Analyze(SyntaxNodeAnalysisContext context, StatementSyntax statement)
        {
            if (!statement.IsKind(SyntaxKind.IfStatement) ||
                !IfElseChain.IsPartOfChain((IfStatementSyntax)statement))
            {
                StatementSyntax embeddedStatement = GetEmbeddedStatementThatShouldBeInsideBlock(statement);

                if (embeddedStatement != null)
                {
                    context.ReportDiagnostic(
                        DiagnosticDescriptors.AddBraces,
                        embeddedStatement.GetLocation(),
                        GetName(statement));
                }
            }
        }
Exemple #20
0
        public static void Analyze(SyntaxNodeAnalysisContext context, ElseClauseSyntax elseClause)
        {
            StatementSyntax statement   = elseClause.Statement;
            SyntaxToken     elseKeyword = elseClause.ElseKeyword;

            if (statement?.IsKind(SyntaxKind.Block, SyntaxKind.IfStatement) == false &&
                context.SyntaxTree().IsMultiLineSpan(TextSpan.FromBounds(elseKeyword.SpanStart, statement.SpanStart)))
            {
                IfStatementSyntax topmostIf = IfElseChain.GetTopmostIf(elseClause);

                if (topmostIf != null)
                {
                    Analyze(context, topmostIf, elseKeyword, statement);
                }
            }
        }
        public static void Analyze(SyntaxNodeAnalysisContext context, IfStatementSyntax ifStatement)
        {
            if (!IfElseChain.IsPartOfChain(ifStatement) &&
                CheckCondition(ifStatement.Condition))
            {
                IfStatementSyntax nestedIf = GetNestedIfStatement(ifStatement);

                if (nestedIf != null &&
                    nestedIf.Else == null &&
                    CheckCondition(nestedIf.Condition) &&
                    CheckTrivia(ifStatement, nestedIf) &&
                    !ifStatement.SpanContainsDirectives())
                {
                    ReportDiagnostic(context, ifStatement, nestedIf);
                }
            }
        }
        public static async Task ComputeRefactoringAsync(RefactoringContext context, IfStatementSyntax ifStatement)
        {
            if (IfElseChain.IsTopmostIf(ifStatement))
            {
                SemanticModel semanticModel = await context.GetSemanticModelAsync().ConfigureAwait(false);

                if (GetIfStatements(ifStatement)
                    .All(f => IsValidIf(f, semanticModel, context.CancellationToken)))
                {
                    string title = (ifStatement.IsSimpleIf())
                        ? "Replace if with switch"
                        : "Replace if-else with switch";

                    context.RegisterRefactoring(
                        title,
                        cancellationToken => RefactorAsync(context.Document, ifStatement, cancellationToken));
                }
            }
        }
        public static async Task ComputeRefactoringsAsync(RefactoringContext context, IfStatementSyntax ifStatement)
        {
            if (context.IsAnyRefactoringEnabled(
                    RefactoringIdentifiers.UseCoalesceExpressionInsteadOfIf,
                    RefactoringIdentifiers.UseConditionalExpressionInsteadOfIf,
                    RefactoringIdentifiers.SimplifyIf,
                    RefactoringIdentifiers.SwapStatementsInIfElse,
                    RefactoringIdentifiers.ReplaceIfElseWithSwitch) &&
                IfElseChain.IsTopmostIf(ifStatement) &&
                context.Span.IsBetweenSpans(ifStatement))
            {
                if (context.IsAnyRefactoringEnabled(
                        RefactoringIdentifiers.UseCoalesceExpressionInsteadOfIf,
                        RefactoringIdentifiers.UseConditionalExpressionInsteadOfIf,
                        RefactoringIdentifiers.SimplifyIf))
                {
                    SemanticModel semanticModel = await context.GetSemanticModelAsync().ConfigureAwait(false);

                    var options = new IfAnalysisOptions(
                        useCoalesceExpression: context.IsRefactoringEnabled(RefactoringIdentifiers.UseCoalesceExpressionInsteadOfIf),
                        useConditionalExpression: context.IsRefactoringEnabled(RefactoringIdentifiers.UseConditionalExpressionInsteadOfIf),
                        useBooleanExpression: context.IsRefactoringEnabled(RefactoringIdentifiers.SimplifyIf));

                    foreach (IfRefactoring refactoring in IfRefactoring.Analyze(ifStatement, options, semanticModel, context.CancellationToken))
                    {
                        context.RegisterRefactoring(
                            refactoring.Title,
                            cancellationToken => refactoring.RefactorAsync(context.Document, cancellationToken));
                    }
                }

                if (context.IsRefactoringEnabled(RefactoringIdentifiers.SwapStatementsInIfElse))
                {
                    SwapStatementInIfElseRefactoring.ComputeRefactoring(context, ifStatement);
                }

                if (context.IsRefactoringEnabled(RefactoringIdentifiers.ReplaceIfElseWithSwitch))
                {
                    await ReplaceIfElseWithSwitchRefactoring.ComputeRefactoringAsync(context, ifStatement).ConfigureAwait(false);
                }
            }
        }
        public sealed override async Task RegisterCodeFixesAsync(CodeFixContext context)
        {
            SyntaxNode root = await context.GetSyntaxRootAsync().ConfigureAwait(false);

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

            if (ifStatement == null)
            {
                return;
            }

            ifStatement = IfElseChain.GetTopmostIf(ifStatement);

            CodeAction codeAction = CodeAction.Create(
                "Remove braces from if-else",
                cancellationToken => RemoveBracesFromIfElseElseRefactoring.RefactorAsync(context.Document, ifStatement, cancellationToken),
                DiagnosticIdentifiers.RemoveBracesFromIfElse + EquivalenceKeySuffix);

            context.RegisterCodeFix(codeAction, context.Diagnostics);
        }
Exemple #25
0
        private static IfStatementSyntax GetTopmostIf(StatementSyntax statement)
        {
            SyntaxNode parent = statement.Parent;

            if (parent != null)
            {
                if (parent.IsKind(SyntaxKind.ElseClause))
                {
                    return(IfElseChain.GetTopmostIf((ElseClauseSyntax)parent));
                }
                else
                {
                    var parentStatement = parent as IfStatementSyntax;

                    if (parentStatement != null)
                    {
                        return(IfElseChain.GetTopmostIf(parentStatement));
                    }
                }
            }

            return(null);
        }
Exemple #26
0
        private static IEnumerable <StatementSyntax> GetEmbeddedStatements(IfStatementSyntax topmostIf)
        {
            foreach (SyntaxNode node in IfElseChain.GetChain(topmostIf))
            {
                switch (node.Kind())
                {
                case SyntaxKind.IfStatement:
                {
                    var ifStatement = (IfStatementSyntax)node;

                    StatementSyntax statement = ifStatement.Statement;

                    if (statement?.IsKind(SyntaxKind.Block) == false)
                    {
                        yield return(statement);
                    }

                    break;
                }

                case SyntaxKind.ElseClause:
                {
                    var elseClause = (ElseClauseSyntax)node;

                    StatementSyntax statement = elseClause.Statement;

                    if (statement?.IsKind(SyntaxKind.Block) == false)
                    {
                        yield return(statement);
                    }

                    break;
                }
                }
            }
        }
Exemple #27
0
        private static StatementSyntax GetStatement(
            RefactoringContext context,
            BlockSyntax block,
            SyntaxNode parent)
        {
            switch (parent?.Kind())
            {
            case SyntaxKind.WhileStatement:
            case SyntaxKind.DoStatement:
            case SyntaxKind.ForStatement:
            case SyntaxKind.ForEachStatement:
            case SyntaxKind.FixedStatement:
            case SyntaxKind.CheckedStatement:
            case SyntaxKind.UncheckedStatement:
            case SyntaxKind.UnsafeStatement:
            case SyntaxKind.UsingStatement:
            case SyntaxKind.LockStatement:
            {
                if (block.OpenBraceToken.Span.Contains(context.Span) ||
                    block.CloseBraceToken.Span.Contains(context.Span))
                {
                    if (parent.IsKind(SyntaxKind.UsingStatement))
                    {
                        var usingStatement = (UsingStatementSyntax)parent;

                        while (usingStatement.IsParentKind(SyntaxKind.UsingStatement))
                        {
                            usingStatement = (UsingStatementSyntax)usingStatement.Parent;
                        }

                        return(usingStatement);
                    }

                    return((StatementSyntax)parent);
                }

                break;
            }

            case SyntaxKind.TryStatement:
            {
                var tryStatement = (TryStatementSyntax)parent;

                if (tryStatement.Block?.OpenBraceToken.Span.Contains(context.Span) == true)
                {
                    return((StatementSyntax)parent);
                }

                break;
            }

            case SyntaxKind.IfStatement:
            {
                var ifStatement = (IfStatementSyntax)parent;

                if (IfElseChain.IsTopmostIf(ifStatement) &&
                    block.OpenBraceToken.Span.Contains(context.Span))
                {
                    return(ifStatement);
                }

                if (ifStatement.Else == null &&
                    block.CloseBraceToken.Span.Contains(context.Span))
                {
                    return(ifStatement);
                }

                break;
            }

            case SyntaxKind.ElseClause:
            {
                var elseClause = (ElseClauseSyntax)parent;

                if (block.CloseBraceToken.Span.Contains(context.Span))
                {
                    return(IfElseChain.GetTopmostIf(elseClause));
                }

                break;
            }

            case SyntaxKind.CatchClause:
            {
                var catchClause = (CatchClauseSyntax)parent;

                if (catchClause.IsParentKind(SyntaxKind.TryStatement))
                {
                    var tryStatement = (TryStatementSyntax)catchClause.Parent;

                    if (tryStatement.Finally == null &&
                        catchClause.Block?.CloseBraceToken.Span.Contains(context.Span) == true)
                    {
                        return(tryStatement);
                    }
                }

                break;
            }

            case SyntaxKind.FinallyClause:
            {
                var finallyClause = (FinallyClauseSyntax)parent;

                if (finallyClause.IsParentKind(SyntaxKind.TryStatement))
                {
                    var tryStatement = (TryStatementSyntax)finallyClause.Parent;

                    if (finallyClause.Block?.CloseBraceToken.Span.Contains(context.Span) == true)
                    {
                        return(tryStatement);
                    }
                }

                break;
            }
            }

            return(null);
        }
        public static void ComputeRefactoring(RefactoringContext context, IfStatementSyntax ifStatement)
        {
            if (IfElseChain.IsTopmostIf(ifStatement))
            {
                ElseClauseSyntax elseClause = ifStatement.Else;

                if (elseClause != null)
                {
                    StatementSyntax statement1 = ReplaceIfWithStatementRefactoring.GetStatement(ifStatement);

                    if (statement1?.IsKind(SyntaxKind.ExpressionStatement) == true)
                    {
                        StatementSyntax statement2 = ReplaceIfWithStatementRefactoring.GetStatement(elseClause);

                        if (statement2?.IsKind(SyntaxKind.ExpressionStatement) == true)
                        {
                            var expressionStatement1 = (ExpressionStatementSyntax)statement1;
                            var expressionStatement2 = (ExpressionStatementSyntax)statement2;

                            ExpressionSyntax expression1 = expressionStatement1.Expression;

                            if (expression1?.IsKind(SyntaxKind.SimpleAssignmentExpression) == true)
                            {
                                ExpressionSyntax expression2 = expressionStatement2.Expression;

                                if (expression2?.IsKind(SyntaxKind.SimpleAssignmentExpression) == true)
                                {
                                    var assignment1 = (AssignmentExpressionSyntax)expression1;
                                    var assignment2 = (AssignmentExpressionSyntax)expression2;

                                    ExpressionSyntax left1  = assignment1.Left;
                                    ExpressionSyntax right1 = assignment1.Right;

                                    if (left1?.IsMissing == false &&
                                        right1?.IsMissing == false)
                                    {
                                        ExpressionSyntax left2  = assignment2.Left;
                                        ExpressionSyntax right2 = assignment2.Right;

                                        if (left2?.IsMissing == false &&
                                            right2?.IsMissing == false &&
                                            left1.IsEquivalentTo(left2, topLevel: false))
                                        {
                                            context.RegisterRefactoring(
                                                "Replace if-else with assignment",
                                                cancellationToken =>
                                            {
                                                return(RefactorAsync(
                                                           context.Document,
                                                           ifStatement,
                                                           left1,
                                                           right1,
                                                           right2,
                                                           cancellationToken));
                                            });
                                        }
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
        public static ImmutableArray <IfRefactoring> Analyze(
            IfStatementSyntax ifStatement,
            IfAnalysisOptions options,
            SemanticModel semanticModel,
            CancellationToken cancellationToken = default(CancellationToken))
        {
            if (IfElseChain.IsTopmostIf(ifStatement))
            {
                ExpressionSyntax condition = ifStatement.Condition;

                if (condition != null)
                {
                    ElseClauseSyntax elseClause = ifStatement.Else;

                    if (elseClause != null)
                    {
                        if (options.CheckSpanDirectives(ifStatement))
                        {
                            StatementSyntax statement1 = ifStatement.GetSingleStatementOrDefault();

                            if (statement1 != null)
                            {
                                SyntaxKind kind1 = statement1.Kind();

                                if (kind1 == SyntaxKind.ExpressionStatement ||
                                    kind1 == SyntaxKind.ReturnStatement ||
                                    kind1 == SyntaxKind.YieldReturnStatement)
                                {
                                    StatementSyntax statement2 = elseClause.GetSingleStatementOrDefault();

                                    if (statement2?.IsKind(kind1) == true)
                                    {
                                        switch (kind1)
                                        {
                                        case SyntaxKind.ExpressionStatement:
                                        {
                                            return(Analyze(ifStatement, condition, (ExpressionStatementSyntax)statement1, (ExpressionStatementSyntax)statement2, options));
                                        }

                                        case SyntaxKind.ReturnStatement:
                                        {
                                            return(Analyze(ifStatement, condition, ((ReturnStatementSyntax)statement1).Expression, ((ReturnStatementSyntax)statement2).Expression, semanticModel, cancellationToken, options, isYield: false));
                                        }

                                        case SyntaxKind.YieldReturnStatement:
                                        {
                                            return(Analyze(ifStatement, condition, ((YieldStatementSyntax)statement1).Expression, ((YieldStatementSyntax)statement2).Expression, semanticModel, cancellationToken, options, isYield: true));
                                        }
                                        }
                                    }
                                }
                            }
                        }
                    }
                    else
                    {
                        StatementSyntax nextStatement = ifStatement.NextStatement();

                        if (nextStatement?.IsKind(SyntaxKind.ReturnStatement) == true)
                        {
                            return(Analyze(ifStatement, (ReturnStatementSyntax)nextStatement, options, semanticModel, cancellationToken));
                        }
                    }
                }
            }

            return(ImmutableArray <IfRefactoring> .Empty);
        }
        public static void AnalyzeIfStatement(SyntaxNodeAnalysisContext context)
        {
            var ifStatement = (IfStatementSyntax)context.Node;

            if (!IfElseChain.IsPartOfChain(ifStatement))
            {
                ExpressionSyntax condition = ifStatement.Condition;

                if (condition?.IsKind(SyntaxKind.EqualsExpression) == true)
                {
                    var equalsExpression = (BinaryExpressionSyntax)condition;

                    ExpressionSyntax left = equalsExpression.Left;

                    if (left != null)
                    {
                        ExpressionSyntax right = equalsExpression.Right;

                        if (right?.IsKind(SyntaxKind.NullLiteralExpression) == true)
                        {
                            StatementSyntax blockOrStatement = ifStatement.Statement;

                            StatementSyntax childStatement = GetSingleStatementOrDefault(blockOrStatement);

                            if (childStatement?.IsKind(SyntaxKind.ExpressionStatement) == true)
                            {
                                var expressionStatement = (ExpressionStatementSyntax)childStatement;

                                ExpressionSyntax expression = expressionStatement.Expression;

                                if (expression?.IsKind(SyntaxKind.SimpleAssignmentExpression) == true)
                                {
                                    var assignment = (AssignmentExpressionSyntax)expression;

                                    if (assignment.Left?.IsEquivalentTo(left, topLevel: false) == true &&
                                        assignment.Right?.IsMissing == false &&
                                        !ifStatement.SpanContainsDirectives())
                                    {
                                        StatementSyntax statementToReport = ifStatement;

                                        SyntaxNode parent = ifStatement.Parent;

                                        SyntaxList <StatementSyntax> statements = GetStatements(parent);

                                        if (statements.Any())
                                        {
                                            int index = statements.IndexOf(ifStatement);

                                            if (index > 0)
                                            {
                                                StatementSyntax previousStatement = statements[index - 1];

                                                if (CanRefactor(previousStatement, ifStatement, left, parent))
                                                {
                                                    statementToReport = previousStatement;
                                                }
                                            }
                                        }

                                        context.ReportDiagnostic(DiagnosticDescriptors.UseCoalesceExpression, statementToReport);
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }