void MapInterfaceMethodsInTypeHierarchy(TypeDefinition type) { if (!type.HasInterfaces) { return; } foreach (var @interface in type.Interfaces) { var interfaceType = @interface.InterfaceType; var iface = interfaceType.Resolve(); if (iface == null || !iface.HasMethods) { continue; } foreach (MethodDefinition interfaceMethod in iface.Methods) { if (TryMatchMethod(type, interfaceMethod) != null) { continue; } var @base = GetBaseMethodInTypeHierarchy(type, interfaceMethod); if (@base != null) { AnnotateMethods(interfaceMethod, @base, @interface); } if (interfaceType is GenericInstanceType genericInterfaceInstance) { var genericContext = new Inflater.GenericContext(genericInterfaceInstance, null); var baseInflated = GetBaseInflatedInterfaceMethodInTypeHierarchy(genericContext, type, interfaceMethod); if (baseInflated != null) { Annotations.AddOverride(interfaceMethod, baseInflated, @interface); } } } } }
void AnnotateMethods(MethodDefinition @base, MethodDefinition @override) { Annotations.AddBaseMethod(@override, @base); Annotations.AddOverride(@base, @override); }
void AnnotateMethods(MethodDefinition @base, MethodDefinition @override, InterfaceImplementation matchingInterfaceImplementation = null) { Annotations.AddBaseMethod(@override, @base); Annotations.AddOverride(@base, @override, matchingInterfaceImplementation); }