void ReplaceAllFunctionAssignments(BlockStatement block, string functionName, TypeReference typeReference) { ReturnStatementForFunctionAssignment visitor = new ReturnStatementForFunctionAssignment(functionName); block.AcceptVisitor(visitor, null); if (visitor.expressionsToReplace.Count == 1 && !visitor.hasExit && IsAssignmentTo(block.Children.Last(), functionName)) { Expression returnValue = GetAssignmentFromStatement(block.Children.Last()).Right; block.Children.RemoveAt(block.Children.Count - 1); block.Return(returnValue); } else { if (visitor.expressionsToReplace.Count > 0) { foreach (var expr in visitor.expressionsToReplace) { expr.Identifier = FunctionReturnValueName; } Expression init; init = ExpressionBuilder.CreateDefaultValueForType(typeReference); block.Children.Insert(0, new LocalVariableDeclaration(new VariableDeclaration(FunctionReturnValueName, init, typeReference))); block.Children[0].Parent = block; block.Return(new IdentifierExpression(FunctionReturnValueName)); } } }
private bool HasReferencesInSelection(ISelection selection, Variable variable) { FindReferenceVisitor frv = new FindReferenceVisitor(CSharpNameComparer, variable.Name, selection.StartPosition, selection.EndPosition); var statement = new BlockStatement(); statement.Children = selection.Nodes; statement.AcceptVisitor(frv, null); return frv.Identifiers.Count > 0; }