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); }
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); }