private void ReadField(ClassObject classObject, ClassField classField) { var varString = classField.SafeCamelCaseName; var ctorPair = classObject.CtorFields.FirstOrDefault(pair => pair.Field == classField); var inputField = $"input.GetProperty(\"{classField.CamelCaseName}\")"; if (ctorPair != null && ctorPair.CtorField.HasDefaultValue) { inputField = classField.CamelCaseName + "Json"; var startingValue = $"{CodeGeneratorUtils.WriteDefaultValue(this.TrimNameSpace(ctorPair.CtorField.Type.Name), ctorPair.CtorField.DefaultValue)}"; writer.WriteLine($"var {varString} = {startingValue};"); writer.WriteLine($"if (input.TryGetProperty(\"{classField.CamelCaseName}\", out var {inputField}))"); writer.WriteLine("{"); writer.Indent++; var valueString = ReadFieldType(inputField, classField.Name, classField.Type, 0); writer.WriteLine($"{varString} = {valueString};"); writer.Indent--; writer.WriteLine("}"); } else { var valueString = ReadFieldType(inputField, classField.Name, classField.Type, 0); if (varString != valueString) { writer.WriteLine($"var {varString} = {valueString};"); } } }
protected virtual void WriteFields(ClassObject classObject) { foreach (var field in classObject.Fields) { WriteField(field); } }
protected override void WriteFields(ClassObject classObject) { foreach (var field in classObject.Fields) { WriteField(field); } writer.WriteLine("output.WriteEndObject();"); }
protected override void WriteFields(ClassObject classObject) { writer.WriteLine("var result = new JSONObject();"); foreach (var field in classObject.Fields) { WriteField(field); } writer.WriteLine("return result;"); }
protected virtual void WriteClass(ClassObject classObject) { var generics = CodeGeneratorUtils.CreateGenericClassString(classObject.Generics); var constraints = CodeGeneratorUtils.CreateGenericConstraintsString(classObject.Generics); this.WriteClassObjectMethod(generics, constraints, classObject); writer.Indent++; WriteFields(classObject); writer.Indent--; writer.WriteLine("}"); }
public static void ReadFieldsToCtor(Manager manager, ClassObject classObject, IndentedTextWriter writer, ReadFieldHandler readFieldHandler) { foreach (var field in classObject.Fields) { readFieldHandler(field); } var ctorArgs = string.Join(", ", classObject.CtorFields.Select(f => f.Field.SafeCamelCaseName)); var generics = CodeGeneratorUtils.CreateGenericClassString(classObject.Generics); writer.WriteLine(); writer.WriteLine($"return new {classObject.FullName.TrimNameSpace(manager.NameSpace)}{generics}({ctorArgs});"); }
public void SaveToStream(ClassObject classObject, Stream output) { using (var streamWriter = new StreamWriter(output)) using (this.writer = new IndentedTextWriter(streamWriter)) { CodeGeneratorUtils.WriteOuterClass(manager, classObject.FullName, writer, this.FileSuffix, this.UsingImports, () => { WriteClass(classObject); writer.WriteLine(); ReadClass(classObject); }); } }
protected virtual void ReadClass(ClassObject classObject) { var readName = this.MakeReadValueMethod(classObject.FullName); var generics = CodeGeneratorUtils.CreateGenericClassString(classObject.Generics); var constraints = CodeGeneratorUtils.CreateGenericConstraintsString(classObject.Generics); writer.Write($"public static {this.TrimNameSpace(classObject.FullName)}{generics} {readName}{generics}({this.ReadObject} input)"); writer.WriteLine(constraints); writer.WriteLine("{"); writer.Indent++; this.ReadClassInner(classObject); writer.Indent--; writer.WriteLine("}"); }
public SubclassPair(ClassObject subclass, object typeDiscriminatorValue) { this.Subclass = subclass; this.TypeDiscriminatorValue = typeDiscriminatorValue; }
protected override void ReadClassInner(ClassObject classObject) { this.WriteReadFieldsToCtor(classObject, this.ReadField); }
protected virtual void WriteReadFieldsToCtor(ClassObject classObject, CodeGeneratorUtils.ReadFieldHandler readFieldHandler) { CodeGeneratorUtils.ReadFieldsToCtor(this.manager, classObject, this.writer, readFieldHandler); }
protected abstract void ReadClassInner(ClassObject classObject);
protected virtual void WriteClassObjectMethod(string generics, string constraints, ClassObject classObject) { writer.Write($"public static void Write{generics}({this.TrimNameSpace(classObject.FullName)}{generics} input, {this.WriteObject} output)"); writer.WriteLine(constraints); writer.WriteLine("{"); }
protected override void WriteClassObjectMethod(string generics, string constraints, ClassObject classObject) { writer.Write($"public static void Write{generics}({this.TrimNameSpace(classObject.FullName)}{generics} input, {this.WriteObject} output)"); writer.WriteLine(constraints); writer.WriteLine("{"); writer.Indent++; writer.WriteLine("Write(input, output, false);"); writer.Indent--; writer.WriteLine("}"); writer.WriteLine(); writer.Write($"public static void Write{generics}({this.TrimNameSpace(classObject.FullName)}{generics} input, {this.WriteObject} output, bool skipStartObject)"); writer.WriteLine(constraints); writer.WriteLine("{"); writer.Indent++; writer.WriteLine("if (!skipStartObject)"); writer.WriteLine("{"); writer.Indent++; writer.WriteLine("output.WriteStartObject();"); writer.Indent--; writer.WriteLine("}"); writer.Indent--; writer.WriteLine(); }
public void AddClass(ClassObject classObject) { Console.WriteLine($"Adding class: {classObject.FullName.Value}"); this.classMap[classObject.FullName] = classObject; }
public ClassObject CreateObjectFromType(Type type, ClassBaseObject baseObject = null) { var fields = new List <ClassField>(); foreach (var field in type.GetFields()) { // Static class fields should be properties as well. if (field.Attributes.HasFlag(FieldAttributes.Static)) { continue; } if (TryGetValidFieldType(field, out var fieldType)) { if (field.Name == null) { continue; } try { var ignore = field.GetCustomAttribute <NonSerializedAttribute>(true); if (ignore != null) { continue; } } catch (FileNotFoundException) { // Ignore type load exception } var classType = CreateTypeFromType(fieldType); fields.Add(new ClassField(field.Name, classType)); } } var ctors = type.GetConstructors(); var allCtorFields = new List <List <ClassField> >(); foreach (var ctor in ctors) { var ctorFields = new List <ClassField>(); allCtorFields.Add(ctorFields); foreach (var ctorField in ctor.GetParameters()) { if (TryGetValidParameterType(ctorField, out var fieldType)) { var classType = CreateTypeFromType(fieldType); ctorFields.Add(new ClassField(ctorField.Name, classType, ctorField.HasDefaultValue, ctorField.DefaultValue)); } } } var fieldToCtorPairs = ClassObject.FindCtor(fields, allCtorFields); var classGenerics = CreateGenericsFromType(type); return(new ClassObject(new ClassName(type.FullName), fields, fieldToCtorPairs, classGenerics, baseObject, isAbstract: type.IsAbstract, isInterface: type.IsInterface)); }
protected override void WriteClassObjectMethod(string generics, string constraints, ClassObject classObject) { writer.Write($"public static JSONObject Write{generics}({this.TrimNameSpace(classObject.FullName)}{generics} input)"); writer.WriteLine(constraints); writer.WriteLine("{"); }