/// <summary> /// Loads all members from a target model that implements <see cref="IDotNetContainer"/> and returns all members and the comparison hash code for each member. /// </summary> /// <param name="source">The target container to load members from.</param> /// <param name="comparisonType">The type of hash code to build for comparision. Default comparison type is set to the base comparison. </param> /// <returns>List of all the hash codes and the members for each hashcode.</returns> /// <exception cref="ArgumentNullException">Thrown if the source container is null.</exception> public static IReadOnlyList <KeyValuePair <int, IDotNetMember> > FormatCSharpComparisonMembers( this IDotNetContainer source, MemberComparisonType comparisonType = MemberComparisonType.Base) { if (source == null) { throw new ArgumentNullException(nameof(source)); } if (!source.Members.Any()) { return(ImmutableList <KeyValuePair <int, IDotNetMember> > .Empty); } List <KeyValuePair <int, IDotNetMember> > result = new List <KeyValuePair <int, IDotNetMember> >(); var members = source.Members.Select(m => new KeyValuePair <int, IDotNetMember>(m.FormatCSharpMemberComparisonHashCode(comparisonType), m)); result.AddRange(members); switch (source.ContainerType) { case DotNetContainerType.Interface: var interfaceContainer = source as IDotNetInterface; if (interfaceContainer?.InheritedInterfaces != null) { foreach (var inheritedInterface in interfaceContainer.InheritedInterfaces) { var interfaceMembers = inheritedInterface.FormatCSharpComparisonMembers(comparisonType); if (interfaceMembers.Any()) { result.AddRange(interfaceMembers); } } } break; case DotNetContainerType.Class: var classContainer = source as IDotNetClass; if (classContainer?.BaseClass != null) { var baseMembers = classContainer.BaseClass.FormatCSharpComparisonMembers(comparisonType); if (baseMembers.Any()) { result.AddRange(baseMembers); } } break; } return(result.ToImmutableArray()); }
/// <summary> /// Creates a list of the interface members that are not implemented in the <see cref="IDotNetContainer"/> model. /// </summary> /// <param name="source">The source model to check.</param> /// <returns>List of models that are missing or an empty list if there are no missing members.</returns> /// <exception cref="ArgumentNullException">Throws an argument null exception if the model does not exist.</exception> private static IReadOnlyList <IDotNetMember> MissingContainerInterfaceMembers(IDotNetContainer source) { if (source == null) { throw new ArgumentNullException(nameof(source)); } if (source.ContainerType == DotNetContainerType.Interface) { return(ImmutableList <IDotNetMember> .Empty); } if (source.InheritedInterfaces == null) { return(ImmutableList <IDotNetMember> .Empty); } var sourceMembers = source.FormatCSharpComparisonMembers(MemberComparisonType.Security); var interfaceMembers = new Dictionary <int, IDotNetMember>(); foreach (var inheritedInterface in source.InheritedInterfaces) { var compareMembers = inheritedInterface.FormatCSharpComparisonMembers(MemberComparisonType.Security); if (!compareMembers.Any()) { continue; } foreach (var compareMember in compareMembers) { if (!interfaceMembers.ContainsKey(compareMember.Key)) { interfaceMembers.Add(compareMember.Key, compareMember.Value); } } } if (!interfaceMembers.Any()) { return(ImmutableList <IDotNetMember> .Empty); } return((from interfaceMember in interfaceMembers where !sourceMembers.Any(m => m.Key == interfaceMember.Key) select interfaceMember.Value).ToImmutableList()); }