@@ -84,7 +84,7 @@ void AddMapping()
8484 . Append ( "Type = " ) . Append ( typeName ) . AppendLine ( "," ) ;
8585
8686 if ( ! string . IsNullOrEmpty ( format ) )
87- builder . Append ( "Format = " ) . Append ( QuoteAndEscape ( data . SerializationFormat ?? format ) ) . AppendLine ( "," ) ;
87+ builder . Append ( "Format = " ) . Append ( QuoteAndEscape ( data . SerializationInfo ? . serializationFormat ?? format ) ) . AppendLine ( "," ) ;
8888
8989 var title = data . ClassName ;
9090 builder . Append ( "Title = " ) . Append ( Quote ( title ) ) . AppendLine ( "," ) ;
@@ -165,7 +165,7 @@ internal static void ProcessTypeConverter(GeneratorData data, SourceProductionCo
165165 . AppendLine ( "public override object? ConvertFrom(ITypeDescriptorContext? context, CultureInfo? culture, object value)" )
166166 . OpenBracket ( ) ;
167167
168- if ( data . SerializationFormat is not null )
168+ if ( data . SerializationInfo is not null )
169169 {
170170 builder . AppendLine ( "if (value is string s)" )
171171 . OpenBracket ( )
@@ -184,16 +184,16 @@ internal static void ProcessTypeConverter(GeneratorData data, SourceProductionCo
184184 else
185185 {
186186 builder . AppendLine ( "var result = base.ConvertFrom(context, culture, value);" )
187- . AppendLine ( "if (result is null)" )
188- . AppendIndentation ( ) . AppendLine ( "return null;" )
189- . AppendLine ( "try" )
190- . OpenBracket ( )
191- . AppendLine ( $ "return new { data . ClassName } (({ data . PrimitiveTypeFriendlyName } )result);")
192- . CloseBracket ( )
193- . AppendLine ( "catch (InvalidDomainValueException ex)" )
194- . OpenBracket ( )
195- . Append ( "throw new FormatException(\" Cannot parse " ) . Append ( data . ClassName ) . AppendLine ( "\" , ex);" )
196- . CloseBracket ( ) ;
187+ . AppendLine ( "if (result is null)" )
188+ . AppendIndentation ( ) . AppendLine ( "return null;" )
189+ . AppendLine ( "try" )
190+ . OpenBracket ( )
191+ . AppendLine ( $ "return new { data . ClassName } (({ data . PrimitiveTypeFriendlyName } )result);")
192+ . CloseBracket ( )
193+ . AppendLine ( "catch (InvalidDomainValueException ex)" )
194+ . OpenBracket ( )
195+ . Append ( "throw new FormatException(\" Cannot parse " ) . Append ( data . ClassName ) . AppendLine ( "\" , ex);" )
196+ . CloseBracket ( ) ;
197197 }
198198 builder . CloseBracket ( ) . CloseBracket ( ) ;
199199
@@ -306,7 +306,7 @@ internal static void ProcessJsonConverter(GeneratorData data, SourceProductionCo
306306 "System.Text.Json.Serialization" ,
307307 "System.Globalization" ,
308308 "System.Text.Json.Serialization.Metadata" ,
309- "AltaSoft.DomainPrimitives" ,
309+ "AltaSoft.DomainPrimitives"
310310 } ;
311311
312312 var converterName = data . UnderlyingType . ToString ( ) ;
@@ -321,7 +321,7 @@ internal static void ProcessJsonConverter(GeneratorData data, SourceProductionCo
321321 . Append ( "public override " ) . Append ( data . ClassName ) . AppendLine ( " Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)" )
322322 . OpenBracket ( ) ;
323323
324- if ( data . SerializationFormat is null )
324+ if ( data . SerializationInfo is null )
325325 {
326326 var rawValueStr = $ "JsonInternalConverters.{ converterName } Converter.Read(ref reader, typeToConvert, options){ ( primitiveTypeIsValueType ? "" : "!" ) } ";
327327
@@ -350,25 +350,25 @@ internal static void ProcessJsonConverter(GeneratorData data, SourceProductionCo
350350 . NewLine ( ) ;
351351
352352 builder . AppendInheritDoc ( ) . AppendLine ( $ "public override void Write(Utf8JsonWriter writer, { data . ClassName } value, JsonSerializerOptions options)")
353- . OpenBracket ( )
354- . AppendLineIf ( data . SerializationFormat is null , $ "JsonInternalConverters.{ converterName } Converter.Write(writer, ({ data . PrimitiveTypeFriendlyName } )value, options);")
355- . AppendLineIf ( data . SerializationFormat is not null , $ "writer.WriteStringValue(value.ToString({ QuoteAndEscape ( data . SerializationFormat ) } , CultureInfo.InvariantCulture));")
356- . CloseBracket ( )
357- . NewLine ( ) ;
353+ . OpenBracket ( ) ;
354+ if ( data . SerializationInfo is null )
355+ builder . AppendLine ( $ "JsonInternalConverters.{ converterName } Converter.Write(writer, ({ data . PrimitiveTypeFriendlyName } )value, options);") ;
356+ else
357+ builder . AppendLine ( $ "writer.WriteStringValue(value.ToString({ QuoteAndEscape ( data . SerializationInfo . Value . serializationFormat ) } , CultureInfo.InvariantCulture));") ;
358+ builder . CloseBracket ( ) . NewLine ( ) ;
358359
359360 builder . AppendInheritDoc ( )
360361 . Append ( "public override " ) . Append ( data . ClassName ) . AppendLine ( " ReadAsPropertyName(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)" )
361362 . OpenBracket ( ) ;
362363
363- if ( data . SerializationFormat is null )
364+ if ( data . SerializationInfo is null )
364365 {
365-
366366 var rawValueStr = $ "JsonInternalConverters.{ converterName } Converter.ReadAsPropertyName(ref reader, typeToConvert, options){ ( primitiveTypeIsValueType ? "" : "!" ) } ";
367367
368368 builder . AppendLine ( "try" )
369369 . OpenBracket ( )
370370 . AppendLineIf ( data . GenerateImplicitOperators , $ "return { rawValueStr } ;")
371- . AppendLineIf ( ! data . GenerateImplicitOperators , $ "return new({ rawValueStr } );")
371+ . AppendLineIf ( ! data . GenerateImplicitOperators , $ "return new ({ rawValueStr } );")
372372 . CloseBracket ( ) ;
373373 }
374374 else
@@ -392,10 +392,12 @@ internal static void ProcessJsonConverter(GeneratorData data, SourceProductionCo
392392
393393 builder . AppendInheritDoc ( )
394394 . Append ( "public override void WriteAsPropertyName(Utf8JsonWriter writer, " ) . Append ( data . ClassName ) . AppendLine ( " value, JsonSerializerOptions options)" )
395- . OpenBracket ( )
396- . AppendLineIf ( data . SerializationFormat is null , $ "JsonInternalConverters.{ converterName } Converter.WriteAsPropertyName(writer, ({ data . PrimitiveTypeFriendlyName } )value, options);")
397- . AppendLineIf ( data . SerializationFormat is not null , $ "writer.WritePropertyName(value.ToString({ QuoteAndEscape ( data . SerializationFormat ) } , CultureInfo.InvariantCulture));")
398- . CloseBracket ( ) ;
395+ . OpenBracket ( ) ;
396+ if ( data . SerializationInfo is null )
397+ builder . AppendLine ( $ "JsonInternalConverters.{ converterName } Converter.WriteAsPropertyName(writer, ({ data . PrimitiveTypeFriendlyName } )value, options);") ;
398+ else
399+ builder . AppendLine ( $ "writer.WritePropertyName(value.ToString({ QuoteAndEscape ( data . SerializationInfo . Value . serializationFormat ) } , CultureInfo.InvariantCulture));") ;
400+ builder . CloseBracket ( ) ;
399401
400402 builder . CloseBracket ( ) ;
401403
@@ -427,8 +429,8 @@ internal static void GenerateMandatoryMethods(GeneratorData data, SourceCodeBuil
427429 . AppendParamDescription ( "errorMessage" , "When this method returns, contains the error message if the conversion failed; otherwise, null." )
428430 . AppendReturnsDescription ( "true if the conversion succeeded; otherwise, false." ) ;
429431
430- builder . Append ( "public static bool TryCreate(" ) . Append ( primitiveType ) . Append ( " value, [NotNullWhen(true)] out " ) . Append ( data . ClassName )
431- . AppendLine ( "? result, [NotNullWhen(false)] out string? errorMessage)" )
432+ builder . Append ( "public static bool TryCreate(" ) . Append ( primitiveType ) . Append ( " value, [NotNullWhen(true)] out " ) . Append ( data . ClassName )
433+ . AppendLine ( "? result, [NotNullWhen(false)] out string? errorMessage)" )
432434 . OpenBracket ( ) ;
433435
434436 if ( data . UseTransformMethod )
@@ -796,7 +798,7 @@ public static void GenerateParsable(GeneratorData data, SourceCodeBuilder builde
796798 var underlyingType = data . ParentSymbols . Count == 0
797799 ? data . PrimitiveTypeFriendlyName
798800 : data . ParentSymbols [ 0 ] . Name ;
799- var format = data . SerializationFormat ;
801+ var format = data . SerializationInfo ? . serializationFormat ;
800802
801803 builder . AppendInheritDoc ( )
802804 . AppendLine ( "[MethodImpl(MethodImplOptions.AggressiveInlining)]" )
@@ -823,8 +825,17 @@ public static void GenerateParsable(GeneratorData data, SourceCodeBuilder builde
823825 }
824826 else
825827 {
826- builder . Append ( $ "{ underlyingType } .")
827- . AppendIfElse ( format is null , "Parse(s, provider)" , $ "ParseExact(s, { QuoteAndEscape ( format ! ) } , provider)") ;
828+ builder . Append ( $ "{ underlyingType } .") ;
829+ if ( format is null && ! data . UnderlyingType . IsDateOrTime ( ) )
830+ {
831+ builder . Append ( "Parse(s, provider)" ) ;
832+ }
833+ else
834+ {
835+ builder . Append ( format is null
836+ ? "ParseFlexible(s, provider)"
837+ : $ "ParseFlexible(s, { QuoteAndEscape ( format ) } , { ( data . SerializationInfo ! . Value . allowStandardFormats ? "true" : "false" ) } , provider)") ;
838+ }
828839 }
829840
830841 builder . AppendLine ( ! data . GenerateImplicitOperators ? ");" : ";" ) ;
@@ -849,21 +860,24 @@ public static void GenerateParsable(GeneratorData data, SourceCodeBuilder builde
849860 }
850861 else
851862 {
852- var style = "" ;
853- if ( format is not null )
863+ if ( format is null && ! data . UnderlyingType . IsDateOrTime ( ) )
854864 {
855- style = data . UnderlyingType == DomainPrimitiveUnderlyingType . TimeSpan ? "TimeSpanStyles.None" : "DateTimeStyles.None" ;
865+ builder . Append ( $ "if (!{ underlyingType } .TryParse(s, provider, out var value))") ;
866+ }
867+ else
868+ {
869+ builder . Append ( format is null
870+ ? $ "if (!{ underlyingType } .TryParseFlexible(s, provider, out var value))"
871+ : $ "if (!{ underlyingType } .TryParseFlexible(s, { QuoteAndEscape ( format ) } , { ( data . SerializationInfo ! . Value . allowStandardFormats ? "true" : "false" ) } , provider, out var value))") ;
856872 }
857-
858- builder . AppendIf ( format is null , $ "if (!{ underlyingType } .TryParse(s, provider, out var value))")
859- . AppendIf ( format is not null , $ "if (!{ underlyingType } .TryParseExact(s, { QuoteAndEscape ( format ) } , provider, { style } , out var value))") ;
860873 }
861874
862- builder . OpenBracket ( )
863- . AppendLine ( "result = default;" )
864- . AppendLine ( "return false;" )
865- . CloseBracket ( )
866- . NewLine ( ) ;
875+ builder
876+ . OpenBracket ( )
877+ . AppendLine ( "result = default;" )
878+ . AppendLine ( "return false;" )
879+ . CloseBracket ( )
880+ . NewLine ( ) ;
867881
868882 if ( ! data . TypeSymbol . IsValueType )
869883 {
@@ -1037,7 +1051,7 @@ public static void GenerateIXmlSerializableMethods(GeneratorData data, SourceCod
10371051
10381052 string method ;
10391053
1040- if ( data . UnderlyingType . IsDateOrTime ( ) && data . SerializationFormat is not null )
1054+ if ( data . UnderlyingType . IsDateOrTime ( ) && data . SerializationInfo is not null )
10411055 {
10421056 method = "ReadElementContentAs" + data . PrimitiveTypeFriendlyName ;
10431057 }
@@ -1056,9 +1070,14 @@ public static void GenerateIXmlSerializableMethods(GeneratorData data, SourceCod
10561070 builder . AppendInheritDoc ( ) ;
10571071 builder . AppendLine ( "public void ReadXml(XmlReader reader)" )
10581072 . OpenBracket ( )
1059- . Append ( "var value = reader." ) . Append ( method )
1060- . AppendLineIfElse ( data . SerializationFormat is not null , $ "({ QuoteAndEscape ( data . SerializationFormat ) } );", "();" )
1061- . AppendLine ( "ValidateOrThrow(value);" )
1073+ . Append ( "var value = reader." ) . Append ( method ) ;
1074+
1075+ if ( data . SerializationInfo is { } serInfo )
1076+ builder . AppendLine ( $ "({ QuoteAndEscape ( serInfo . serializationFormat ) } , { ( serInfo . allowStandardFormats ? "true" : "false" ) } );") ;
1077+ else
1078+ builder . AppendLine ( "();" ) ;
1079+
1080+ builder . AppendLine ( "ValidateOrThrow(value);" )
10621081 . AppendLine ( "System.Runtime.CompilerServices.Unsafe.AsRef(in _value) = value;" )
10631082 . AppendLine ( "System.Runtime.CompilerServices.Unsafe.AsRef(in _isInitialized) = true;" )
10641083 . CloseBracket ( )
@@ -1068,10 +1087,10 @@ public static void GenerateIXmlSerializableMethods(GeneratorData data, SourceCod
10681087
10691088 if ( string . Equals ( data . PrimitiveTypeFriendlyName , "string" , System . StringComparison . Ordinal ) )
10701089 builder . AppendLine ( $ "public void WriteXml(XmlWriter writer) => writer.WriteString({ data . FieldName } );") ;
1071- else if ( data . SerializationFormat is null )
1090+ else if ( data . SerializationInfo is null )
10721091 builder . AppendLine ( $ "public void WriteXml(XmlWriter writer) => writer.WriteValue((({ data . PrimitiveTypeFriendlyName } ){ data . FieldName } ).ToXmlString());") ;
10731092 else
1074- builder . AppendLine ( $ "public void WriteXml(XmlWriter writer) => writer.WriteString({ data . FieldName } .ToString({ QuoteAndEscape ( data . SerializationFormat ) } ));") ;
1093+ builder . AppendLine ( $ "public void WriteXml(XmlWriter writer) => writer.WriteString({ data . FieldName } .ToString({ QuoteAndEscape ( data . SerializationInfo ? . serializationFormat ) } ));") ;
10751094 builder . NewLine ( ) ;
10761095 }
10771096
0 commit comments