protected static bool TestOnlyAssigned(BaseRefactoringContext ctx, AstNode rootNode, IVariable variable) { var assignment = false; var nonAssignment = false; foreach (var result in ctx.FindReferences(rootNode, variable)) { var node = result.Node; if (node is ParameterDeclaration) { continue; } if (node is VariableInitializer) { if (!(node as VariableInitializer).Initializer.IsNull) { assignment = true; } continue; } if (node is IdentifierExpression) { var parent = node.Parent; if (parent is AssignmentExpression) { if (((AssignmentExpression)parent).Left == node) { assignment = true; continue; } } else if (parent is UnaryOperatorExpression) { var op = ((UnaryOperatorExpression)parent).Operator; switch (op) { case UnaryOperatorType.Increment: case UnaryOperatorType.PostIncrement: case UnaryOperatorType.Decrement: case UnaryOperatorType.PostDecrement: assignment = true; if (!(parent.Parent is ExpressionStatement)) { nonAssignment = true; } continue; } } else if (parent is DirectionExpression) { if (((DirectionExpression)parent).FieldDirection == FieldDirection.Out) { assignment = true; // Using dummy variables is necessary for ignoring // out-arguments, so we don't want to warn for those. nonAssignment = true; continue; } } } nonAssignment = true; } return(assignment && !nonAssignment); }