示例#1
0
        public override CodeExpression GetReaderExpression(CodeExpression reader)
        {
            CodeExpression refExpr;

            if (_magicParser)
            {
                List <CodeExpression> args = new List <CodeExpression>();

                args.Add(reader);

                foreach (SequenceChoice choice in _choices)
                {
                    if (choice.SequenceType != null)
                    {
                        args.Add(CodeGen.GetTypeOf(new CodeTypeReference(choice.SequenceType.Name)));
                    }
                }

                if (DefaultType != null)
                {
                    args.Add(CodeGen.GetTypeOf(new CodeTypeReference(DefaultType.Name)));
                }

                return(CodeGen.CallMethod(CodeGen.GetThis(), "RSC", args.ToArray()));
            }
            else
            {
                if (_reference.IsValid())
                {
                    refExpr = CodeGen.GetField(CodeGen.GetThis(), _reference.GetNames());
                }
                else
                {
                    refExpr = CodeGen.GetPrimitive(null);
                }

                List <CodeExpression> args = new List <CodeExpression>();

                args.Add(reader);
                args.Add(refExpr);

                foreach (SequenceChoice choice in _choices)
                {
                    if ((choice.BooleanExpression.IsValid) && (choice.SequenceType != null))
                    {
                        args.Add(CodeGen.GetPrimitive(choice.BooleanExpression.Expression));
                        args.Add(CodeGen.GetTypeOf(new CodeTypeReference(choice.SequenceType.Name)));
                    }
                }

                if (DefaultType != null)
                {
                    args.Add(CodeGen.GetPrimitive("true"));
                    args.Add(CodeGen.GetTypeOf(new CodeTypeReference(DefaultType.Name)));
                }

                return(CodeGen.CallMethod(CodeGen.GetThis(), "RSC", args.ToArray()));
            }
        }