private void GenerateEnumeration(Enumeration enumeration) { // Create types var unit = CreateUnit("Models/" + enumeration.Name + ".cs"); var ns = unit.AddNamespace(RootNamespace); var enumType = ns.AddType(new EnumerationDeclaration(enumeration.Name)); AddDocumentationComments(enumType, enumeration.Documentation); enumType.Modifiers = Modifiers.Public; enumType.BaseType = enumeration.BaseType?.ToPropertyTypeReference(); if (enumeration.IsFlags) { enumType.CustomAttributes.Add(new CustomAttribute(typeof(FlagsAttribute))); } // Generate members foreach (var member in enumeration.Members) { var enumerationMember = new Framework.CodeDom.EnumerationMember(ToPropertyName(member.Name)); enumerationMember.SetData("EnumerationMember", member); if (member.Value != null) { enumerationMember.Value = new LiteralExpression(member.Value); } if (enumeration.SerializeAsString) { enumerationMember.CustomAttributes.Add(new CustomAttribute(typeof(EnumMemberAttribute)) { Arguments = { new CustomAttributeArgument(nameof(EnumMemberAttribute.Value), member.FinalSerializationName) }, }); } AddDocumentationComments(enumerationMember, member.Documentation); enumType.Members.Add(enumerationMember); } if (enumeration.GenerateAllMember) { if (!enumeration.IsFlags) { throw new InvalidOperationException($"Cannot generate 'All' member for non-flags enumeration '{enumeration.Name}'"); } Expression initExpression = null; foreach (var member in enumType.Members) { Expression memberExpression = new TypeReferenceExpression(enumType).CreateMemberReferenceExpression(member.Name); if (initExpression == null) { initExpression = memberExpression; } else { initExpression = new BinaryExpression(BinaryOperator.BitwiseOr, initExpression, memberExpression); } } var enumerationMember = new Framework.CodeDom.EnumerationMember(ToPropertyName("all"), initExpression); enumType.Members.Add(enumerationMember); } if (enumeration.SerializeAsString) { var converterType = GenerateEnumerationJsonConverter(unit, enumType); enumType.CustomAttributes.Add(new CustomAttribute(typeof(JsonConverterAttribute)) { Arguments = { new CustomAttributeArgument(new TypeOfExpression(converterType)) }, }); } GenerateEnumerationUrlBuilder(enumeration, unit, enumType); }
private void GenerateEnumeration(NamespaceDeclaration ns, Enumeration enumeration) { var type = ns.AddType(new EnumerationDeclaration(enumeration.Name)); AddDocumentationComments(type, enumeration.Documentation); type.Modifiers = Modifiers.Public; type.BaseType = enumeration.BaseType; if (enumeration.IsFlags) { type.CustomAttributes.Add(new CustomAttribute(typeof(FlagsAttribute))); } if (enumeration.SerializeAsString) { //[JsonConverter(typeof(StringEnumConverter))] type.CustomAttributes.Add(new CustomAttribute(typeof(JsonConverterAttribute)) { Arguments = { new CustomAttributeArgument(new TypeOfExpression(typeof(StringEnumConverter))) } }); } foreach (var prop in enumeration.Members) { var enumerationMember = new Framework.CodeDom.EnumerationMember(ToPropertyName(prop.Name)); if (prop.Value != null) { enumerationMember.Value = new LiteralExpression(prop.Value); } if (enumeration.SerializeAsString) { enumerationMember.CustomAttributes.Add(new CustomAttribute(typeof(EnumMemberAttribute)) { Arguments = { new CustomAttributeArgument(nameof(EnumMemberAttribute.Value), prop.SerializationName ?? prop.Name) } }); } AddDocumentationComments(enumerationMember, prop.Documentation); type.Members.Add(enumerationMember); } if (enumeration.GenerateAllMember) { Expression initExpression = null; foreach (var member in type.Members) { Expression memberExpression = new TypeReference(type).CreateMemberReferenceExpression(member.Name); if (initExpression == null) { initExpression = memberExpression; } else { initExpression = new BinaryExpression(BinaryOperator.BitwiseOr, initExpression, memberExpression); } } var enumerationMember = new Framework.CodeDom.EnumerationMember(ToPropertyName("all"), initExpression); type.Members.Add(enumerationMember); } }