Ejemplo n.º 1
0
            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);
            }
Ejemplo n.º 2
0
        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());
        }