Helper class for constructing pattern ASTs.
 public CheckNullVisitor(ParameterDeclaration parameter)
 {
     pattern = PatternHelper.CommutativeOperator(new IdentifierExpression(parameter.Name), BinaryOperatorType.Any, new NullReferenceExpression());
 }
        protected override CodeAction GetAction(RefactoringContext context, IfElseStatement node)
        {
            var match = ActionPattern.Match(node.Condition);

            if (!match.Success)
            {
                return(null);
            }

            var  conditionExpression  = match.Get <BinaryOperatorExpression>(expressionGroupName).Single();
            bool isEqualityComparison = conditionExpression.Operator == BinaryOperatorType.Equality;

            Expression comparedNode = match.Get <Expression>(comparedNodeGroupName).Single();

            Statement contentStatement;

            if (isEqualityComparison)
            {
                contentStatement = node.TrueStatement;
                if (!IsEmpty(node.FalseStatement))
                {
                    return(null);
                }
            }
            else
            {
                contentStatement = node.FalseStatement;
                if (!IsEmpty(node.TrueStatement))
                {
                    return(null);
                }
            }

            contentStatement = GetSimpleStatement(contentStatement);
            if (contentStatement == null)
            {
                return(null);
            }

            var leftExpressionPattern = PatternHelper.OptionalParentheses(comparedNode);
            var expressionPattern     = new AssignmentExpression(leftExpressionPattern, AssignmentOperatorType.Assign, new AnyNode(valueOnNullGroupName));
            var statementPattern      = new ExpressionStatement(PatternHelper.OptionalParentheses(expressionPattern));

            var statementMatch = statementPattern.Match(contentStatement);

            if (!statementMatch.Success)
            {
                return(null);
            }

            var rightSide = statementMatch.Get <Expression>(valueOnNullGroupName).Single();

            return(new CodeAction(context.TranslateString("Convert if statement to ?? expression"),
                                  script => {
                var previousNode = node.GetPrevSibling(sibling => sibling is Statement);

                var previousDeclaration = previousNode as VariableDeclarationStatement;
                if (previousDeclaration != null && previousDeclaration.Variables.Count() == 1)
                {
                    var variable = previousDeclaration.Variables.First();

                    var comparedNodeIdentifierExpression = comparedNode as IdentifierExpression;
                    if (comparedNodeIdentifierExpression != null &&
                        comparedNodeIdentifierExpression.Identifier == variable.Name)
                    {
                        script.Replace(variable.Initializer, new BinaryOperatorExpression(variable.Initializer.Clone(),
                                                                                          BinaryOperatorType.NullCoalescing,
                                                                                          rightSide.Clone()));
                        script.Remove(node);

                        return;
                    }
                }

                var previousExpressionStatement = previousNode as ExpressionStatement;
                if (previousExpressionStatement != null)
                {
                    var previousAssignment = previousExpressionStatement.Expression as AssignmentExpression;
                    if (previousAssignment != null &&
                        comparedNode.IsMatch(previousAssignment.Left))
                    {
                        var newExpression = new BinaryOperatorExpression(previousAssignment.Right.Clone(),
                                                                         BinaryOperatorType.NullCoalescing,
                                                                         rightSide.Clone());

                        script.Replace(previousAssignment.Right, newExpression);
                        script.Remove(node);
                        return;
                    }
                }

                var coalescedExpression = new BinaryOperatorExpression(comparedNode.Clone(),
                                                                       BinaryOperatorType.NullCoalescing,
                                                                       rightSide.Clone());

                var newAssignment = new ExpressionStatement(new AssignmentExpression(comparedNode.Clone(), coalescedExpression));
                script.Replace(node, newAssignment);
            }, node));
        }