Skip to content

Commit 9cff432

Browse files
committed
Add renaming overridden methods automatically
1 parent 7f8de9d commit 9cff432

File tree

2 files changed

+35
-1
lines changed

2 files changed

+35
-1
lines changed

README.md

+1-1
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ dnSpy.Extension.EasyRename
44
A simple [dnSpy](https://github.com/dnSpyEx/dnSpy) extension for easily renaming members.
55

66
## Features
7-
- [ ] Rename overridden methods automatically.
7+
- [x] Rename overridden methods automatically.
88
- [x] Rename type when renaming a constructor method.
99

1010
### Warnings

dnSpy.Extension.EasyRename/Commands/RenameMemberCommand.cs

+34
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
using System;
22
using System.ComponentModel.Composition;
3+
using System.Linq;
34
using dnlib.DotNet;
45
using dnSpy.Contracts.App;
56
using dnSpy.Contracts.Documents.Tabs;
@@ -48,13 +49,46 @@ public override void Execute(IMenuItemContext context)
4849
if (isConstructor)
4950
member.DeclaringType.Name = newName;
5051
else
52+
{
53+
if (member is MethodDef method && (method.IsAbstract || method.IsVirtual))
54+
{
55+
foreach(var t in method.Module.GetTypes().Where(x => HasBaseType(x, method.DeclaringType, false)))
56+
{
57+
var @override = t.FindMethod(method.Name, method.MethodSig);
58+
if (@override is { IsVirtual: true })
59+
@override.Name = newName;
60+
}
61+
}
62+
5163
member.Name = newName;
64+
}
5265

5366
var moduleDocNode = _documentTabService.DocumentTreeView.FindNode(member.Module)!;
5467
_documentTabService.DocumentTreeView.TreeView.RefreshAllNodes();
5568
_documentTabService.RefreshModifiedDocument(moduleDocNode.Document);
5669
}
5770

71+
/// <summary>
72+
/// Checks whether a type implements a specific base type.
73+
/// </summary>
74+
/// <param name="type">The type to check on.</param>
75+
/// <param name="baseType">The base type to check for.</param>
76+
/// <param name="implicit">Whether to check the type itself against the base type as well.</param>
77+
/// <returns>Whether the type implements a specific base type.</returns>
78+
private static bool HasBaseType(ITypeDefOrRef type, ITypeDefOrRef baseType, bool @implicit = true)
79+
{
80+
var bt = @implicit ? type : type.GetBaseType();
81+
while (bt is not null)
82+
{
83+
if (bt.Equals(baseType))
84+
return true;
85+
86+
bt = bt.GetBaseType();
87+
}
88+
89+
return false;
90+
}
91+
5892
private static IMemberDef? GetMemberDef(IMenuItemContext context)
5993
{
6094
if (context.CreatorObject.Guid == new Guid(MenuConstants.GUIDOBJ_DOCUMENTVIEWERCONTROL_GUID))

0 commit comments

Comments
 (0)