Skip to content

Commit f8cfbdc

Browse files
committed
Move ExtractInterface and ImplementInterface to the ISelectionService
1 parent b07582e commit f8cfbdc

File tree

9 files changed

+196
-192
lines changed

9 files changed

+196
-192
lines changed

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

Lines changed: 17 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
using Rubberduck.Refactorings;
1212
using Rubberduck.Refactorings.ExtractInterface;
1313
using Rubberduck.VBEditor.SafeComWrappers.Abstract;
14+
using Rubberduck.VBEditor.Utility;
1415

1516
namespace Rubberduck.UI.Command.Refactorings
1617
{
@@ -21,14 +22,16 @@ public class RefactorExtractInterfaceCommand : RefactorCommandBase
2122
private readonly IRewritingManager _rewritingManager;
2223
private readonly IMessageBox _messageBox;
2324
private readonly IRefactoringPresenterFactory _factory;
25+
private readonly ISelectionService _selectionService;
2426

25-
public RefactorExtractInterfaceCommand(IVBE vbe, RubberduckParserState state, IMessageBox messageBox, IRefactoringPresenterFactory factory, IRewritingManager rewritingManager)
27+
public RefactorExtractInterfaceCommand(IVBE vbe, RubberduckParserState state, IMessageBox messageBox, IRefactoringPresenterFactory factory, IRewritingManager rewritingManager, ISelectionService selectionService)
2628
:base(vbe)
2729
{
2830
_state = state;
2931
_rewritingManager = rewritingManager;
3032
_messageBox = messageBox;
3133
_factory = factory;
34+
_selectionService = selectionService;
3235
}
3336

3437
private static readonly IReadOnlyList<DeclarationType> ModuleTypes = new[]
@@ -40,15 +43,19 @@ public RefactorExtractInterfaceCommand(IVBE vbe, RubberduckParserState state, IM
4043

4144
protected override bool EvaluateCanExecute(object parameter)
4245
{
43-
var selection = Vbe.GetActiveSelection();
46+
if (_state.Status != ParserState.Ready)
47+
{
48+
return false;
49+
}
4450

45-
if (!selection.HasValue)
51+
var activeSelection = _selectionService.ActiveSelection();
52+
if (!activeSelection.HasValue)
4653
{
4754
return false;
4855
}
4956

5057
var interfaceClass = _state.AllUserDeclarations.SingleOrDefault(item =>
51-
item.QualifiedName.QualifiedModuleName.Equals(selection.Value.QualifiedName)
58+
item.QualifiedName.QualifiedModuleName.Equals(activeSelection.Value.QualifiedName)
5259
&& ModuleTypes.Contains(item.DeclarationType));
5360

5461
if (interfaceClass == null)
@@ -73,21 +80,19 @@ protected override bool EvaluateCanExecute(object parameter)
7380
// true if active code pane is for a class/document/form module
7481
return !context.Any()
7582
&& !_state.IsNewOrModified(interfaceClass.QualifiedModuleName)
76-
&& !_state.IsNewOrModified(selection.Value.QualifiedName);
83+
&& !_state.IsNewOrModified(activeSelection.Value.QualifiedName);
7784
}
7885

7986
protected override void OnExecute(object parameter)
8087
{
81-
using(var activePane = Vbe.ActiveCodePane)
88+
var activeSelection = _selectionService.ActiveSelection();
89+
if (!activeSelection.HasValue)
8290
{
83-
if (activePane == null || activePane.IsWrappingNullReference)
84-
{
85-
return;
86-
}
91+
return;
8792
}
8893

89-
var refactoring = new ExtractInterfaceRefactoring(_state, Vbe, _messageBox, _factory, _rewritingManager);
90-
refactoring.Refactor();
94+
var refactoring = new ExtractInterfaceRefactoring(_state, _state, _messageBox, _factory, _rewritingManager, _selectionService);
95+
refactoring.Refactor(activeSelection.Value);
9196
}
9297
}
9398
}
Lines changed: 19 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,13 @@
11
using System.Linq;
22
using System.Runtime.InteropServices;
3+
using System.Runtime.InteropServices.WindowsRuntime;
34
using Rubberduck.Interaction;
45
using Rubberduck.Parsing.Rewriter;
56
using Rubberduck.Parsing.Symbols;
67
using Rubberduck.Parsing.VBA;
78
using Rubberduck.Refactorings.ImplementInterface;
89
using Rubberduck.VBEditor.SafeComWrappers.Abstract;
10+
using Rubberduck.VBEditor.Utility;
911

1012
namespace Rubberduck.UI.Command.Refactorings
1113
{
@@ -15,28 +17,33 @@ public class RefactorImplementInterfaceCommand : RefactorCommandBase
1517
private readonly RubberduckParserState _state;
1618
private readonly IRewritingManager _rewritingManager;
1719
private readonly IMessageBox _msgBox;
20+
private readonly ISelectionService _selectionService;
1821

19-
public RefactorImplementInterfaceCommand(IVBE vbe, RubberduckParserState state, IMessageBox msgBox, IRewritingManager rewritingManager)
22+
public RefactorImplementInterfaceCommand(IVBE vbe, RubberduckParserState state, IMessageBox msgBox, IRewritingManager rewritingManager, ISelectionService selectionService)
2023
: base(vbe)
2124
{
2225
_state = state;
2326
_rewritingManager = rewritingManager;
2427
_msgBox = msgBox;
28+
_selectionService = selectionService;
2529
}
2630

2731
protected override bool EvaluateCanExecute(object parameter)
2832
{
29-
30-
var selection = Vbe.GetActiveSelection();
33+
if (_state.Status != ParserState.Ready)
34+
{
35+
return false;
36+
}
3137

32-
if (!selection.HasValue)
38+
var activeSelection = _selectionService.ActiveSelection();
39+
if (!activeSelection.HasValue)
3340
{
3441
return false;
3542
}
3643

37-
var targetInterface = _state.DeclarationFinder.FindInterface(selection.Value);
44+
var targetInterface = _state.DeclarationFinder.FindInterface(activeSelection.Value);
3845

39-
var targetClass = _state.DeclarationFinder.Members(selection.Value.QualifiedName)
46+
var targetClass = _state.DeclarationFinder.Members(activeSelection.Value.QualifiedName)
4047
.SingleOrDefault(declaration => declaration.DeclarationType == DeclarationType.ClassModule);
4148

4249
return targetInterface != null && targetClass != null
@@ -47,15 +54,14 @@ protected override bool EvaluateCanExecute(object parameter)
4754

4855
protected override void OnExecute(object parameter)
4956
{
50-
using (var pane = Vbe.ActiveCodePane)
57+
var activeSelection = _selectionService.ActiveSelection();
58+
if (!activeSelection.HasValue)
5159
{
52-
if (pane.IsWrappingNullReference)
53-
{
54-
return;
55-
}
60+
return;
5661
}
57-
var refactoring = new ImplementInterfaceRefactoring(Vbe, _state, _msgBox, _rewritingManager);
58-
refactoring.Refactor();
62+
63+
var refactoring = new ImplementInterfaceRefactoring(_state, _msgBox, _rewritingManager, _selectionService);
64+
refactoring.Refactor(activeSelection.Value);
5965
}
6066
}
6167
}

Rubberduck.Core/UI/Refactorings/ExtractInterface/ExtractInterfaceViewModel.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ public ExtractInterfaceViewModel(ExtractInterfaceModel model) : base(model)
1717
SelectAllCommand = new DelegateCommand(LogManager.GetCurrentClassLogger(), _ => ToggleSelection(true));
1818
DeselectAllCommand = new DelegateCommand(LogManager.GetCurrentClassLogger(), _ => ToggleSelection(false));
1919

20-
ComponentNames = Model.State.DeclarationFinder
20+
ComponentNames = Model.DeclarationFinderProvider.DeclarationFinder
2121
.UserDeclarations(DeclarationType.Module)
2222
.Where(moduleDeclaration => moduleDeclaration.ProjectId == Model.TargetDeclaration.ProjectId)
2323
.Select(module => module.ComponentName)

Rubberduck.Refactorings/ExtractInterface/ExtractInterfaceModel.cs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,8 @@ namespace Rubberduck.Refactorings.ExtractInterface
99
{
1010
public class ExtractInterfaceModel
1111
{
12-
public RubberduckParserState State { get; }
1312
public Declaration TargetDeclaration { get; }
13+
public IDeclarationFinderProvider DeclarationFinderProvider { get; }
1414

1515
public string InterfaceName { get; set; }
1616

@@ -34,10 +34,10 @@ public class ExtractInterfaceModel
3434
DeclarationType.PropertySet,
3535
};
3636

37-
public ExtractInterfaceModel(RubberduckParserState state, QualifiedSelection selection)
37+
public ExtractInterfaceModel(IDeclarationFinderProvider declarationFinderProvider, QualifiedSelection selection)
3838
{
39-
State = state;
40-
var declarations = state.AllUserDeclarations.ToList();
39+
DeclarationFinderProvider = declarationFinderProvider;
40+
var declarations = declarationFinderProvider.DeclarationFinder.AllUserDeclarations.ToList();
4141
var candidates = declarations.Where(item => ModuleTypes.Contains(item.DeclarationType)).ToList();
4242

4343
TargetDeclaration = candidates.SingleOrDefault(item =>

Rubberduck.Refactorings/ExtractInterface/ExtractInterfaceRefactoring.cs

Lines changed: 25 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -9,41 +9,41 @@
99
using Rubberduck.Refactorings.ImplementInterface;
1010
using Rubberduck.VBEditor;
1111
using Rubberduck.VBEditor.SafeComWrappers;
12-
using Rubberduck.VBEditor.SafeComWrappers.Abstract;
1312
using Rubberduck.VBEditor.Utility;
1413

1514
namespace Rubberduck.Refactorings.ExtractInterface
1615
{
1716
public class ExtractInterfaceRefactoring : IRefactoring
1817
{
19-
private readonly RubberduckParserState _state;
20-
private readonly IVBE _vbe;
18+
private readonly IDeclarationFinderProvider _declarationFinderProvider;
19+
private readonly IParseManager _parseManager;
2120
private readonly IMessageBox _messageBox;
22-
private readonly IRefactoringPresenterFactory _factory;
21+
private readonly Func<ExtractInterfaceModel, IDisposalActionContainer<IExtractInterfacePresenter>> _presenterFactory;
2322
private readonly IRewritingManager _rewritingManager;
23+
private readonly ISelectionService _selectionService;
2424
private ExtractInterfaceModel _model;
2525

2626
private readonly Logger _logger = LogManager.GetCurrentClassLogger();
2727

28-
public ExtractInterfaceRefactoring(RubberduckParserState state, IVBE vbe, IMessageBox messageBox, IRefactoringPresenterFactory factory, IRewritingManager rewritingManager)
28+
public ExtractInterfaceRefactoring(IDeclarationFinderProvider declarationFinderProvider, IParseManager parseManager, IMessageBox messageBox, IRefactoringPresenterFactory factory, IRewritingManager rewritingManager, ISelectionService selectionService)
2929
{
30-
_state = state;
31-
_vbe = vbe;
30+
_declarationFinderProvider = declarationFinderProvider;
31+
_parseManager = parseManager;
3232
_rewritingManager = rewritingManager;
3333
_messageBox = messageBox;
34-
_factory = factory;
34+
_selectionService = selectionService;
35+
_presenterFactory = ((model) => DisposalActionContainer.Create(factory.Create<IExtractInterfacePresenter, ExtractInterfaceModel>(model), factory.Release));
3536
}
3637

3738
private ExtractInterfaceModel InitializeModel()
3839
{
39-
var selection = _vbe.GetActiveSelection();
40-
41-
if (selection == null)
40+
var activeSelection = _selectionService.ActiveSelection();
41+
if (!activeSelection.HasValue)
4242
{
4343
return null;
4444
}
4545

46-
return new ExtractInterfaceModel(_state, selection.Value);
46+
return new ExtractInterfaceModel(_declarationFinderProvider, activeSelection.Value);
4747
}
4848

4949
public void Refactor()
@@ -55,9 +55,9 @@ public void Refactor()
5555
return;
5656
}
5757

58-
using (var container = DisposalActionContainer.Create(_factory.Create<IExtractInterfacePresenter, ExtractInterfaceModel>(_model), p => _factory.Release(p)))
58+
using (var presenterContainer = _presenterFactory(_model))
5959
{
60-
var presenter = container.Value;
60+
var presenter = presenterContainer.Value;
6161
if (presenter == null)
6262
{
6363
return;
@@ -69,57 +69,34 @@ public void Refactor()
6969
return;
7070
}
7171

72-
using (var pane = _vbe.ActiveCodePane)
73-
{
74-
if (pane.IsWrappingNullReference)
75-
{
76-
return;
77-
}
78-
79-
var oldSelection = pane.GetQualifiedSelection();
80-
81-
AddInterface();
82-
83-
if (oldSelection.HasValue)
84-
{
85-
pane.Selection = oldSelection.Value.Selection;
86-
}
87-
}
88-
89-
_model.State.OnParseRequested(this);
72+
AddInterface();
9073
}
9174
}
9275

9376
public void Refactor(QualifiedSelection target)
9477
{
95-
using (var pane = _vbe.ActiveCodePane)
78+
if (!_selectionService.TrySetActiveSelection(target))
9679
{
97-
if (pane.IsWrappingNullReference)
98-
{
99-
return;
100-
}
101-
pane.Selection = target.Selection;
80+
return;
10281
}
82+
10383
Refactor();
10484
}
10585

10686
public void Refactor(Declaration target)
10787
{
108-
using (var pane = _vbe.ActiveCodePane)
88+
if (target == null)
10989
{
110-
if (pane.IsWrappingNullReference)
111-
{
112-
return;
113-
}
114-
pane.Selection = target.QualifiedSelection.Selection;
90+
return;
11591
}
116-
Refactor();
92+
93+
Refactor(target.QualifiedSelection);
11794
}
11895

11996
private void AddInterface()
12097
{
12198
//We need to suspend here since adding the interface and rewriting will both trigger a reparse.
122-
var suspendResult = _model.State.OnSuspendParser(this, new[] {ParserState.Ready}, AddInterfaceInternal);
99+
var suspendResult = _parseManager.OnSuspendParser(this, new[] {ParserState.Ready}, AddInterfaceInternal);
123100
if (suspendResult != SuspensionResult.Completed)
124101
{
125102
_logger.Warn("Extract interface failed.");
@@ -139,7 +116,7 @@ private void AddInterfaceInternal()
139116
var rewriteSession = _rewritingManager.CheckOutCodePaneSession();
140117
var rewriter = rewriteSession.CheckOutModuleRewriter(_model.TargetDeclaration.QualifiedModuleName);
141118

142-
var firstNonFieldMember = _model.State.DeclarationFinder.Members(_model.TargetDeclaration)
119+
var firstNonFieldMember = _declarationFinderProvider.DeclarationFinder.Members(_model.TargetDeclaration)
143120
.OrderBy(o => o.Selection)
144121
.First(m => ExtractInterfaceModel.MemberTypes.Contains(m.DeclarationType));
145122
rewriter.InsertBefore(firstNonFieldMember.Context.Start.TokenIndex, $"Implements {_model.InterfaceName}{Environment.NewLine}{Environment.NewLine}");
@@ -173,7 +150,7 @@ private void AddInterfaceClass(Declaration implementingClass, string interfaceNa
173150

174151
private void AddInterfaceMembersToClass(IModuleRewriter rewriter)
175152
{
176-
var implementInterfaceRefactoring = new ImplementInterfaceRefactoring(_vbe, _model.State, _messageBox, _rewritingManager);
153+
var implementInterfaceRefactoring = new ImplementInterfaceRefactoring(_declarationFinderProvider, _messageBox, _rewritingManager, _selectionService);
177154
implementInterfaceRefactoring.Refactor(_model.SelectedMembers.Select(m => m.Member).ToList(), rewriter, _model.InterfaceName);
178155
}
179156

0 commit comments

Comments
 (0)