Example #1
0
        static bool AddVisitCode(EasyMethod m, FieldInfo field, CodeExpression var, List <CodeStatement> assertions, bool transformer)
        {
            CodeExpression prop      = var.Property(GetPropertyName(field.Name));
            CodeExpression nodeStack = Easy.Var("nodeStack");

            if (field.FieldType.FullName.StartsWith("System.Collections.Generic.List"))
            {
                Type elType = field.FieldType.GetGenericArguments()[0];
                if (!typeof(INode).IsAssignableFrom(elType))
                {
                    return(false);
                }
                assertions.Add(IfNullSetFailure(prop));
                string code;
                string propertyName = GetCode(prop);
                if (transformer)
                {
                    code = CreateTransformerLoop(propertyName, ConvertType(elType).BaseType);
                }
                else
                {
                    code =
                        "\t\t\tif (" + propertyName + ".Count == data." + GetPropertyName(field.Name) + ".Count) {\n" +
                        "\t\t\tfor (int i=0; i<" + propertyName + ".Count;i++) {\n" +
                        "\t\t\t\t" + ConvertType(elType).BaseType + " o = " + propertyName + "[i];\n" +
                        "\t\t\t\tif(o == null){return SetFailure();}\n" + "\t\t\t\tif((bool)o.AcceptVisitor(this, data." + GetPropertyName(field.Name) + "[i]) == false) return SetFailure();\n" +
                        "\t\t\t}" +
                        "\t\t\t}" +
                        "\t\t\telse { return SetFailure(); }";
                }
                m.Statements.Add(new CodeSnippetStatement(code));
                return(true);
            }
            if (!typeof(INode).IsAssignableFrom(field.FieldType))
            {
                return(false);
            }
            assertions.Add(IfNullSetFailure(prop));
            if (transformer)
            {
                m.Statements.Add(nodeStack.InvokeMethod("Push", prop));
            }
            m.Statements.Add(prop.InvokeMethod("AcceptVisitor",
                                               Easy.This,
                                               Easy.Var("data." + var.Property(GetPropertyName(field.Name)).PropertyName)));
            if (transformer)
            {
                m.Body.Assign(prop, nodeStack.InvokeMethod("Pop").CastTo(ConvertType(field.FieldType)));
            }
            return(true);
        }
Example #2
0
        static bool AddVisitCode(EasyMethod m, FieldInfo field, CodeExpression var, List <CodeStatement> assertions, bool transformer)
        {
            CodeExpression prop      = var.Property(GetPropertyName(field.Name));
            CodeExpression nodeStack = Easy.Var("nodeStack");

            if (field.FieldType.FullName.StartsWith("System.Collections.Generic.List"))
            {
                Type elType = field.FieldType.GetGenericArguments()[0];
                if (!typeof(INode).IsAssignableFrom(elType))
                {
                    return(false);
                }
                assertions.Add(AssertIsNotNull(prop));
                string code;
                if (transformer)
                {
                    code = CreateTransformerLoop(GetCode(prop), ConvertType(elType).BaseType);
                }
                else
                {
                    code =
                        "\t\t\tforeach (" + ConvertType(elType).BaseType + " o in " + GetCode(prop) + ") {\n" +
                        "\t\t\t\tDebug.Assert(o != null);\n" +
                        "\t\t\t\to.AcceptVisitor(this, data);\n" +
                        "\t\t\t}";
                }
                m.Statements.Add(new CodeSnippetStatement(code));
                return(true);
            }
            if (!typeof(INode).IsAssignableFrom(field.FieldType))
            {
                return(false);
            }
            assertions.Add(AssertIsNotNull(prop));
            if (transformer)
            {
                m.Statements.Add(nodeStack.InvokeMethod("Push", prop));
            }
            m.Statements.Add(prop.InvokeMethod("AcceptVisitor",
                                               Easy.This,
                                               Easy.Var("data")));
            if (transformer)
            {
                m.Body.Assign(prop, nodeStack.InvokeMethod("Pop").CastTo(ConvertType(field.FieldType)));
            }
            return(true);
        }