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); } }
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); } }
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); } } }
public CodeDomContext(SerializationContext context, SerializerCodeGenerationConfiguration configuration) : base(context) { this._configuration = configuration; }
public CodeDomContext(SerializationContext context, SerializerCodeGenerationConfiguration configuration) : base(context) { this._configuration = configuration; this._methodContextStack = new Stack <MethodContext>(); }
/// <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(); }
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); } } }