using System.Linq; using Mono.Cecil; namespace Mono.Documentation.Updater { /// Flags enum formatter that assumes powers of two values. /// As described here: https://msdn.microsoft.com/en-us/library/vstudio/ms229062(v=vs.100).aspx class StandardFlagsEnumFormatter : AttributeValueFormatter { public override bool TryFormatValue (object v, ResolvedTypeInfo type, out string returnvalue) { TypeReference valueType = type.Reference; TypeDefinition valueDef = type.Definition; if (valueDef.CustomAttributes.Any (ca => ca.AttributeType.FullName == "System.FlagsAttribute")) { string typename = MDocUpdater.GetDocTypeFullName (valueType); var values = MDocUpdater.GetEnumerationValues (valueDef); long c = MDocUpdater.ToInt64 (v); returnvalue = string.Join (" | ", (from i in values.Keys where (c & i) == i && i != 0 select typename + "." + values[i]) .DefaultIfEmpty (c.ToString ()).ToArray ()); return true; } returnvalue = null; return false; } } }