private HandlerFuture GetSingleHandler(ScriptTree.Node node) { Debug.Assert(!node.Base.Contains("Event")); HandlerFuture handler = null; if (node.Members == null) { Type t = Type.GetType("Assets.Core.Handler." + node.Base); handler = Activator.CreateInstance(t, new Params(node.Params)) as HandlerFuture; } else { var start = node.Members.Find(m => m.Name == node.StartMember); handler = GetSingleHandler(start); var curr = start; while (curr.Name != node.EndMember) { Debug.Assert(curr.Succ != null && curr.Succ.Count == 1 && curr.Succ[0].Condition.Count == 0); var nextTree = node.Members.Find(m => m.Name == curr.Succ[0].Dest); var next = GetSingleHandler(nextTree); handler.GroupAfter((_) => next); curr = nextTree; } } return(handler); }
public StackElement(string name, HandlerFuture handler, ScriptTree.Node tree, ScriptTree.Succ prevSucc) { this.Name = name; this.Handler = handler; this.Node = tree; this.PrevSucc = prevSucc; }
private EventPromise GetSingleEvent(ScriptTree.Node node) { Debug.Assert(node.Base.Contains("Event")); Type t = Type.GetType("Assets.Core.Event." + node.Base); var evt = Activator.CreateInstance(t, new Params(node.Params)) as EventPromise; return(evt); }
private HandlerFuture ConstructHandler(List <StackElement> stack, Dictionary <string, HandlerFuture> handlerMap, Dictionary <string, EventPromise> eventMap, List <ScriptTree.Node> nodes, ScriptTree.Node startNode) { var currHandler = GetSingleHandler(startNode); stack.Add(new StackElement(startNode.Name, currHandler, startNode, null)); StackElement lastPopped = null; List <CycleElement> cycleList = new List <CycleElement>(); if (handlerMap.ContainsKey(startNode.Name)) { return(handlerMap[startNode.Name]); } while (stack.Count > 0) { if (stack.Last().Node.Succ != null) { var succ = stack.Last().Node.Succ.Where(s => !handlerMap.ContainsKey(s.Dest) && !cycleList.Any(c => c.Succ == s)).FirstOrDefault(); if (succ != null) { var nextNode = nodes.Find(n => n.Name == succ.Dest); if (stack.Exists(e => e.Name == succ.Dest)) //non-checked cylce { var cyclePoints = stack.FindAll(e => e.Name == succ.Dest); foreach (var p in cyclePoints) { cycleList.Add(new CycleElement(stack.Last().Handler, succ, p.Handler)); } continue; } else { stack.Add(new StackElement(succ.Dest, GetSingleHandler(nextNode), nextNode, succ)); continue; } } } lastPopped = stack.Last(); stack = stack.Take(stack.Count - 1).ToList(); if (stack.Count != 0) { Debug.Log("Applying Succ " + stack.Last().Name + " -> " + lastPopped.Name); ApplySucc(eventMap, stack.Last().Handler, lastPopped.PrevSucc, lastPopped.Handler); } handlerMap.Add(lastPopped.Name, lastPopped.Handler); } foreach (var cycle in cycleList) { ApplySucc(eventMap, cycle.A, cycle.Succ, cycle.B); } return(lastPopped.Handler); }
private void ConstructSingleEvents(Dictionary <string, EventPromise> eventMap, ScriptTree.Node node) { eventMap.Add(node.Name, GetSingleEvent(node)); }