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); }
/// <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); }
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);
internal override void GetArrays(ArraysExtractor arraysExtractor) { arraysExtractor.GetArrays(Value); }
internal override void GetArrays(ArraysExtractor arraysExtractor) { arraysExtractor.GetArrays(SourceArray); }