예제 #1
0
파일: Main.cs 프로젝트: ThomasZitzler/ILSpy
		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;
		}
예제 #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(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;
 }