private void ProcessInterfaces(VirtualsDictionary virtuals, TypeReference typeRef) { var typeDef = typeRef.Resolve(); foreach (TypeReference iface in typeDef.Interfaces) { var ifaceDef = iface.Resolve(); var ifaceSet = GetSubclasses(ifaceDef); ifaceSet.Add(typeDef); ProcessMethodOverrides(virtuals, iface); } }
private void ProcessMethodOverrides(VirtualsDictionary virtuals, TypeReference baseRef) { if (virtuals.Count > 0) { var baseDef = baseRef.Resolve(); foreach (MethodDefinition baseMethod in baseDef.Methods) { if (baseMethod.IsVirtual) { var overridenMethod = virtuals.FindMethodBySignature(baseRef, baseMethod); if (overridenMethod != null) { var overrides = GetOverridesForVirtualMethod(baseMethod); overrides.Add(overridenMethod); } } } } }
public void ProcessType(TypeDefinition typeDef) { var virtuals = new VirtualsDictionary(); virtuals.CollectVirtualMethods(typeDef); var baseType = typeDef.BaseType; while (baseType != null) { var baseSet = GetSubclasses(baseType); baseSet.Add(typeDef); ProcessMethodOverrides(virtuals, baseType); ProcessInterfaces(virtuals, baseType); var baseDef = baseType.Resolve(); baseType = baseDef.BaseType; } ProcessInterfaces(virtuals, typeDef); foreach (var nestedType in typeDef.NestedTypes) { ProcessType(nestedType); } }