Пример #1
0
            public override void VisitIfElseStatement(IfElseStatement ifElseStatement)
            {
                base.VisitIfElseStatement(ifElseStatement);
                Expression rightSide;
                var        leftSide = ConvertIfStatementToNullCoalescingExpressionAction.CheckNode(ifElseStatement, out rightSide);

                if (leftSide == null)
                {
                    return;
                }
                if (ConvertIfStatementToConditionalTernaryExpressionIssue.IsComplexExpression(leftSide) ||
                    ConvertIfStatementToConditionalTernaryExpressionIssue.IsComplexExpression(rightSide))
                {
                    return;
                }
                var previousNode = ifElseStatement.GetPrevSibling(sibling => sibling is Statement) as VariableDeclarationStatement;

                if (previousNode == null || ConvertIfStatementToConditionalTernaryExpressionIssue.IsComplexExpression(previousNode))
                {
                    return;
                }

                AddIssue(
                    ifElseStatement.IfToken,
                    ctx.TranslateString("Convert to '??' expresssion"));
            }
            public override void VisitIfElseStatement(IfElseStatement ifElseStatement)
            {
                base.VisitIfElseStatement(ifElseStatement);

                var match = ifPattern.Match(ifElseStatement);

                if (match.Success)
                {
                    var varDeclaration = ifElseStatement.GetPrevSibling(s => s.Role == BlockStatement.StatementRole) as VariableDeclarationStatement;
                    var target         = match.Get <Expression>("target").Single();
                    var match2         = varDelarationPattern.Match(varDeclaration);
                    if (match2.Success)
                    {
                        if (varDeclaration == null || target == null)
                        {
                            return;
                        }
                        var initializer = varDeclaration.Variables.FirstOrDefault();
                        if (initializer == null || !(target is IdentifierExpression) || ((IdentifierExpression)target).Identifier != initializer.Name)
                        {
                            return;
                        }
                        var expr = match.Get <Expression>("condition").Single();
                        AddIssue(new CodeIssue(
                                     ifElseStatement.IfToken,
                                     ctx.TranslateString("Convert to '||' expresssion"),
                                     ctx.TranslateString("Replace with '||'"),
                                     script => {
                            var variable = varDeclaration.Variables.First();
                            script.Replace(
                                varDeclaration,
                                new VariableDeclarationStatement(
                                    varDeclaration.Type.Clone(),
                                    variable.Name,
                                    new BinaryOperatorExpression(variable.Initializer.Clone(), BinaryOperatorType.ConditionalOr, expr.Clone())
                                    )
                                );
                            script.Remove(ifElseStatement);
                        }
                                     )
                        {
                            IssueMarker = IssueMarker.DottedLine
                        });
                        return;
                    }
                    else
                    {
                        var expr = match.Get <Expression>("condition").Single();
                        AddIssue(new CodeIssue(
                                     ifElseStatement.IfToken,
                                     ctx.TranslateString("Convert to '|=' expresssion"),
                                     ctx.TranslateString("Replace with '|='"),
                                     script => {
                            script.Replace(
                                ifElseStatement,
                                new ExpressionStatement(
                                    new AssignmentExpression(
                                        target.Clone(),
                                        AssignmentOperatorType.BitwiseOr,
                                        expr.Clone())
                                    )
                                );
                        }
                                     ));
                    }
                }
            }
Пример #3
0
            public override void VisitIfElseStatement(IfElseStatement ifElseStatement)
            {
                base.VisitIfElseStatement(ifElseStatement);

                var match = ifPattern.Match(ifElseStatement);

                if (match.Success)
                {
                    var varDeclaration = ifElseStatement.GetPrevSibling(s => s.Role == BlockStatement.StatementRole) as VariableDeclarationStatement;
                    var target         = match.Get <Expression>("target").Single();
                    var match2         = varDelarationPattern.Match(varDeclaration);
                    if (match2.Success)
                    {
                        var initializer = varDeclaration.Variables.FirstOrDefault();
                        if (initializer != null && target is IdentifierExpression && ((IdentifierExpression)target).Identifier != initializer.Name)
                        {
                            return;
                        }
                        var expr = match.Get <Expression>("condition").Single();
                        AddIssue(new CodeIssue(
                                     ifElseStatement.IfToken,
                                     ctx.TranslateString("Convert to '&&' expresssion"),
                                     ctx.TranslateString("Replace with '&&'"),
                                     script => {
                            var variable             = initializer;
                            var initalizerExpression = variable.Initializer.Clone();
                            var bOp = initalizerExpression as BinaryOperatorExpression;
                            if (bOp != null && bOp.Operator == BinaryOperatorType.ConditionalOr)
                            {
                                initalizerExpression = new ParenthesizedExpression(initalizerExpression);
                            }
                            script.Replace(
                                varDeclaration,
                                new VariableDeclarationStatement(
                                    varDeclaration.Type.Clone(),
                                    variable.Name,
                                    new BinaryOperatorExpression(initalizerExpression, BinaryOperatorType.ConditionalAnd, CSharpUtil.InvertCondition(expr))
                                    )
                                );
                            script.Remove(ifElseStatement);
                        }
                                     )
                        {
                            IssueMarker = IssueMarker.DottedLine
                        });
                        return;
                    }
                    else
                    {
                        var expr = match.Get <Expression>("condition").Single();
                        AddIssue(new CodeIssue(
                                     ifElseStatement.IfToken,
                                     ctx.TranslateString("Convert to '&=' expresssion"),
                                     ctx.TranslateString("Replace with '&='"),
                                     script =>
                                     script.Replace(
                                         ifElseStatement,
                                         new ExpressionStatement(
                                             new AssignmentExpression(
                                                 target.Clone(),
                                                 AssignmentOperatorType.BitwiseAnd,
                                                 CSharpUtil.InvertCondition(expr)
                                                 )
                                             )
                                         )
                                     )
                        {
                            IssueMarker = IssueMarker.DottedLine
                        });
                    }
                }
            }