예제 #1
0
        public static OneOrMany <EnumFieldInfo> GetConstituentFields(object value, INamedTypeSymbol enumType)
        {
            ImmutableArray <EnumFieldInfo> fields = GetFields(enumType);

            ulong valueAsULong = GetValueAsUInt64(value, enumType);

            if (!enumType.HasAttribute(MetadataNames.System_FlagsAttribute) ||
                valueAsULong == 0)
            {
                return(OneOrMany.Create(FindField(fields, valueAsULong)));
            }

            return(GetConstituentFields(valueAsULong, fields));
        }
예제 #2
0
        public static OneOrMany <EnumFieldSymbolInfo> GetConstituentFields(object value, INamedTypeSymbol enumType)
        {
            EnumSymbolInfo enumInfo = EnumSymbolInfo.Create(enumType);

            ulong convertedValue = SymbolUtility.GetEnumValueAsUInt64(value, enumType);

            if (!enumType.HasAttribute(MetadataNames.System_FlagsAttribute) ||
                convertedValue == 0)
            {
                return(OneOrMany.Create(FindField(enumInfo, convertedValue)));
            }

            return(GetConstituentFields(convertedValue, enumInfo));
        }
예제 #3
0
        public static OneOrMany <EnumFieldInfo> GetConstituentFields(ulong value, ImmutableArray <EnumFieldInfo> fields)
        {
            ImmutableArray <EnumFieldInfo> .Builder builder = null;

            ulong result = value;

            for (int i = fields.Length - 1; i >= 0; i--)
            {
                ulong val = fields[i].Value;

                if (val != 0 &&
                    (result & val) == val)
                {
                    if (builder == null)
                    {
                        if (result == val)
                        {
                            return(OneOrMany.Create(fields[i]));
                        }

                        builder = ImmutableArray.CreateBuilder <EnumFieldInfo>();
                    }

                    builder.Add(fields[i]);

                    result -= val;

                    if (result == 0)
                    {
                        break;
                    }
                }
            }

            if (result == 0 &&
                builder != null)
            {
                builder.Reverse();

                return(OneOrMany.Create(builder.ToImmutableArray()));
            }

            return(default);