Example #1
0
        private void fixThings(List<PostParseExpression> item2, AssureSplitStacks assurer, int index = -1)
        {
            for (index = index == -1 ? item2.Count - 1 : index; index >= 0; index--)
            {
                PostParseExpression postParseExpression = item2[index];
                switch (postParseExpression.ExpressionType)
                {
                    case PPExpressionType.Statement:
                        var st = ((PostParseStatement)postParseExpression);
                        foreach (var a in st.Items)
                            tryToNeeds(a, false, assurer);
                        break;
                    case PPExpressionType.Set:

                        if (((PostParseSet)postParseExpression).Left is PostParseVariable)
                        {
                            var pps = (PostParseVariable)((PostParseSet)postParseExpression).Left;

                            if (pps.Type == VariableType.Stack)
                            {
                                tryToNeeds(((PostParseSet)postParseExpression).Left, true, assurer);
                            }
                        }

                        tryToNeeds(((PostParseSet)postParseExpression).Right, false, assurer);

                        break;
                    case PPExpressionType.String:

                        if (((PostParseString)postParseExpression).GotoString != null)
                        {
                            return;
                        }
                        else if (((PostParseString)postParseExpression).LabelString != null)
                        {
                            var split = assurer.GetSplit();
                            var k = new Dictionary<int, Tuple<int, List<PostParseVariable>>>(split.Needs);
                            foreach (var i in findGoto(item2, ((PostParseString)postParseExpression).LabelString))
                            {
                                fixThings(item2, split, i - 1);
                                split.Needs = new Dictionary<int, Tuple<int, List<PostParseVariable>>>(k);
                            }
                            fixThings(item2, split, index - 1);
                            return;
                        }
                        else
                        {

                        }

                        break;
                    case PPExpressionType.Method:
                        var wst = ((PostParseMethod)postParseExpression);
                        foreach (var a in wst.Params)
                            tryToNeeds(a, false, assurer);
                        break;
                    default:
                        throw new ArgumentOutOfRangeException();
                }
            }
        }