void CreateInterfaceImplementations(IMember currentMember, ParametrizedNode memberDecl, List<InterfaceImplementation> interfaceImplementations)
{
if (currentMember != null
&& (memberDecl.Modifier & Modifiers.Visibility) == Modifiers.None
&& interfaceImplementations.Count == 1)
{
// member is explicitly implementing an interface member
// to convert explicit interface implementations to VB, make the member private
// and ensure its name does not collide with another member
memberDecl.Modifier |= Modifiers.Private;
memberDecl.Name = interfaceImplementations[0].InterfaceType.Type.Replace('.', '_') + "_" + memberDecl.Name;
}
if (currentMember != null && currentMember.IsPublic
&& currentMember.DeclaringType.ClassType != ClassType.Interface)
{
// member could be implicitly implementing an interface member,
// search for interfaces containing the member
foreach (IReturnType directBaseType in currentMember.DeclaringType.GetCompoundClass().BaseTypes) {
IClass directBaseClass = directBaseType.GetUnderlyingClass();
if (directBaseClass != null && directBaseClass.ClassType == ClassType.Interface) {
// include members inherited from other interfaces in the search:
foreach (IReturnType baseType in MemberLookupHelper.GetTypeInheritanceTree(directBaseType)) {
IClass baseClass = baseType.GetUnderlyingClass();
if (baseClass != null && baseClass.ClassType == ClassType.Interface) {
IMember similarMember = MemberLookupHelper.FindSimilarMember(baseClass, currentMember);
// add an interface implementation for similarMember
// only when similarMember is not explicitly implemented by another member in this class
if (similarMember != null && !HasExplicitImplementationFor(similarMember, baseType, memberDecl.Parent)) {
interfaceImplementations.Add(new InterfaceImplementation(
Refactoring.CodeGenerator.ConvertType(baseType, CreateContext()),
currentMember.Name));
}
}
}
}
}
}
}