예제 #1
0
        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);
            }
        }
예제 #2
0
        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);
                }
            }
        }