From 01599953b8a5fbb995b1efc3741a6e23a82af0dd Mon Sep 17 00:00:00 2001 From: Martien de Jong Date: Thu, 15 Aug 2024 13:36:18 +0200 Subject: [PATCH 1/3] convert the numerical enum to a string based on the index when enumstringinitializers is true --- .../TypeGen.Core/Generator/Generator.cs | 71 +++++++++++++++++-- 1 file changed, 67 insertions(+), 4 deletions(-) diff --git a/src/TypeGen/TypeGen.Core/Generator/Generator.cs b/src/TypeGen/TypeGen.Core/Generator/Generator.cs index 35b56a69..1b6965d6 100644 --- a/src/TypeGen/TypeGen.Core/Generator/Generator.cs +++ b/src/TypeGen/TypeGen.Core/Generator/Generator.cs @@ -4,7 +4,9 @@ using System.IO; using System.Linq; using System.Reflection; +using System.Runtime.Serialization.Formatters; using System.Threading.Tasks; +using System.Xml.Linq; using TypeGen.Core.Conversion; using TypeGen.Core.Extensions; using TypeGen.Core.Generator.Context; @@ -588,21 +590,65 @@ private string GetClassPropertyText(Type type, MemberInfo memberInfo) isOptional = true; } + var defaultValue = GetClassPropertyDefaultValue(memberInfo, typeName); + + if (defaultValue == null) + return _templateService.FillClassPropertyTemplate(modifiers, name, typeName, typeUnions, isOptional, tsDoc); + + var enumType = GetEnumType(memberInfo); + if (enumType != null) + { + defaultValue = GetEnumMemberText(enumType, defaultValue); + } + // todo if the type is an enum type that has the stringinitializersattribute set or its an enum and the stringinitializer is set in the tgconfig, convert the enum value to its string representation + //if(memberInfo.DeclaringType.BaseType == typeof(Enum)) + //memberInfo.PropertyType.BaseType + + return _templateService.FillClassPropertyTemplate(modifiers, name, typeName, typeUnions, isOptional, tsDoc, defaultValue); + } + + private Type GetEnumType(MemberInfo memberInfo) + { + Type enumType = null; + + // Check if the memberInfo is a property or field + Type memberType = null; + if (memberInfo is PropertyInfo propertyInfo) + { + memberType = propertyInfo.PropertyType; + } + else if (memberInfo is FieldInfo fieldInfo) + { + memberType = fieldInfo.FieldType; + } + + // Check if the member type is an enum + if (memberType != null && memberType.IsEnum) + { + enumType = memberType; + return enumType; + } + + return null; + } + + private string GetClassPropertyDefaultValue(MemberInfo memberInfo, string typeName) + { // try to get default value from TsDefaultValueAttribute var defaultValueAttribute = _metadataReaderFactory.GetInstance().GetAttribute(memberInfo); if (defaultValueAttribute != null) - return _templateService.FillClassPropertyTemplate(modifiers, name, typeName, typeUnions, isOptional, tsDoc, defaultValueAttribute.DefaultValue); + return defaultValueAttribute.DefaultValue; // try to get default value from the member's default value string valueText = _tsContentGenerator.GetMemberValueText(memberInfo); if (!string.IsNullOrWhiteSpace(valueText)) - return _templateService.FillClassPropertyTemplate(modifiers, name, typeName, typeUnions, isOptional, tsDoc, valueText); + return valueText; // try to get default value from Options.DefaultValuesForTypes if (Options.DefaultValuesForTypes.Any() && Options.DefaultValuesForTypes.ContainsKey(typeName)) - return _templateService.FillClassPropertyTemplate(modifiers, name, typeName, typeUnions, isOptional, tsDoc, Options.DefaultValuesForTypes[typeName]); + return Options.DefaultValuesForTypes[typeName]; - return _templateService.FillClassPropertyTemplate(modifiers, name, typeName, typeUnions, isOptional, tsDoc); + return null; } private static void ThrowMemberTypeIsBlacklisted(MemberInfo memberInfo) @@ -725,6 +771,23 @@ private string GetInterfacePropertiesText(Type type) return RemoveLastLineEnding(propertiesText); } + private string GetEnumMemberText(Type enumType, string enumValue) + { + var stringInitializersAttribute = _metadataReaderFactory.GetInstance().GetAttribute(enumType); + if ((Options.EnumStringInitializers && (stringInitializersAttribute == null || stringInitializersAttribute.Enabled)) || + (stringInitializersAttribute != null && stringInitializersAttribute.Enabled)) + { + int index; + if(int.TryParse(enumValue, out index)) + { + var values = Enum.GetValues(enumType); + var value = values.GetValue(index).ToString(); + return value; + } + } + return enumValue; + } + /// /// Gets TypeScript enum member definition source code /// From 90b14a95115c974ab561370d4d63f91edc2f9ab3 Mon Sep 17 00:00:00 2001 From: Martien de Jong Date: Thu, 15 Aug 2024 13:49:56 +0200 Subject: [PATCH 2/3] solved an incorrect approach. remove leftovers --- src/TypeGen/TypeGen.Core/Generator/Generator.cs | 11 +++-------- 1 file changed, 3 insertions(+), 8 deletions(-) diff --git a/src/TypeGen/TypeGen.Core/Generator/Generator.cs b/src/TypeGen/TypeGen.Core/Generator/Generator.cs index 1b6965d6..695f01ab 100644 --- a/src/TypeGen/TypeGen.Core/Generator/Generator.cs +++ b/src/TypeGen/TypeGen.Core/Generator/Generator.cs @@ -597,12 +597,7 @@ private string GetClassPropertyText(Type type, MemberInfo memberInfo) var enumType = GetEnumType(memberInfo); if (enumType != null) - { - defaultValue = GetEnumMemberText(enumType, defaultValue); - } - // todo if the type is an enum type that has the stringinitializersattribute set or its an enum and the stringinitializer is set in the tgconfig, convert the enum value to its string representation - //if(memberInfo.DeclaringType.BaseType == typeof(Enum)) - //memberInfo.PropertyType.BaseType + defaultValue = GetEnumMemberReference(enumType, defaultValue); return _templateService.FillClassPropertyTemplate(modifiers, name, typeName, typeUnions, isOptional, tsDoc, defaultValue); } @@ -771,7 +766,7 @@ private string GetInterfacePropertiesText(Type type) return RemoveLastLineEnding(propertiesText); } - private string GetEnumMemberText(Type enumType, string enumValue) + private string GetEnumMemberReference(Type enumType, string enumValue) { var stringInitializersAttribute = _metadataReaderFactory.GetInstance().GetAttribute(enumType); if ((Options.EnumStringInitializers && (stringInitializersAttribute == null || stringInitializersAttribute.Enabled)) || @@ -782,7 +777,7 @@ private string GetEnumMemberText(Type enumType, string enumValue) { var values = Enum.GetValues(enumType); var value = values.GetValue(index).ToString(); - return value; + return $"{enumType.Name}.{value}"; } } return enumValue; From 426787b4f78ea894e0d681875b347a32b2d85f22 Mon Sep 17 00:00:00 2001 From: Martien de Jong Date: Thu, 15 Aug 2024 13:55:19 +0200 Subject: [PATCH 3/3] add comment --- src/TypeGen/TypeGen.Core/Generator/Generator.cs | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/src/TypeGen/TypeGen.Core/Generator/Generator.cs b/src/TypeGen/TypeGen.Core/Generator/Generator.cs index 695f01ab..be2aae81 100644 --- a/src/TypeGen/TypeGen.Core/Generator/Generator.cs +++ b/src/TypeGen/TypeGen.Core/Generator/Generator.cs @@ -1,12 +1,9 @@ using System; -using System.Collections; using System.Collections.Generic; using System.IO; using System.Linq; using System.Reflection; -using System.Runtime.Serialization.Formatters; using System.Threading.Tasks; -using System.Xml.Linq; using TypeGen.Core.Conversion; using TypeGen.Core.Extensions; using TypeGen.Core.Generator.Context; @@ -766,6 +763,13 @@ private string GetInterfacePropertiesText(Type type) return RemoveLastLineEnding(propertiesText); } + /// + /// Converts an enumvalue that is a number to a reference to the enumvalue + /// if EnumStringInitializers are enabled for that enum. + /// + /// The type of the enum + /// The number value in the form of a string + /// A string representation of the reference to the enumvalue in the form {EnumType}.{StringRepresentation} private string GetEnumMemberReference(Type enumType, string enumValue) { var stringInitializersAttribute = _metadataReaderFactory.GetInstance().GetAttribute(enumType);