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)); }
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)); }
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);