public void ReplaceCurrentWithEach() { var replacer = new MethodReplacer(MutatorsHelperFunctions.CurrentMethod, MutatorsHelperFunctions.EachMethod); for (var i = 0; i < AdditionalDependencies.Count; ++i) { AdditionalDependencies[i] = (LambdaExpression)replacer.Visit(AdditionalDependencies[i]); } Prefix = replacer.Visit(Prefix); }
public LambdaExpression[] Extract(out LambdaExpression[] primaryDependencies, out LambdaExpression[] additionalDependencies) { var bodyWithoutCurrent = new MethodReplacer(MutatorsHelperFunctions.CurrentMethod, DependenciesExtractorHelper.ExternalCurrentMethod).Visit(lambda.Body); var bodyWithoutEach = new MethodReplacer(MutatorsHelperFunctions.EachMethod, DependenciesExtractorHelper.ExternalCurrentMethod).Visit(bodyWithoutCurrent); var body = Visit(bodyWithoutEach); var replacer = new MethodReplacer(DependenciesExtractorHelper.ExternalCurrentMethod, MutatorsHelperFunctions.CurrentMethod); if (body == null) { primaryDependencies = new LambdaExpression[0]; } else { var primaryDependenciez = new List <LambdaExpression>(); foreach (var dependency in ((NewArrayExpression)body).Expressions.Select(ClearConverts)) { if ((dependency is NewExpression)) { primaryDependenciez.Add(MakeLambda(dependency)); } else { var root = dependency.SmashToSmithereens()[0]; if (root.NodeType == ExpressionType.Parameter && parameters.Contains((ParameterExpression)root)) { primaryDependenciez.Add(MakeLambda(dependency)); } } } primaryDependencies = primaryDependenciez.Select(replacer.Visit).Cast <LambdaExpression>() .GroupBy(exp => ExpressionCompiler.DebugViewGetter(exp)).Select(grouping => grouping.First()).ToArray(); } additionalDependencies = dependencies.Select(dependency => Expression.Lambda(ClearConverts(dependency.Body), dependency.Parameters)).Where(dependency => { var root = dependency.Body.SmashToSmithereens()[0]; return(root.NodeType == ExpressionType.Parameter && parameters.Contains((ParameterExpression)root)); }).Select(replacer.Visit).Cast <LambdaExpression>().GroupBy(exp => ExpressionCompiler.DebugViewGetter(exp)).Select(grouping => grouping.First()).ToArray(); var result = new List <LambdaExpression>(additionalDependencies); foreach (var primaryDependency in primaryDependencies) { Extract(primaryDependency.Body, result); } return(result.GroupBy(exp => ExpressionCompiler.DebugViewGetter(exp)).Select(grouping => grouping.First()).ToArray()); }