Skip to content

Commit 6158b8a

Browse files
committed
Move refactorings away from FindTarget
Instead, an ISelectedDeclarationProvider is used to find the variable to refactor and containing members. This affects ReorderParameter and RemoveParameter, which now use the selected declaration, if it is an appropriate member and fall back to the containing member, otherwise.
1 parent c3e1731 commit 6158b8a

File tree

11 files changed

+103
-61
lines changed

11 files changed

+103
-61
lines changed

Rubberduck.Core/Navigation/RegexSearchReplace/RegexSearchReplace.cs

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
using Rubberduck.Common;
77
using Rubberduck.Parsing;
88
using Rubberduck.Parsing.Symbols;
9+
using Rubberduck.Parsing.VBA;
910
using Rubberduck.VBEditor;
1011
using Rubberduck.VBEditor.SafeComWrappers;
1112
using Rubberduck.VBEditor.SafeComWrappers.Abstract;
@@ -16,14 +17,16 @@ namespace Rubberduck.Navigation.RegexSearchReplace
1617
public class RegexSearchReplace : IRegexSearchReplace
1718
{
1819
private readonly IVBE _vbe;
19-
private readonly IParseCoordinator _parser;
20+
private readonly IDeclarationFinderProvider _declarationFinderProvider;
2021
private readonly ISelectionService _selectionService;
22+
private readonly ISelectedDeclarationProvider _selectedDeclarationProvider;
2123

22-
public RegexSearchReplace(IVBE vbe, IParseCoordinator parser, ISelectionService selectionService)
24+
public RegexSearchReplace(IVBE vbe, IDeclarationFinderProvider declarationFinderProvider, ISelectionService selectionService, ISelectedDeclarationProvider selectedDeclarationProvider)
2325
{
2426
_vbe = vbe;
25-
_parser = parser;
27+
_declarationFinderProvider = declarationFinderProvider;
2628
_selectionService = selectionService;
29+
_selectedDeclarationProvider = selectedDeclarationProvider;
2730
_search = new Dictionary<RegexSearchReplaceScope, Func<string, IEnumerable<RegexSearchResult>>>
2831
{
2932
{ RegexSearchReplaceScope.Selection, SearchSelection},
@@ -125,7 +128,6 @@ private List<RegexSearchResult> SearchCurrentBlock(string searchPattern)
125128
DeclarationType.PropertySet
126129
};
127130

128-
var state = _parser.State;
129131
using (var pane = _vbe.ActiveCodePane)
130132
{
131133
if (pane == null || pane.IsWrappingNullReference)
@@ -144,7 +146,8 @@ private List<RegexSearchResult> SearchCurrentBlock(string searchPattern)
144146
return new List<RegexSearchResult>();
145147
}
146148

147-
var block = (ParserRuleContext)state.AllDeclarations
149+
var block = (ParserRuleContext)_declarationFinderProvider.DeclarationFinder
150+
.AllDeclarations
148151
.FindTarget(qualifiedSelection.Value, declarationTypes)
149152
.Context
150153
.Parent;

Rubberduck.Core/UI/Command/Refactorings/RefactorRemoveParametersCommand.cs

Lines changed: 22 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
using System.Linq;
22
using System.Runtime.InteropServices;
3-
using Rubberduck.Common;
43
using Rubberduck.Parsing.Symbols;
54
using Rubberduck.Parsing.VBA;
65
using Rubberduck.Refactorings.RemoveParameters;
@@ -13,15 +12,18 @@ namespace Rubberduck.UI.Command.Refactorings
1312
public class RefactorRemoveParametersCommand : RefactorCodePaneCommandBase
1413
{
1514
private readonly RubberduckParserState _state;
15+
private readonly ISelectedDeclarationProvider _selectedDeclarationProvider;
1616

1717
public RefactorRemoveParametersCommand(
1818
RemoveParametersRefactoring refactoring,
1919
RemoveParameterFailedNotifier removeParameterFailedNotifier,
2020
RubberduckParserState state,
21-
ISelectionProvider selectionProvider)
21+
ISelectionProvider selectionProvider,
22+
ISelectedDeclarationProvider selectedDeclarationProvider)
2223
: base (refactoring, removeParameterFailedNotifier, selectionProvider, state)
2324
{
2425
_state = state;
26+
_selectedDeclarationProvider = selectedDeclarationProvider;
2527

2628
AddToCanExecuteEvaluation(SpecializedEvaluateCanExecute);
2729
}
@@ -34,26 +36,36 @@ private bool SpecializedEvaluateCanExecute(object parameter)
3436
return false;
3537
}
3638

37-
var member = _state.DeclarationFinder.AllUserDeclarations.FindTarget(activeSelection.Value, ValidDeclarationTypes);
38-
if (member == null)
39+
var member = GetTarget();
40+
if (member == null || _state.IsNewOrModified(member.QualifiedModuleName))
3941
{
4042
return false;
4143
}
4244

43-
if (_state.IsNewOrModified(member.QualifiedModuleName))
44-
{
45-
return false;
46-
}
47-
48-
var parameters = _state.DeclarationFinder.UserDeclarations(DeclarationType.Parameter)
45+
var parameters = _state.DeclarationFinder
46+
.UserDeclarations(DeclarationType.Parameter)
4947
.Where(item => member.Equals(item.ParentScopeDeclaration))
5048
.ToList();
49+
5150
return member.DeclarationType == DeclarationType.PropertyLet
5251
|| member.DeclarationType == DeclarationType.PropertySet
5352
? parameters.Count > 1
5453
: parameters.Any();
5554
}
5655

56+
private Declaration GetTarget()
57+
{
58+
var selectedDeclaration = _selectedDeclarationProvider.SelectedDeclaration();
59+
if (!ValidDeclarationTypes.Contains(selectedDeclaration.DeclarationType))
60+
{
61+
return selectedDeclaration.DeclarationType == DeclarationType.Parameter
62+
? _selectedDeclarationProvider.SelectedMember()
63+
: null;
64+
}
65+
66+
return selectedDeclaration;
67+
}
68+
5769
private static readonly DeclarationType[] ValidDeclarationTypes =
5870
{
5971
DeclarationType.Event,

Rubberduck.Core/UI/Command/Refactorings/RefactorReorderParametersCommand.cs

Lines changed: 25 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
using System.Linq;
22
using System.Runtime.InteropServices;
3-
using Rubberduck.Common;
43
using Rubberduck.Parsing.Symbols;
54
using Rubberduck.Parsing.VBA;
65
using Rubberduck.Refactorings.ReorderParameters;
@@ -13,38 +12,54 @@ namespace Rubberduck.UI.Command.Refactorings
1312
public class RefactorReorderParametersCommand : RefactorCodePaneCommandBase
1413
{
1514
private readonly RubberduckParserState _state;
15+
private readonly ISelectedDeclarationProvider _selectedDeclarationProvider;
1616

1717
public RefactorReorderParametersCommand(
1818
ReorderParametersRefactoring refactoring,
1919
ReorderParametersFailedNotifier reorderParametersFailedNotifier,
2020
RubberduckParserState state,
21-
ISelectionProvider selectionProvider)
21+
ISelectionProvider selectionProvider,
22+
ISelectedDeclarationProvider selectedDeclarationProvider)
2223
: base (refactoring, reorderParametersFailedNotifier, selectionProvider, state)
2324
{
2425
_state = state;
26+
_selectedDeclarationProvider = selectedDeclarationProvider;
2527

2628
AddToCanExecuteEvaluation(SpecializedEvaluateCanExecute);
2729
}
2830

2931
private bool SpecializedEvaluateCanExecute(object parameter)
3032
{
31-
var activeSelection = SelectionProvider.ActiveSelection();
32-
if (!activeSelection.HasValue)
33-
{
34-
return false;
35-
}
36-
var member = _state.AllUserDeclarations.FindTarget(activeSelection.Value, ValidDeclarationTypes);
33+
var member = GetTarget();
3734
if (member == null || _state.IsNewOrModified(member.QualifiedModuleName))
3835
{
3936
return false;
4037
}
4138

42-
var parameters = _state.DeclarationFinder.UserDeclarations(DeclarationType.Parameter).Where(item => member.Equals(item.ParentScopeDeclaration)).ToList();
43-
return (member.DeclarationType == DeclarationType.PropertyLet || member.DeclarationType == DeclarationType.PropertySet)
39+
var parameters = _state.DeclarationFinder
40+
.UserDeclarations(DeclarationType.Parameter)
41+
.Where(item => member.Equals(item.ParentScopeDeclaration))
42+
.ToList();
43+
44+
return member.DeclarationType == DeclarationType.PropertyLet
45+
|| member.DeclarationType == DeclarationType.PropertySet
4446
? parameters.Count > 2
4547
: parameters.Count > 1;
4648
}
4749

50+
private Declaration GetTarget()
51+
{
52+
var selectedDeclaration = _selectedDeclarationProvider.SelectedDeclaration();
53+
if (!ValidDeclarationTypes.Contains(selectedDeclaration.DeclarationType))
54+
{
55+
return selectedDeclaration.DeclarationType == DeclarationType.Parameter
56+
? _selectedDeclarationProvider.SelectedMember()
57+
: null;
58+
}
59+
60+
return selectedDeclaration;
61+
}
62+
4863
private static readonly DeclarationType[] ValidDeclarationTypes =
4964
{
5065
DeclarationType.Event,

Rubberduck.Refactorings/IntroduceParameter/IntroduceParameterRefactoring.cs

Lines changed: 4 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
using System.Collections.Generic;
22
using System.Linq;
3-
using Rubberduck.Common;
43
using Rubberduck.Interaction;
4+
using Rubberduck.Parsing;
55
using Rubberduck.Parsing.Grammar;
66
using Rubberduck.Parsing.Rewriter;
77
using Rubberduck.Parsing.Symbols;
@@ -20,15 +20,6 @@ public class IntroduceParameterRefactoring : RefactoringBase
2020
private readonly ISelectedDeclarationProvider _selectedDeclarationProvider;
2121
private readonly IMessageBox _messageBox;
2222

23-
private static readonly DeclarationType[] ValidDeclarationTypes =
24-
{
25-
DeclarationType.Function,
26-
DeclarationType.Procedure,
27-
DeclarationType.PropertyGet,
28-
DeclarationType.PropertyLet,
29-
DeclarationType.PropertySet
30-
};
31-
3223
public IntroduceParameterRefactoring(
3324
IDeclarationFinderProvider declarationFinderProvider,
3425
IMessageBox messageBox,
@@ -95,9 +86,7 @@ private void PromoteVariable(Declaration target)
9586

9687
private bool PromptIfMethodImplementsInterface(Declaration targetVariable)
9788
{
98-
var functionDeclaration = (ModuleBodyElementDeclaration)_declarationFinderProvider.DeclarationFinder
99-
.AllUserDeclarations
100-
.FindTarget(targetVariable.QualifiedSelection, ValidDeclarationTypes);
89+
var functionDeclaration = _selectedDeclarationProvider.SelectedMember(targetVariable.QualifiedSelection);
10190

10291
if (functionDeclaration == null || !functionDeclaration.IsInterfaceImplementation)
10392
{
@@ -120,12 +109,8 @@ private bool PromptIfMethodImplementsInterface(Declaration targetVariable)
120109

121110
private void UpdateSignature(Declaration targetVariable, IRewriteSession rewriteSession)
122111
{
123-
var functionDeclaration = (ModuleBodyElementDeclaration)_declarationFinderProvider.DeclarationFinder
124-
.AllUserDeclarations
125-
.FindTarget(targetVariable.QualifiedSelection, ValidDeclarationTypes);
126-
127-
var proc = (dynamic) functionDeclaration.Context;
128-
var paramList = (VBAParser.ArgListContext) proc.argList();
112+
var functionDeclaration = _selectedDeclarationProvider.SelectedMember(targetVariable.QualifiedSelection);
113+
var paramList = functionDeclaration.Context.GetChild<VBAParser.ArgListContext>();
129114

130115
if (functionDeclaration.DeclarationType.HasFlag(DeclarationType.Property))
131116
{

Rubberduck.Refactorings/RemoveParameters/RemoveParametersRefactoring.cs

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -16,22 +16,31 @@ namespace Rubberduck.Refactorings.RemoveParameters
1616
public class RemoveParametersRefactoring : InteractiveRefactoringBase<IRemoveParametersPresenter, RemoveParametersModel>
1717
{
1818
private readonly IDeclarationFinderProvider _declarationFinderProvider;
19+
private readonly ISelectedDeclarationProvider _selectedDeclarationProvider;
1920

2021
public RemoveParametersRefactoring(
2122
IDeclarationFinderProvider declarationFinderProvider,
2223
IRefactoringPresenterFactory factory,
2324
IRewritingManager rewritingManager,
24-
ISelectionProvider selectionProvider)
25+
ISelectionProvider selectionProvider,
26+
ISelectedDeclarationProvider selectedDeclarationProvider)
2527
:base(rewritingManager, selectionProvider, factory)
2628
{
2729
_declarationFinderProvider = declarationFinderProvider;
30+
_selectedDeclarationProvider = selectedDeclarationProvider;
2831
}
2932

3033
protected override Declaration FindTargetDeclaration(QualifiedSelection targetSelection)
3134
{
32-
return _declarationFinderProvider.DeclarationFinder
33-
.AllUserDeclarations
34-
.FindTarget(targetSelection, ValidDeclarationTypes);
35+
var selectedDeclaration = _selectedDeclarationProvider.SelectedDeclaration(targetSelection);
36+
if (!ValidDeclarationTypes.Contains(selectedDeclaration.DeclarationType))
37+
{
38+
return selectedDeclaration.DeclarationType == DeclarationType.Parameter
39+
? _selectedDeclarationProvider.SelectedMember(targetSelection)
40+
: null;
41+
}
42+
43+
return selectedDeclaration;
3544
}
3645

3746
protected override RemoveParametersModel InitializeModel(Declaration target)

Rubberduck.Refactorings/ReorderParameters/ReorderParametersRefactoring.cs

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -15,22 +15,31 @@ namespace Rubberduck.Refactorings.ReorderParameters
1515
public class ReorderParametersRefactoring : InteractiveRefactoringBase<IReorderParametersPresenter, ReorderParametersModel>
1616
{
1717
private readonly IDeclarationFinderProvider _declarationFinderProvider;
18+
private readonly ISelectedDeclarationProvider _selectedDeclarationProvider;
1819

1920
public ReorderParametersRefactoring(
2021
IDeclarationFinderProvider declarationFinderProvider,
2122
IRefactoringPresenterFactory factory,
2223
IRewritingManager rewritingManager,
23-
ISelectionProvider selectionProvider)
24+
ISelectionProvider selectionProvider,
25+
ISelectedDeclarationProvider selectedDeclarationProvider)
2426
:base(rewritingManager, selectionProvider, factory)
2527
{
2628
_declarationFinderProvider = declarationFinderProvider;
29+
_selectedDeclarationProvider = selectedDeclarationProvider;
2730
}
2831

2932
protected override Declaration FindTargetDeclaration(QualifiedSelection targetSelection)
3033
{
31-
return _declarationFinderProvider.DeclarationFinder
32-
.AllUserDeclarations
33-
.FindTarget(targetSelection, ValidDeclarationTypes);
34+
var selectedDeclaration = _selectedDeclarationProvider.SelectedDeclaration(targetSelection);
35+
if (!ValidDeclarationTypes.Contains(selectedDeclaration.DeclarationType))
36+
{
37+
return selectedDeclaration.DeclarationType == DeclarationType.Parameter
38+
? _selectedDeclarationProvider.SelectedMember(targetSelection)
39+
: null;
40+
}
41+
42+
return selectedDeclaration;
3443
}
3544

3645
protected override ReorderParametersModel InitializeModel(Declaration target)

RubberduckTests/Commands/RefactorCommands/RemoveParametersCommandTests.cs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -163,9 +163,10 @@ protected override CommandBase TestCommand(IVBE vbe, RubberduckParserState state
163163
{
164164
var msgBox = new Mock<IMessageBox>().Object;
165165
var factory = new Mock<IRefactoringPresenterFactory>().Object;
166-
var refactoring = new RemoveParametersRefactoring(state, factory, rewritingManager, selectionService);
166+
var selectedDeclarationProvider = new SelectedDeclarationProvider(selectionService, state);
167+
var refactoring = new RemoveParametersRefactoring(state, factory, rewritingManager, selectionService, selectedDeclarationProvider);
167168
var notifier = new RemoveParameterFailedNotifier(msgBox);
168-
return new RefactorRemoveParametersCommand(refactoring, notifier, state, selectionService);
169+
return new RefactorRemoveParametersCommand(refactoring, notifier, state, selectionService, selectedDeclarationProvider);
169170
}
170171

171172
protected override IVBE SetupAllowingExecution()

RubberduckTests/Commands/RefactorCommands/ReorderParametersCommandTests.cs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -163,9 +163,10 @@ protected override CommandBase TestCommand(IVBE vbe, RubberduckParserState state
163163
{
164164
var factory = new Mock<IRefactoringPresenterFactory>().Object;
165165
var msgBox = new Mock<IMessageBox>().Object;
166-
var refactoring = new ReorderParametersRefactoring(state, factory, rewritingManager, selectionService);
166+
var selectedDeclarationProvider = new SelectedDeclarationProvider(selectionService, state);
167+
var refactoring = new ReorderParametersRefactoring(state, factory, rewritingManager, selectionService, selectedDeclarationProvider);
167168
var notifier = new ReorderParametersFailedNotifier(msgBox);
168-
return new RefactorReorderParametersCommand(refactoring, notifier, state, selectionService);
169+
return new RefactorReorderParametersCommand(refactoring, notifier, state, selectionService, selectedDeclarationProvider);
169170
}
170171

171172
protected override IVBE SetupAllowingExecution()

RubberduckTests/QuickFixes/RemoveUnusedParameterQuickFixTests.cs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
using Moq;
55
using Rubberduck.Inspections.Concrete;
66
using Rubberduck.Inspections.QuickFixes;
7+
using Rubberduck.Parsing.VBA;
78
using RubberduckTests.Mocks;
89
using Rubberduck.Refactorings;
910
using Rubberduck.Refactorings.RemoveParameters;
@@ -39,7 +40,8 @@ Private Sub Foo()
3940
var selectionService = MockedSelectionService();
4041

4142
var factory = new Mock<IRefactoringPresenterFactory>().Object;
42-
var refactoring = new RemoveParametersRefactoring(state, factory, rewritingManager, selectionService);
43+
var selectedDeclarationProvider = new SelectedDeclarationProvider(selectionService, state);
44+
var refactoring = new RemoveParametersRefactoring(state, factory, rewritingManager, selectionService, selectedDeclarationProvider);
4345
new RemoveUnusedParameterQuickFix(refactoring)
4446
.Fix(inspectionResults.First(), rewriteSession);
4547
Assert.AreEqual(expectedCode, component.CodeModule.Content());

RubberduckTests/Refactoring/RemoveParametersTests.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1579,7 +1579,8 @@ private static (string code, Selection selection) CodeFromCodeStringLike(string
15791579
protected override IRefactoring TestRefactoring(IRewritingManager rewritingManager, RubberduckParserState state,
15801580
IRefactoringPresenterFactory factory, ISelectionService selectionService)
15811581
{
1582-
return new RemoveParametersRefactoring(state, factory, rewritingManager, selectionService);
1582+
var selectedDeclarationProvider = new SelectedDeclarationProvider(selectionService, state);
1583+
return new RemoveParametersRefactoring(state, factory, rewritingManager, selectionService, selectedDeclarationProvider);
15831584
}
15841585
}
15851586
}

0 commit comments

Comments
 (0)