Skip to content

Commit 9899856

Browse files
committed
Closes #372
1 parent 88cde47 commit 9899856

File tree

4 files changed

+77
-3
lines changed

4 files changed

+77
-3
lines changed

RetailCoder.VBE/UI/Refactorings/Rename/RenamePresenter.cs

Lines changed: 54 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,10 @@ public RenamePresenter(VBE vbe, IRenameView view, Declarations declarations, Qua
3232
public void Show()
3333
{
3434
AcquireTarget(_selection);
35-
_view.ShowDialog();
35+
if (_view.Target != null)
36+
{
37+
_view.ShowDialog();
38+
}
3639
}
3740

3841
private static readonly DeclarationType[] ModuleDeclarationTypes =
@@ -62,7 +65,7 @@ private void RenameModule()
6265
var module = _vbe.FindCodeModules(_view.Target.QualifiedName.QualifiedModuleName).Single();
6366
module.Name = _view.NewName;
6467
}
65-
catch (COMException exception)
68+
catch (COMException)
6669
{
6770
MessageBox.Show(RubberduckUI.RenameDialog_ModuleRenameError, RubberduckUI.RenameDialog_Caption);
6871
}
@@ -78,6 +81,34 @@ private void RenameDeclaration()
7881

7982
private void RenameUsages()
8083
{
84+
// todo: refactor
85+
86+
// rename interface member
87+
if (_declarations.FindInterfaceMembers().Contains(_view.Target))
88+
{
89+
var implementations = _declarations.FindInterfaceImplementationMembers()
90+
.Where(m => m.IdentifierName == _view.Target.ComponentName + '_' + _view.Target.IdentifierName);
91+
92+
foreach (var member in implementations)
93+
{
94+
try
95+
{
96+
var newMemberName = _view.Target.ComponentName + '_' + _view.NewName;
97+
var module = member.Project.VBComponents.Item(member.ComponentName).CodeModule;
98+
99+
var content = module.get_Lines(member.Selection.StartLine, 1);
100+
var newContent = GetReplacementLine(content, member.IdentifierName, newMemberName);
101+
module.ReplaceLine(member.Selection.StartLine, newContent);
102+
}
103+
catch (COMException)
104+
{
105+
// gulp
106+
}
107+
}
108+
109+
return;
110+
}
111+
81112
var modules = _view.Target.References.GroupBy(r => r.QualifiedModuleName);
82113
foreach (var grouping in modules)
83114
{
@@ -89,6 +120,7 @@ private void RenameUsages()
89120
module.ReplaceLine(line.Key, newContent);
90121
}
91122

123+
// renaming interface
92124
if (grouping.Any(reference => reference.Context.Parent is VBAParser.ImplementsStmtContext))
93125
{
94126
var members = _declarations.FindMembers(_view.Target);
@@ -128,11 +160,30 @@ private string GetReplacementLine(string content, string target, string newName)
128160

129161
private void AcquireTarget(QualifiedSelection selection)
130162
{
131-
_view.Target = _declarations.Items
163+
var target = _declarations.Items
132164
.Where(item => item.DeclarationType != DeclarationType.ModuleOption)
133165
.FirstOrDefault(item => IsSelectedDeclaration(selection, item)
134166
|| IsSelectedReference(selection, item));
135167

168+
var interfaceImplementation = _declarations.FindInterfaceImplementationMembers().SingleOrDefault(m => m.Equals(target));
169+
if (target != null && interfaceImplementation != null)
170+
{
171+
var interfaceMember = _declarations.FindInterfaceMember(interfaceImplementation);
172+
var message = string.Format(RubberduckUI.RenamePresenter_TargetIsInterfaceMemberImplementation, target.IdentifierName, interfaceMember.ComponentName, interfaceMember.IdentifierName);
173+
var confirm = MessageBox.Show(message, RubberduckUI.RenameDialog_TitleText, MessageBoxButtons.YesNo, MessageBoxIcon.Exclamation);
174+
if (confirm == DialogResult.No)
175+
{
176+
_view.Target = null;
177+
return;
178+
}
179+
180+
_view.Target = interfaceMember;
181+
}
182+
else
183+
{
184+
_view.Target = target;
185+
}
186+
136187
if (_view.Target == null)
137188
{
138189
// rename the containing procedure:

RetailCoder.VBE/UI/RubberduckUI.Designer.cs

Lines changed: 9 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

RetailCoder.VBE/UI/RubberduckUI.resx

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -191,4 +191,8 @@
191191
<data name="RenameDialog_TitleText" xml:space="preserve">
192192
<value>Rename identifier</value>
193193
</data>
194+
<data name="RenamePresenter_TargetIsInterfaceMemberImplementation" xml:space="preserve">
195+
<value>Method '{0}' implements '{1}.{2}'. Rename the interface member?</value>
196+
<comment>0: Selected target; 1: Interface name; 2: Interface member name</comment>
197+
</data>
194198
</root>

Rubberduck.Parsing/Symbols/Declarations.cs

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -97,5 +97,15 @@ public IEnumerable<Declaration> FindInterfaceImplementationMembers()
9797

9898
return _interfaceImplementationMembers;
9999
}
100+
101+
public Declaration FindInterfaceMember(Declaration implementation)
102+
{
103+
var members = FindInterfaceMembers();
104+
var matches = members.Where(m => implementation.IdentifierName == m.ComponentName + '_' + m.IdentifierName).ToList();
105+
106+
return matches.Count > 1
107+
? matches.SingleOrDefault(m => m.Project == implementation.Project)
108+
: matches.First();
109+
}
100110
}
101111
}

0 commit comments

Comments
 (0)