Skip to content

Commit 9075d18

Browse files
committed
Make FindAllImplementations use an ISelectedDeclarationProvider
1 parent 841f4bc commit 9075d18

File tree

4 files changed

+45
-48
lines changed

4 files changed

+45
-48
lines changed

Rubberduck.Core/UI/Command/ComCommands/FindAllImplementationsCommand.cs

Lines changed: 14 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
using Rubberduck.Parsing.VBA;
44
using Rubberduck.UI.Controls;
55
using Rubberduck.VBEditor.Events;
6-
using Rubberduck.VBEditor.SafeComWrappers.Abstract;
6+
using Rubberduck.VBEditor.Utility;
77

88
namespace Rubberduck.UI.Command.ComCommands
99
{
@@ -13,47 +13,39 @@ namespace Rubberduck.UI.Command.ComCommands
1313
[ComVisible(false)]
1414
public class FindAllImplementationsCommand : ComCommandBase
1515
{
16-
private readonly RubberduckParserState _state;
17-
private readonly IVBE _vbe;
16+
private readonly ISelectedDeclarationService _selectedDeclarationService;
17+
private readonly IParserStatusProvider _parserStatusProvider;
1818
private readonly FindAllImplementationsService _finder;
1919

2020
public FindAllImplementationsCommand(
21-
RubberduckParserState state,
22-
IVBE vbe,
21+
IParserStatusProvider parserStatusProvider,
22+
ISelectedDeclarationService selectedDeclarationService,
2323
ISearchResultsWindowViewModel viewModel,
2424
FindAllImplementationsService finder,
2525
IVbeEvents vbeEvents)
2626
: base(vbeEvents)
2727
{
2828
_finder = finder;
29-
_state = state;
30-
_vbe = vbe;
29+
_selectedDeclarationService = selectedDeclarationService;
30+
_parserStatusProvider = parserStatusProvider;
3131

3232
AddToCanExecuteEvaluation(SpecialEvaluateCanExecute);
3333
}
3434

3535
private bool SpecialEvaluateCanExecute(object parameter)
3636
{
37-
if (_state.Status != ParserState.Ready)
37+
if (_parserStatusProvider.Status != ParserState.Ready)
3838
{
3939
return false;
4040
}
4141

42-
using (var codePane = _vbe.ActiveCodePane)
43-
{
44-
if (codePane == null || codePane.IsWrappingNullReference)
45-
{
46-
return false;
47-
}
48-
49-
var target = FindTarget(parameter);
50-
return _finder.CanFind(target);
51-
}
42+
var target = FindTarget(parameter);
43+
return target != null && _finder.CanFind(target);
5244
}
5345

5446
protected override void OnExecute(object parameter)
5547
{
56-
if (_state.Status != ParserState.Ready)
48+
if (_parserStatusProvider.Status != ParserState.Ready)
5749
{
5850
return;
5951
}
@@ -74,10 +66,9 @@ private Declaration FindTarget(object parameter)
7466
return declaration;
7567
}
7668

77-
using (var activePane = _vbe.ActiveCodePane)
78-
{
79-
return _state.FindSelectedDeclaration(activePane);
80-
}
69+
var selectedDeclaration = _selectedDeclarationService.SelectedDeclaration();
70+
71+
return selectedDeclaration;
8172
}
8273
}
8374
}

Rubberduck.Core/UI/SelectionChangeService.cs

Lines changed: 26 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
using System;
22
using System.Linq;
33
using System.Threading.Tasks;
4-
using Rubberduck.Parsing;
54
using Rubberduck.Parsing.Symbols;
5+
using Rubberduck.Parsing.VBA;
66
using Rubberduck.VBEditor.Events;
77
using Rubberduck.VBEditor.SafeComWrappers;
88
using Rubberduck.VBEditor.SafeComWrappers.Abstract;
@@ -24,11 +24,13 @@ public class SelectionChangeService : ISelectionChangeService, IDisposable
2424

2525
private Declaration _lastSelectedDeclaration;
2626
private readonly IVBE _vbe;
27-
private readonly IParseCoordinator _parser;
27+
private readonly IDeclarationFinderProvider _declarationFinderProvider;
28+
private readonly ISelectedDeclarationService _selectedDeclarationService;
2829

29-
public SelectionChangeService(IVBE vbe, IParseCoordinator parser)
30+
public SelectionChangeService(IVBE vbe, IDeclarationFinderProvider declarationFinderProvider, ISelectedDeclarationService selectedDeclarationService)
3031
{
31-
_parser = parser;
32+
_declarationFinderProvider = declarationFinderProvider;
33+
_selectedDeclarationService = selectedDeclarationService;
3234
_vbe = vbe;
3335
VbeNativeServices.SelectionChanged += OnVbeSelectionChanged;
3436
VbeNativeServices.WindowFocusChange += OnVbeFocusChanged;
@@ -38,15 +40,9 @@ private void OnVbeSelectionChanged(object sender, EventArgs e)
3840
{
3941
Task.Run(() =>
4042
{
41-
using (var active = _vbe.ActiveCodePane)
42-
{
43-
if (active == null)
44-
{
45-
return;
46-
}
47-
var eventArgs = new DeclarationChangedEventArgs(_vbe, _parser.State.FindSelectedDeclaration(active));
48-
DispatchSelectedDeclaration(eventArgs);
49-
}
43+
var selectedDeclaration = _selectedDeclarationService.SelectedDeclaration();
44+
var eventArgs = new DeclarationChangedEventArgs(_vbe, selectedDeclaration);
45+
DispatchSelectedDeclaration(eventArgs);
5046
});
5147
}
5248

@@ -71,8 +67,15 @@ private void OnVbeFocusChanged(object sender, WindowChangedEventArgs e)
7167
{
7268
using (var pane = VbeNativeServices.GetCodePaneFromHwnd(e.Hwnd))
7369
{
74-
DispatchSelectedDeclaration(
75-
new DeclarationChangedEventArgs(_vbe, _parser.State.FindSelectedDeclaration(pane)));
70+
var selection = pane.GetQualifiedSelection();
71+
if (!selection.HasValue)
72+
{
73+
return;
74+
}
75+
76+
var selectedDeclaration = _selectedDeclarationService.SelectedDeclaration(selection.Value);
77+
var eventArgs = new DeclarationChangedEventArgs(_vbe, selectedDeclaration);
78+
DispatchSelectedDeclaration(eventArgs);
7679
}
7780
});
7881
break;
@@ -125,7 +128,7 @@ private void DispatchSelectedDesignerDeclaration(IVBComponent component)
125128
{
126129
var name = selected.Single().Name;
127130
var control =
128-
_parser.State.DeclarationFinder.MatchName(name)
131+
_declarationFinderProvider.DeclarationFinder?.MatchName(name)
129132
.SingleOrDefault(d => d.DeclarationType == DeclarationType.Control
130133
&& d.ProjectId == parent.ProjectId
131134
&& d.ParentDeclaration.IdentifierName == component.Name);
@@ -134,7 +137,7 @@ private void DispatchSelectedDesignerDeclaration(IVBComponent component)
134137
return;
135138
}
136139
var form =
137-
_parser.State.DeclarationFinder.MatchName(component.Name)
140+
_declarationFinderProvider.DeclarationFinder?.MatchName(component.Name)
138141
.SingleOrDefault(d => d.DeclarationType.HasFlag(DeclarationType.ClassModule)
139142
&& d.ProjectId == parent.ProjectId);
140143

@@ -144,7 +147,7 @@ private void DispatchSelectedDesignerDeclaration(IVBComponent component)
144147

145148
private void DispatchSelectedProjectNodeDeclaration(IVBComponent component)
146149
{
147-
if (_parser.State.DeclarationFinder == null)
150+
if (_declarationFinderProvider.DeclarationFinder == null)
148151
{
149152
return;
150153
}
@@ -155,7 +158,7 @@ private void DispatchSelectedProjectNodeDeclaration(IVBComponent component)
155158
{
156159
//The user might have selected the project node in Project Explorer. If they've chosen a folder, we'll return the project anyway.
157160
var project =
158-
_parser.State.DeclarationFinder.UserDeclarations(DeclarationType.Project)
161+
_declarationFinderProvider.DeclarationFinder.UserDeclarations(DeclarationType.Project)
159162
.SingleOrDefault(decl => decl.ProjectId.Equals(active.ProjectId));
160163

161164
DispatchSelectedDeclaration(new DeclarationChangedEventArgs(_vbe, project));
@@ -168,10 +171,10 @@ private void DispatchSelectedProjectNodeDeclaration(IVBComponent component)
168171
{
169172

170173
var module =
171-
_parser.State.AllUserDeclarations.SingleOrDefault(
172-
decl => decl.DeclarationType.HasFlag(DeclarationType.Module) &&
173-
decl.IdentifierName.Equals(component.Name) &&
174-
decl.ProjectId.Equals(active.ProjectId));
174+
_declarationFinderProvider.DeclarationFinder
175+
?.UserDeclarations(DeclarationType.Module)
176+
.SingleOrDefault(decl => decl.IdentifierName.Equals(component.Name)
177+
&& decl.ProjectId.Equals(active.ProjectId));
175178

176179
DispatchSelectedDeclaration(new DeclarationChangedEventArgs(_vbe, module));
177180
}

Rubberduck.VBEEditor/Utility/SelectionService.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ public class SelectionService : ISelectionService
1111
private readonly IProjectsProvider _projectsProvider;
1212
private readonly IVBE _vbe;
1313

14-
private Logger _logger = LogManager.GetCurrentClassLogger();
14+
private readonly Logger _logger = LogManager.GetCurrentClassLogger();
1515

1616
public SelectionService(IVBE vbe, IProjectsProvider projectsProvider)
1717
{

RubberduckTests/Commands/FindAllImplementationsTests.cs

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
using Rubberduck.UI.Command.ComCommands;
1515
using Rubberduck.VBEditor.Events;
1616
using Rubberduck.VBEditor.SafeComWrappers.Abstract;
17+
using Rubberduck.VBEditor.Utility;
1718

1819
namespace RubberduckTests.Commands
1920
{
@@ -383,7 +384,9 @@ private static FindAllImplementationsCommand ArrangeFindAllImplementationsComman
383384
Mock<IVBE> vbe, ISearchResultsWindowViewModel viewModel, FindAllImplementationsService finder,
384385
Mock<IVbeEvents> vbeEvents)
385386
{
386-
return new FindAllImplementationsCommand(state, vbe.Object, viewModel, finder, vbeEvents.Object);
387+
var selectionService = new SelectionService(vbe.Object, state.ProjectsProvider);
388+
var selectedDeclarationService = new SelectedDeclarationService(selectionService, state);
389+
return new FindAllImplementationsCommand(state, selectedDeclarationService, viewModel, finder, vbeEvents.Object);
387390
}
388391
}
389392
}

0 commit comments

Comments
 (0)