Пример #1
0
        private static void GenerateSerializers(
            IList <string> sourceFilePathes,
            string[] referenceAssemblies,
            bool sourceFileIsAssembly,
            string includingPattern,
            string excludingPattern,
            bool treatWarningsAsErrors,
            int warningLevel,
            bool admitNonPublicTypes,
            SerializerCodeGenerationConfiguration configuration
            )
        {
            if (sourceFilePathes == null || sourceFilePathes.Count == 0)
            {
                throw new ArgumentException("Source files or a source assembly is required.");
            }
            var generator = new SerializerCodeGenerator(configuration);

            IEnumerable <string> result;

            if (!sourceFileIsAssembly)
            {
                result =
                    generator.GenerateSerializers(
                        new SerializerTargetCompiler
                {
                    TreatWarningsAsErrors = treatWarningsAsErrors,
                    WarningLevel          = warningLevel
                }.CompileTargetTypeAssembly(
                            sourceFilePathes,
                            referenceAssemblies ?? new string[0]
                            ),
                        includingPattern,
                        excludingPattern,
                        admitNonPublicTypes
                        );
            }
            else
            {
                result =
                    generator.GenerateSerializers(
                        sourceFilePathes[0],
                        includingPattern,
                        excludingPattern,
                        admitNonPublicTypes
                        );
            }

            foreach (var outputFilePath in result)
            {
                Console.WriteLine(outputFilePath);
            }
        }
Пример #2
0
    static void GenerateMsgPackSerializers()
    {
        var settings = new SerializerCodeGenerationConfiguration
        {
            OutputDirectory                 = Path.GetTempPath(),
            SerializationMethod             = SerializationMethod.Array,
            Namespace                       = "Sandbox.Shared.GeneratedSerializers",
            IsRecursive                     = true,
            PreferReflectionBasedSerializer = false,
            WithNullableSerializers         = true,
            EnumSerializationMethod         = EnumSerializationMethod.ByName
        };

        var result = SerializerGenerator.GenerateSerializerSourceCodes(settings, typeof(Person));

        foreach (var item in result)
        {
            Console.WriteLine(item.FilePath);
        }
    }
Пример #3
0
        private static int Execute(IEnumerable <string> args)
        {
            Action?action                = null;
            var    sourceProjectPath     = default(string);
            var    outputDirectoryPath   = default(string);
            var    overwrite             = false;
            var    sourceFileIsAssembly  = false;
            var    referenceAssemblies   = new List <string>();
            var    includingPattern      = default(string);
            var    excludingPattern      = default(string);
            var    treatWarningsAsErrors = false;
            var    warningLevel          = 4;
            var    configuration         =
                new SerializerCodeGenerationConfiguration
            {
                PreferReflectionBasedSerializer = true,
                IsRecursive = true
            };

            var options =
                new OptionSet(Localize)
            {
                {
                    "?|h|help", "Show this help message.",
                    _ => action = Action.ShowHelp
                },
                {
                    "l|library", "[required] Copy MsgPack source as assets library tree.",
                    _ => action = action != null ? Action.ShowHelp : Action.BuildAssetLibrary
                },
                {
                    "s|serializer", "[required] Generate serializer sources as assets tree.",
                    _ => action = action != null ? Action.ShowHelp : Action.GenerateSerializers
                },
                {
                    "p|project=", "[library, optional] Specify MsgPack.Unity3D.csproj path. Default is './src/MsgPack.Unity3D/MsgPack.Unity3D.csproj'.",
                    value => sourceProjectPath = value
                },
                {
                    "o|out=", "[all, optional] Specify the root directory of the output file tree. Default is './Assets/MsgPack' for 'library', './Assets/MsgPackSerializers/' for 'serializer'.",
                    value => outputDirectoryPath = value
                },
                {
                    "w|overwrite", "[library, optional] Overwrite existent source file (you have to clean output directory in advance by default.)",
                    _ => overwrite = true
                },
                {
                    "a|assembly", "[serializer, optional] Specify source file is assembly file which contains all serialization target types instead of C# source code files.",
                    _ => sourceFileIsAssembly = true
                },
                {
                    "n|namespace=", "[serializer, optional] Specify namespace for generated serializer types.",
                    value => configuration.Namespace = value
                },
                {
                    "internal", "[serializer, optional] Specify generated source code will be internal to MsgPack library itself. This option is required if you import MsgPack sources instead of an assembly to your Assets.",
                    _ => configuration.IsInternalToMsgPackLibrary = true
                },
                {
                    "method=", "[serializer, optional] Specify serialization method for generated serializers. Valid value is Array or Map. Default is 'Array'.",
                    (SerializationMethod value) => configuration.SerializationMethod = value
                },
                {
                    "enum-method=", "[serializer, optional] Specify enum serialization method for generated enum serializers. Valid value is ByName or ByUnderlyingType. Default is 'ByName'.",
                    (EnumSerializationMethod value) => configuration.EnumSerializationMethod = value
                },
                {
                    "singular", "[serializer, optional] Specify avoid recursive serializer generation for target type(s).",
                    _ => configuration.PreferReflectionBasedSerializer = false
                },
                {
                    "avoid-reflection-based", "[serializer, optional] Specify avoid built-in reflection based serializer and generates alternative serializers.",
                    _ => configuration.PreferReflectionBasedSerializer = false
                },
                {
                    "indent=", "[serializer, optional] Specify indent string for generated serializers. Default is a horizontal tab charactor (U+0009).",
                    value => configuration.CodeIndentString = value
                },
                {
                    "r|references=", "[serializer, optional] Specify reference assemblies' file pathes (delimited by comma) to compile serialization target type source codes. './MsgPack.dll' will be added automatically when it exists.",
                    value => referenceAssemblies.AddRange(value.Split(new [] { ',' }, StringSplitOptions.RemoveEmptyEntries).Select(token => token.Trim()))
                },
                {
                    "includes=", "[serializer, optional] Specify additional regular expression to filter in serialization target types. This filter is used for type full name including its namespace.",
                    value => includingPattern = value
                },
                {
                    "excludes=", "[serializer, optional] Specify additional regular expression to filter in serialization target types. This filter is used for type full name including its namespace.",
                    value => excludingPattern = value
                },
                {
                    "treatWarningsAsErrors", "[serializer, optional] Specify to generate error for compiler warnings for serialization target types.",
                    _ => treatWarningsAsErrors = true
                },
                {
                    "warningLevel=", "[serializer, optional] Specify compiler warning level for serialization target types. Default is '4'.",
                    (int value) => warningLevel = value
                }
            };

            var sourceFilePathes = options.Parse(args);

            switch (action.GetValueOrDefault())
            {
            case Action.BuildAssetLibrary:
            {
                BuildAssetLibrary(sourceProjectPath, outputDirectoryPath, overwrite);
                return(0);
            }

            case Action.GenerateSerializers:
            {
                configuration.OutputDirectory = outputDirectoryPath;
                if (File.Exists("./MsgPack.dll"))
                {
                    referenceAssemblies.Add("./MsgPack.dll");
                }

                GenerateSerializers(
                    sourceFilePathes,
                    referenceAssemblies.Distinct(PathEqualityComparer.Instance).ToArray(),
                    sourceFileIsAssembly,
                    includingPattern,
                    excludingPattern,
                    treatWarningsAsErrors,
                    warningLevel,
                    configuration
                    );
                return(0);
            }

            default:
            {
                ShowHelp(options);
                return(1);
            }
            }
        }
Пример #4
0
 public CodeDomContext(SerializationContext context, SerializerCodeGenerationConfiguration configuration)
     : base(context)
 {
     this._configuration = configuration;
 }
Пример #5
0
 public CodeDomContext(SerializationContext context, SerializerCodeGenerationConfiguration configuration)
     : base(context)
 {
     this._configuration      = configuration;
     this._methodContextStack = new Stack <MethodContext>();
 }
Пример #6
0
 /// <summary>
 ///		Initializes a new instance of the <see cref="SerializerCodeGenerator"/> class.
 /// </summary>
 /// <param name="configuration">The configuration object.</param>
 public SerializerCodeGenerator(SerializerCodeGenerationConfiguration configuration)
 {
     this._configuration = configuration ?? new SerializerCodeGenerationConfiguration();
 }
Пример #7
0
        private static int Execute(IEnumerable <string> args)
        {
            Action?action                = null;
            var    sourceProjectPath     = default(string);
            var    outputDirectoryPath   = default(string);
            var    overwrite             = false;
            var    sourceFileIsAssembly  = false;
            var    referenceAssemblies   = new List <string>();
            var    includingPattern      = default(string);
            var    excludingPattern      = default(string);
            var    treatWarningsAsErrors = false;
            var    warningLevel          = 4;
            var    configuration         =
                new SerializerCodeGenerationConfiguration
            {
                PreferReflectionBasedSerializer = true,
                IsRecursive = true
            };

            var options =
                new OptionSet(Localize)
            {
                {
                    "?|h|help", "Show this help message.",
                    _ => action = Action.ShowHelp
                },
                {
                    "l|library", "[required] Copy MsgPack source as assets library tree.",
                    _ => action = action != null ? Action.ShowHelp : Action.BuildAssetLibrary
                },
                {
                    "s|serializer", "[required] Generate serializer sources as assets tree.",
                    _ => action = action != null ? Action.ShowHelp : Action.GenerateSerializers
                },
                {
                    "p|project=", "[library, optional] Specify MsgPack.Unity3D.csproj path. Default is './src/MsgPack.Unity3D/MsgPack.Unity3D.csproj'.",
                    value => sourceProjectPath = value
                },
                {
                    "o|out=", "[all, optional] Specify the root directory of the output file tree. Default is './Assets/MsgPack' for 'library', './Assets/MsgPackSerializers/' for 'serializer'.",
                    value => outputDirectoryPath = value
                },
                {
                    "w|overwrite", "[library, optional] Overwrite existent source file (you have to clean output directory in advance by default.)",
                    _ => overwrite = true
                },
                {
                    "a|assembly", "[serializer, optional] Specify source file is assembly file which contains all serialization target types instead of C# source code files.",
                    _ => sourceFileIsAssembly = true
                },
                {
                    "n|namespace=", "[serializer, optional] Specify namespace for generated serializer types.",
                    value => configuration.Namespace = value
                },
                {
                    "internal", "[serializer, optional] Specify generated source code will be internal to MsgPack library itself. This option is required if you import MsgPack sources instead of an assembly to your Assets.",
                    _ => configuration.IsInternalToMsgPackLibrary = true
                },
                {
                    "method=", "[serializer, optional] Specify serialization method for generated serializers. Valid value is Array or Map. Default is 'Array'.",
                    (SerializationMethod value) => configuration.SerializationMethod = value
                },
                {
                    "enum-method=", "[serializer, optional] Specify enum serialization method for generated enum serializers. Valid value is ByName or ByUnderlyingType. Default is 'ByName'.",
                    (EnumSerializationMethod value) => configuration.EnumSerializationMethod = value
                },
                {
                    "singular", "[serializer, optional] Specify avoid recursive serializer generation for target type(s).",
                    _ => configuration.IsRecursive = false
                },
                {
                    "avoid-reflection-based", "[serializer, optional] Specify avoid built-in reflection based serializer and generates alternative serializers.",
                    _ => configuration.PreferReflectionBasedSerializer = false
                },
                {
                    "prohibit-non-collection-enumerable-types", "[serializer, optional] Specify prevent serializer generation for types which implemnent IEnumerable but do not have add for backward compatibility.",
                    _ => configuration.CompatibilityOptions.AllowNonCollectionEnumerableTypes = false
                },
                {
                    "ignore-packability-for-collection", "[serializer, optional] Specify generate normal collection serializer logic for types which implemnent IEnumerable and IPackable/IUnpackble/IAsyncPackable/IAsyncUnpackable for backward compatiblity.",
                    _ => configuration.CompatibilityOptions.IgnorePackabilityForCollection = false
                },
                {
                    "one-bound-data-member-order", "[serializer, optional] Specify generating serializers use 1-based DataMemberAttribute.order instead of 0-based for compatibility of some other serialization libraries.",
                    _ => configuration.CompatibilityOptions.OneBoundDataMemberOrder = false
                },
                {
                    "classic-packer", "[serializer, optional] Specify that packer does not emit new bin, str8, and ext types.",
                    _ => configuration.CompatibilityOptions.PackerCompatibilityOptions = PackerCompatibilityOptions.Classic
                },
                {
                    "with-async", "[serializer, optional] Specify generating async methods on serializers. This option causes compilation error for legacy environments including Unity.",
                    _ => configuration.WithAsync = true
                },
                {
                    "indent=", "[serializer, optional] Specify indent string for generated serializers. Default is a horizontal tab charactor (U+0009).",
                    value => configuration.CodeIndentString = value
                },
                {
                    "r|references=", "[serializer, optional] Specify reference assemblies' file pathes (delimited by comma) to compile serialization target type source codes. './MsgPack.dll' will be added automatically when it exists.",
                    value => referenceAssemblies.AddRange(value.Split(new [] { ',' }, StringSplitOptions.RemoveEmptyEntries).Select(token => token.Trim()))
                },
                {
                    "includes=", "[serializer, optional] Specify additional regular expression to filter in serialization target types. This filter is used for type full name including its namespace.",
                    value => includingPattern = value
                },
                {
                    "excludes=", "[serializer, optional] Specify additional regular expression to filter in serialization target types. This filter is used for type full name including its namespace.",
                    value => excludingPattern = value
                },
                {
                    "treat-warning-as-errors|treatWarningsAsErrors", "[serializer, optional] Specify to generate error for compiler warnings for serialization target types.",
                    _ => treatWarningsAsErrors = true
                },
                {
                    "warning-level|warningLevel=", "[serializer, optional] Specify compiler warning level for serialization target types. Default is '4'.",
                    ( int value ) => warningLevel = value
                },
                {
                    "suppress-debugger-non-user-code-attr", "[serializer, optional] Specify supressing DebuggerNonUserCodeAttribute in the output code to enable debugger stepping.",
                    _ => configuration.SuppressDebuggerNonUserCodeAttribute = true
                }
            };

            var sourceFilePathes = options.Parse(args);

            switch (action.GetValueOrDefault())
            {
            case Action.BuildAssetLibrary:
            {
                BuildAssetLibrary(sourceProjectPath, outputDirectoryPath, overwrite);
                return(0);
            }

            case Action.GenerateSerializers:
            {
                configuration.OutputDirectory = outputDirectoryPath;
                if (File.Exists("./MsgPack.dll"))
                {
                    referenceAssemblies.Add("./MsgPack.dll");
                }

                GenerateSerializers(
                    sourceFilePathes,
                    referenceAssemblies.Distinct(PathEqualityComparer.Instance).ToArray(),
                    sourceFileIsAssembly,
                    includingPattern,
                    excludingPattern,
                    treatWarningsAsErrors,
                    warningLevel,
                    configuration
                    );
                return(0);
            }

            default:
            {
                ShowHelp(options);
                return(1);
            }
            }
        }