private static IEnumerable <Expression> GetArrays(Type rootType, Expression path, IEnumerable <MutatorConfiguration> mutators)
        {
            var arrays          = new List <Dictionary <Type, List <Expression> > >();
            var arraysExtractor = new ArraysExtractor(arrays);

            arraysExtractor.GetArrays(path);
            foreach (var mutator in mutators)
            {
                mutator.GetArrays(arraysExtractor);
            }
            var result = new List <Expression>();

            for (var i = 1; i < arrays.Count; ++i)
            {
                var dict = arrays[i];
                if (dict.Count > 1)
                {
                    throw new InvalidOperationException("Too many root types");
                }
                if (!dict.TryGetValue(rootType, out var list))
                {
                    throw new InvalidOperationException("Invalid root type");
                }
                var arraysOfCurrentLevel = list.GroupBy(exp => new ExpressionWrapper(exp.ReplaceCurrentWithEach(), false)).Select(grouping => grouping.First()).ToArray();
                if (arraysOfCurrentLevel.Length > 1)
                {
                    throw new NotSupportedException("Iteration over more than one array is not supported");
                }
                result.Add(arraysOfCurrentLevel[0]);
            }

            return(result);
        }
예제 #2
0
        /// <summary>
        ///     Runs <see cref="ArraysExtractor" /> for all mutators in all nodes in the sub-tree and
        ///     saves to <paramref name="arrays" /> all expressions with level (count of Each() and Current() calls)
        ///     matching the level of <paramref name="path" />.
        /// </summary>
        private static void GetArrays(this ModelConfigurationNode node, Expression path, Dictionary <Type, List <Expression> > arrays)
        {
            if (node.Mutators != null && node.Mutators.Count > 0)
            {
                var shards = path.SmashToSmithereens();
                var level  = 1;
                foreach (var shard in shards)
                {
                    if (shard.NodeType == ExpressionType.Call && ((MethodCallExpression)shard).Method.IsEachMethod())
                    {
                        ++level;
                    }
                }

                var list            = new List <Dictionary <Type, List <Expression> > >();
                var arraysExtractor = new ArraysExtractor(list);

                foreach (var mutator in node.Mutators)
                {
                    mutator.Value.GetArrays(arraysExtractor);
                }

                if (list.Count > level)
                {
                    var dict = list[level];
                    foreach (var pair in dict)
                    {
                        List <Expression> lizd;
                        if (!arrays.TryGetValue(pair.Key, out lizd))
                        {
                            arrays.Add(pair.Key, lizd = new List <Expression>());
                        }
                        lizd.AddRange(pair.Value);
                    }
                }
            }

            foreach (var child in node.children.Values)
            {
                child.GetArrays(path, arrays);
            }
        }
 public override void GetArrays(ArraysExtractor arraysExtractor)
 {
     arraysExtractor.GetArrays(SourceArray);
 }
 internal override void GetArrays(ArraysExtractor arraysExtractor)
 {
     arraysExtractor.GetArrays(Condition);
     arraysExtractor.GetArrays(Path);
     arraysExtractor.GetArrays(Message);
 }
예제 #5
0
 public override void GetArrays(ArraysExtractor arraysExtractor)
 {
     arraysExtractor.GetArrays(Condition);
 }
 internal override void GetArrays(ArraysExtractor arraysExtractor)
 {
     arraysExtractor.GetArrays(Condition);
 }
 public override void GetArrays(ArraysExtractor arraysExtractor)
 {
     arraysExtractor.GetArrays(Condition);
     arraysExtractor.GetArrays(validatorFromRoot);
 }
 public override void GetArrays(ArraysExtractor arraysExtractor)
 {
     arraysExtractor.GetArrays(Value);
 }
 public abstract void GetArrays(ArraysExtractor arraysExtractor);
 internal abstract void GetArrays(ArraysExtractor arraysExtractor);
예제 #11
0
 internal override void GetArrays(ArraysExtractor arraysExtractor)
 {
     arraysExtractor.GetArrays(Value);
 }
 internal override void GetArrays(ArraysExtractor arraysExtractor)
 {
     arraysExtractor.GetArrays(SourceArray);
 }