Example #1
0
        public static void AddMetadataAttributesForSet(CodeTypeDeclaration type, OptionSetMetadataBase osMetadata)
        {
            if (!AddOptionSetMetadataAttribute)
            {
                return;
            }

            Trace.TraceInformation("Adding MetadataAttributes for {0}", type.Name);
            var options           = osMetadata.GetOptions();
            var metadataByValue   = options.ToDictionary(k => k.Value);
            var orderIndexByValue = new Dictionary <int, int>();

            for (var i = 0; i < options.Count; i++)
            {
                if (options[i].Value is int intValue)
                {
                    orderIndexByValue.Add(intValue, i);
                }
                else
                {
                    Trace.TraceInformation("Unable to find orderIndexByValue for {0}", type.Name);
                }
            }

            for (var i = 0; i < type.Members.Count; i++)
            {
                var value = type.Members[i] as CodeMemberField;
                if (value != null &&
                    value.InitExpression is CodePrimitiveExpression primitive &&
                    primitive.Value is int intValue &&
                    metadataByValue.TryGetValue(intValue, out var metadata))
                {
                    var attribute = new CodeAttributeDeclaration("OptionSetMetadataAttribute",
                                                                 new CodeAttributeArgument(new CodePrimitiveExpression(metadata.Label.GetLocalOrDefaultText())),
                                                                 new CodeAttributeArgument(new CodePrimitiveExpression(orderIndexByValue[intValue]))
                                                                 );
                    var optionalArs = new Stack <string>(new []
                    {
                        metadata.Color,
                        metadata.Description.GetLocalOrDefaultText(),
                        metadata.ExternalValue
                    });

                    while (optionalArs.Count > 0 && string.IsNullOrWhiteSpace(optionalArs.Peek()))
                    {
                        optionalArs.Pop();
                    }

                    if (optionalArs.Count > 0)
                    {
                        attribute.Arguments.AddRange(
                            optionalArs.Select(v => new CodeAttributeArgument(new CodePrimitiveExpression(v)))
                            .Reverse().ToArray()
                            );
                    }

                    value.CustomAttributes.Add(attribute);
                }
Example #2
0
        /// <summary>
        /// Checks to make sure that the name does not already exist for the OptionSet to be generated.
        /// </summary>
        private Dictionary <string, bool> GetDuplicateNameValues(OptionSetMetadataBase metadata, IServiceProvider services)
        {
            var nameValueDups = new Dictionary <string, bool>();

            // Look through all options, populating the namesAndValues Collection
            foreach (var option in metadata.GetOptions())
            {
                var name = GetPossiblyDuplicateNameForOption(metadata, services, option);

                nameValueDups[name] = nameValueDups.ContainsKey(name);

                if (metadata.OptionSetType == OptionSetType.Status)
                {
                    // For Statuses, also do State
                    name = AppendState(option, name);
                    nameValueDups[name] = nameValueDups.ContainsKey(name);
                }
            }
            return(nameValueDups);
        }
Example #3
0
        /// <summary>
        /// Appends the value of the optionset for options with duplicatenames.
        /// </summary>
        /// <param name="optionSetMetadata">The option set metadata.</param>
        /// <param name="name">The name.</param>
        /// <param name="value">The value.</param>
        /// <param name="services">The services.</param>
        /// <returns></returns>
        private string AppendValueForDuplicateOptionSetValueNames(OptionSetMetadataBase optionSetMetadata, string name, int?value, IServiceProvider services)
        {
            Dictionary <string, bool> duplicateNameValues;

            if (!OptionNameValueDuplicates.TryGetValue(optionSetMetadata, out duplicateNameValues))
            {
                // Only do the work of determining all of the names and their values once.
                duplicateNameValues = GetDuplicateNameValues(optionSetMetadata, services);
                OptionNameValueDuplicates[optionSetMetadata] = duplicateNameValues;
            }

            if (!duplicateNameValues[name])
            {
                // No Dup, return
                return(name);
            }

            if (optionSetMetadata.OptionSetType == OptionSetType.Status)
            {
                name = AppendState(optionSetMetadata.GetOptions().Single(o => o.Value == value), name);
                if (!duplicateNameValues[name])
                {
                    // Appended with State, No Dup, return
                    return(name);
                }
            }

            // Postfix name with numerical value
            if (value < 0)
            {
                // Handle Negativives
                {
                    name += "_neg" + Math.Abs(value.GetValueOrDefault());
                    return(name);
                }
            }
            name += "_" + value;
            return(name);
        }
        /// <summary>
        /// Appends the value of the optionset for options with duplicatenames.
        /// </summary>
        /// <param name="optionSetMetadata">The option set metadata.</param>
        /// <param name="name">The name.</param>
        /// <param name="value">The value.</param>
        /// <param name="services">The services.</param>
        /// <returns></returns>
        private string AppendValueForDuplicateOptionSetValueNames(OptionSetMetadataBase optionSetMetadata, string name, int? value, IServiceProvider services)
        {
            Dictionary<string, bool> duplicateNameValues;
            if (!OptionNameValueDuplicates.TryGetValue(optionSetMetadata, out duplicateNameValues))
            {
                // Only do the work of determining all of the names and their values once.
                duplicateNameValues = GetDuplicateNameValues(optionSetMetadata, services);
                OptionNameValueDuplicates[optionSetMetadata] = duplicateNameValues;
            }

            if (!duplicateNameValues[name])
            {
                // No Dup, return
                return name;
            }

            if (optionSetMetadata.OptionSetType == OptionSetType.Status)
            {
                name = AppendState(optionSetMetadata.GetOptions().Single(o => o.Value == value), name);
                if (!duplicateNameValues[name])
                {
                    // Appended with State, No Dup, return
                    return name;
                }
            }

            // Postfix name with numerical value
            if (value < 0)
            {
                // Handle Negativives
                {
                    name += "_neg" + Math.Abs(value.GetValueOrDefault());
                    return name;
                }
            }
            name += "_" + value;
            return name;
        }
        /// <summary>
        /// Checks to make sure that the name does not already exist for the OptionSetto be generated.
        /// </summary>
        private Dictionary<string, bool> GetDuplicateNameValues(OptionSetMetadataBase metadata, IServiceProvider services)
        {
            var nameValueDups = new Dictionary<string, bool>();
            // Look through all options, populating the namesAndValues Collection
            foreach (var option in metadata.GetOptions())
            {
                var defaultName = DefaultService.GetNameForOption(metadata, option, services);

                defaultName = Transliterate(option, defaultName);

                var name = GetValidCSharpName(defaultName);

                nameValueDups[name] = nameValueDups.ContainsKey(name);

                if (metadata.OptionSetType == OptionSetType.Status)
                {
                    // For Statuses, also do State
                    name = AppendState(option, name);
                    nameValueDups[name] = nameValueDups.ContainsKey(name);
                }
            }
            return nameValueDups;
        }