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)); }