Пример #1
0
        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);
        }
Пример #2
0
        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);
            }
        }