/// <summary> /// Produces a list of all GroupAggregateVarInfos, each of which represents a single group aggregate /// and it candidate function aggregates. It also produces a delegate that given a child node returns the parent node /// </summary> /// <param name="itree"></param> /// <param name="tryGetParent"></param> /// <returns></returns> internal static IEnumerable<GroupAggregateVarInfo> Process(Command itree, out TryGetValue tryGetParent) { var groupRefComputingVisitor = new GroupAggregateRefComputingVisitor(itree); groupRefComputingVisitor.VisitNode(itree.Root); tryGetParent = groupRefComputingVisitor._childToParent.TryGetValue; return groupRefComputingVisitor._groupAggregateVarInfoManager.GroupAggregateVarInfos; }
/// <summary> /// Produces a list of all GroupAggregateVarInfos, each of which represents a single group aggregate /// and it candidate function aggregates. It also produces a delegate that given a child node returns the parent node /// </summary> /// <param name="itree"></param> /// <param name="tryGetParent"></param> /// <returns></returns> internal static IEnumerable <GroupAggregateVarInfo> Process(Command itree, out TryGetValue tryGetParent) { GroupAggregateRefComputingVisitor groupRefComputingVisitor = new GroupAggregateRefComputingVisitor(itree); groupRefComputingVisitor.VisitNode(itree.Root); tryGetParent = groupRefComputingVisitor._childToParent.TryGetValue; return(groupRefComputingVisitor._groupAggregateVarInfoManager.GroupAggregateVarInfos); }
/// <summary> /// The main driver /// </summary> private void Process() { IEnumerable <GroupAggregateVarInfo> groupAggregateVarInfos = GroupAggregateRefComputingVisitor.Process(m_command, out m_tryGetParent); foreach (GroupAggregateVarInfo groupAggregateVarInfo in groupAggregateVarInfos) { if (groupAggregateVarInfo.HasCandidateAggregateNodes) { foreach (KeyValuePair <Node, Node> candidate in groupAggregateVarInfo.CandidateAggregateNodes) { TryProcessCandidate(candidate, groupAggregateVarInfo); } } } }