Esempio n. 1
0
    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);
    }
Esempio n. 2
0
 public StackElement(string name, HandlerFuture handler, ScriptTree.Node tree, ScriptTree.Succ prevSucc)
 {
     this.Name     = name;
     this.Handler  = handler;
     this.Node     = tree;
     this.PrevSucc = prevSucc;
 }
Esempio n. 3
0
    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);
    }
Esempio n. 4
0
    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);
    }
Esempio n. 5
0
 private void ConstructSingleEvents(Dictionary <string, EventPromise> eventMap, ScriptTree.Node node)
 {
     eventMap.Add(node.Name, GetSingleEvent(node));
 }