private void GenerateType(TypeDeclaration declaration) { int index = 1; WriteLine(); if (declaration.Doc != null) { WriteDoc(declaration.Doc); } if (declaration.IsCompact) { WriteLine(Resources.CompactLayout); } WriteLine(Resources.Serializable); if (declaration.InitMemory != null) { WriteLine(string.Format(Resources.InitialMemorySize, declaration.InitMemory.Value)); } if (!declaration.IsRuntime) { WriteLine(string.Format(Resources.SerializeBy, declaration.Name)); } if (declaration.IsInternal) { Write(Resources.Internal); } else { Write(Resources.Public); } if (declaration.IsFinal && declaration.IsRef) { Write(Resources.Sealed, false); } if (declaration.IsRef) { Write(Resources.Class, false); } else { Write(Resources.Struct, false); } WriteLine(declaration.Name, false); using (new Block(this)) { foreach (Declaration d in declaration.Declarations) { switch (d) { case FieldDeclaration field: WriteField(field, ref index); break; case TypeDeclaration type: GenerateType(type); break; } } if (declaration.Before != null) { WriteMessage(declaration.Before, false); } if (declaration.After != null) { WriteMessage(declaration.After, true); } if (declaration.IsRef) { WriteLine(); Write(Resources.Public); WriteLine(string.Format(Resources.DefaultCtor, declaration.Name), false); } } if (!declaration.IsRuntime) { GenerateSerializer(declaration); } }
private void GenerateSerializer(TypeDeclaration declaration) { WriteLine(); WriteLine(string.Format(Resources.SerializerType, declaration.Name, declaration.Name)); using (new Block(this)) { WriteLine(string.Format(Resources.SerializeMethod, declaration.Name)); using (new Block(this)) { int index = 1; if (declaration.Before != null) { WriteLine(Resources.BeforeMethod); } foreach (Declaration d in declaration.Declarations) { if (d is FieldDeclaration field) { Block block = null; if (field.IsCheckref) { WriteLine(string.Format(Resources.WriteValueCheckRef, field.Name)); block = new Block(this); } switch (field.Type) { case "sbyte": case "byte": case "short": case "ushort": case "int": case "uint": case "long": case "ulong": if (declaration.IsCompact) { WriteLine(string.Format(Resources.WriteValueIntCompact, field.Name, field.IsFixed ? Resources.NumberFormat_Fixed : Resources.NumberFormat_Variant)); } else { WriteLine(string.Format(Resources.WriteValueInt, index++, field.Name, field.IsFixed ? Resources.NumberFormat_Fixed : Resources.NumberFormat_Variant)); } break; case "float": case "double": case "decimal": case "bool": if (declaration.IsCompact) { WriteLine(string.Format(Resources.WriteValueFloatBoolCompact, field.Name)); } else { WriteLine(string.Format(Resources.WriteValueFloatBool, index++, field.Name)); } break; case "char": case "string": if (declaration.IsCompact) { if (field.IsUnicode) { WriteLine(string.Format(Resources.WriteValueStringUnicodeCompact, field.Name)); } else if (field.IsASCII) { WriteLine(string.Format(Resources.WriteValueStringASCIICompact, field.Name)); } else { WriteLine(string.Format(Resources.WriteValueStringUTF8Compact, field.Name)); } } else { if (field.IsUnicode) { WriteLine(string.Format(Resources.WriteValueStringUnicode, index++, field.Name)); } else if (field.IsASCII) { WriteLine(string.Format(Resources.WriteValueStringASCII, index++, field.Name)); } else { WriteLine(string.Format(Resources.WriteValueStringUTF8, index++, field.Name)); } } break; default: if (declaration.IsCompact) { WriteLine(string.Format(Resources.WriteValueComplexCompact, field.Type, field.Name)); } else { WriteLine(string.Format(Resources.WriteValueComplex, field.Type, index++, field.Name)); } break; } block?.Dispose(); } } } WriteLine(string.Format(Resources.DeserializeMethod, declaration.Name)); using (new Block(this)) { WriteLine(string.Format(Resources.New, declaration.Name, declaration.Name)); WriteLine(Resources.DefIndex); if (declaration.IsCompact) { WriteLine(Resources.WhileCompact); } else { WriteLine(Resources.While); } int index = declaration.IsCompact ? 0 : 1; using (new Block(this)) { WriteLine(Resources.Switch); using (new Block(this)) { foreach (Declaration d in declaration.Declarations) { if (d is FieldDeclaration field) { WriteLine(string.Format(Resources.Case, index++)); string type = GetTypeName(field.Type); m_Depth++; if (declaration.IsCompact) { if (type == string.Empty) { WriteLine(string.Format(Resources.NextAsComplexCompact, field.Name, field.Type)); } else { switch (field.Type) { case "sbyte": case "byte": case "short": case "ushort": case "int": case "uint": case "long": case "ulong": WriteLine(string.Format(Resources.NextAsIntCompact, field.Name, type, field.IsFixed ? Resources.NumberFormat_Fixed : Resources.NumberFormat_Variant)); break; case "float": case "double": case "decimal": case "bool": WriteLine(string.Format(Resources.NextAsCompact, field.Name, type)); break; case "char": case "string": if (field.IsUnicode) { WriteLine(string.Format(Resources.NextAsCharStringUnicodeCompact, field.Name, type)); } else if (field.IsASCII) { WriteLine(string.Format(Resources.NextAsCharStringASCIICompact, field.Name, type)); } else { WriteLine(string.Format(Resources.NextAsCharStringUTF8Compact, field.Name, type)); } break; } } } else { if (type == string.Empty) { WriteLine(string.Format(Resources.NextAsComplex, field.Name, field.Type)); } else { WriteLine(string.Format(Resources.NextAs, field.Name, type)); } } WriteLine(Resources.Break); m_Depth--; } } WriteLine(Resources.Defeault); m_Depth++; if (declaration.IsCompact) { if (declaration.After != null) { WriteLine(Resources.AfterMethod); } WriteLine(Resources.ReturnResult); } else { WriteLine(Resources.SkipNext); WriteLine(Resources.Break); } m_Depth--; } if (declaration.IsCompact) { WriteLine(Resources.IncreaseIndex); } } if (declaration.After != null) { WriteLine(Resources.AfterMethod); } WriteLine(Resources.ReturnResult); } } }