Skip to content

Commit a800618

Browse files
committed
Make ExtractInterface call ImplementInterface
1 parent 0bb8bd2 commit a800618

File tree

6 files changed

+40
-127
lines changed

6 files changed

+40
-127
lines changed

RetailCoder.VBE/Common/DeclarationExtensions.cs

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -510,9 +510,10 @@ public static Declaration FindInterface(this IEnumerable<Declaration> declaratio
510510

511511
if (implementsStmt == null) { continue; }
512512

513-
if (reference.QualifiedModuleName == selection.QualifiedName &&
514-
(implementsStmt.GetSelection().Contains(selection.Selection)
515-
|| reference.Selection.Contains(selection.Selection)))
513+
if (reference.QualifiedModuleName.ComponentName == selection.QualifiedName.ComponentName &&
514+
reference.QualifiedModuleName.Project == selection.QualifiedName.Project &&
515+
(implementsStmt.GetSelection().Contains(selection.Selection) ||
516+
reference.Selection.Contains(selection.Selection)))
516517
{
517518
return declaration;
518519
}

RetailCoder.VBE/Refactorings/ExtractInterface/ExtractInterfaceRefactoring.cs

Lines changed: 13 additions & 113 deletions
Original file line numberDiff line numberDiff line change
@@ -2,19 +2,24 @@
22
using System.Linq;
33
using Microsoft.Vbe.Interop;
44
using Rubberduck.Parsing.Symbols;
5+
using Rubberduck.Parsing.VBA;
6+
using Rubberduck.Refactorings.ImplementInterface;
7+
using Rubberduck.UI;
58
using Rubberduck.VBEditor;
69

710
namespace Rubberduck.Refactorings.ExtractInterface
811
{
912
public class ExtractInterfaceRefactoring : IRefactoring
1013
{
14+
private readonly RubberduckParserState _state;
1115
private readonly IRefactoringPresenterFactory<ExtractInterfacePresenter> _factory;
1216
private readonly IActiveCodePaneEditor _editor;
1317
private ExtractInterfaceModel _model;
1418

15-
public ExtractInterfaceRefactoring(IRefactoringPresenterFactory<ExtractInterfacePresenter> factory,
19+
public ExtractInterfaceRefactoring(RubberduckParserState state, IRefactoringPresenterFactory<ExtractInterfacePresenter> factory,
1620
IActiveCodePaneEditor editor)
1721
{
22+
_state = state;
1823
_factory = factory;
1924
_editor = editor;
2025
}
@@ -55,120 +60,15 @@ private void AddInterface()
5560

5661
var module = _model.TargetDeclaration.QualifiedSelection.QualifiedName.Component.CodeModule;
5762

58-
AddItems(module);
59-
module.InsertLines(module.CountOfDeclarationLines + 1, "Implements " + _model.InterfaceName);
60-
}
61-
62-
private void AddItems(CodeModule module)
63-
{
64-
_model.Members.Reverse();
65-
66-
foreach (var member in _model.Members.Where(m => m.IsSelected))
67-
{
68-
module.InsertLines(module.CountOfDeclarationLines + 1, GetInterfaceMember(member));
69-
}
70-
}
71-
72-
private string GetInterfaceMember(InterfaceMember member)
73-
{
74-
switch (member.MemberType)
75-
{
76-
case "Sub":
77-
return SubStmt(member);
78-
79-
case "Function":
80-
return FunctionStmt(member);
81-
82-
case "Property":
83-
switch (member.PropertyType)
84-
{
85-
case "Get":
86-
return PropertyGetStmt(member);
87-
88-
case "Let":
89-
return PropertyLetStmt(member);
90-
91-
case "Set":
92-
return PropertySetStmt(member);
93-
}
94-
break;
95-
}
96-
97-
return string.Empty;
98-
}
99-
100-
private string SubStmt(InterfaceMember member)
101-
{
102-
var memberSignature = "Public Sub " + _model.InterfaceName + "_" + member.Member.IdentifierName + "(" +
103-
string.Join(", ", member.MemberParams) + ")";
104-
105-
var memberBody = " " + member.Member.IdentifierName + " " +
106-
string.Join(", ", member.MemberParams.Select(p => p.ParamName));
107-
108-
var memberCloseStatement = "End Sub" + Environment.NewLine;
109-
110-
return string.Join(Environment.NewLine, memberSignature, memberBody, memberCloseStatement);
111-
}
112-
113-
private string FunctionStmt(InterfaceMember member)
114-
{
115-
var memberSignature = "Public Function " + _model.InterfaceName + "_" + member.Member.IdentifierName + "(" +
116-
string.Join(", ", member.MemberParams) + ")" + " As " + member.Type;
117-
118-
var memberBody = " " + _model.InterfaceName + "_" + member.Member.IdentifierName + " = " +
119-
member.Member.IdentifierName + "(" +
120-
string.Join(", ", member.MemberParams.Select(p => p.ParamName)) + ")";
121-
122-
var memberCloseStatement = "End Function" + Environment.NewLine;
123-
124-
return string.Join(Environment.NewLine, memberSignature, memberBody, memberCloseStatement);
125-
}
126-
127-
private string PropertyGetStmt(InterfaceMember member)
128-
{
129-
var memberSignature = "Public Property Get " + _model.InterfaceName + "_" + member.Member.IdentifierName +
130-
" As " + member.Type;
131-
132-
var memberBody = _model.PrimitiveTypes.Contains(member.Type) ||
133-
member.Member.DeclarationType == DeclarationType.UserDefinedType
134-
? " "
135-
: " Set ";
136-
137-
memberBody += _model.InterfaceName + "_" + member.Member.IdentifierName + " = " +
138-
member.Member.IdentifierName;
139-
140-
var memberCloseStatement = "End Property" + Environment.NewLine;
141-
142-
return string.Join(Environment.NewLine, memberSignature, memberBody, memberCloseStatement);
143-
}
144-
145-
private string PropertyLetStmt(InterfaceMember member)
146-
{
147-
var memberSignature = "Public Property Let " + _model.InterfaceName + "_" + member.Member.IdentifierName +
148-
"(" + string.Join(", ", member.MemberParams) + ")";
149-
150-
var memberBody = _model.PrimitiveTypes.Contains(member.MemberParams.Last().ParamType) ||
151-
member.Member.DeclarationType == DeclarationType.UserDefinedType
152-
? " "
153-
: " Set ";
154-
155-
memberBody += member.Member.IdentifierName + " = " + member.MemberParams.Last().ParamName;
156-
157-
var memberCloseStatement = "End Property" + Environment.NewLine;
158-
159-
return string.Join(Environment.NewLine, memberSignature, memberBody, memberCloseStatement);
160-
}
161-
162-
private string PropertySetStmt(InterfaceMember member)
163-
{
164-
var memberSignature = "Public Property Set " + _model.InterfaceName + "_" + member.Member.IdentifierName +
165-
"(" + string.Join(", ", member.MemberParams) + ")";
166-
167-
var memberBody = " Set " + member.Member.IdentifierName + " = " + member.MemberParams.Last().ParamName;
63+
var implementsLine = module.CountOfDeclarationLines + 1;
64+
module.InsertLines(implementsLine, "Implements " + _model.InterfaceName);
16865

169-
var memberCloseStatement = "End Property" + Environment.NewLine;
66+
_state.RequestParse(ParserState.Ready);
67+
var qualifiedSelection = new QualifiedSelection(_model.TargetDeclaration.QualifiedSelection.QualifiedName,
68+
new Selection(implementsLine, 1, implementsLine, 1));
17069

171-
return string.Join(Environment.NewLine, memberSignature, memberBody, memberCloseStatement);
70+
var implementInterfaceRefactoring = new ImplementInterfaceRefactoring(_state, _editor, new MessageBox());
71+
implementInterfaceRefactoring.Refactor(qualifiedSelection);
17272
}
17373

17474
private string GetInterface()

RetailCoder.VBE/Refactorings/ImplementInterface/ImplementInterfaceRefactoring.cs

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -45,11 +45,10 @@ public void Refactor(QualifiedSelection selection)
4545
{
4646
_targetInterface = _declarations.FindInterface(selection);
4747

48-
_targetClass =
49-
_declarations.SingleOrDefault(
50-
d =>
48+
_targetClass = _declarations.SingleOrDefault(d =>
5149
!d.IsBuiltIn && d.DeclarationType == DeclarationType.Class &&
52-
d.QualifiedSelection.QualifiedName == selection.QualifiedName);
50+
d.QualifiedSelection.QualifiedName.ComponentName == selection.QualifiedName.ComponentName &&
51+
d.Project == selection.QualifiedName.Project);
5352

5453
if (_targetClass == null || _targetInterface == null)
5554
{

RetailCoder.VBE/UI/Command/Refactorings/RefactorImplementInterfaceCommand.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ public override void Execute(object parameter)
2828
using (var view = new ExtractInterfaceDialog())
2929
{
3030
var factory = new ExtractInterfacePresenterFactory(_state, Editor, view);
31-
var refactoring = new ExtractInterfaceRefactoring(factory, Editor);
31+
var refactoring = new ExtractInterfaceRefactoring(_state, factory, Editor);
3232
refactoring.Refactor();
3333
}
3434
}

Rubberduck.Parsing/VBA/RubberduckParser.cs

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,15 +25,28 @@ public RubberduckParser(VBE vbe, RubberduckParserState state)
2525
_state = state;
2626

2727
state.ParseRequest += state_ParseRequest;
28+
state.StateChanged += state_StateChanged;
2829
}
2930

30-
void state_ParseRequest()
31+
private void state_StateChanged(object sender, EventArgs e)
32+
{
33+
_semaphore.Release(1);
34+
}
35+
36+
void state_ParseRequest(ParserState state)
3137
{
3238
ParseAll();
39+
40+
while (true)
41+
{
42+
_semaphore.Wait();
43+
if (_state.Status <= state) { break; }
44+
}
3345
}
3446

3547
private readonly VBE _vbe;
3648
private readonly RubberduckParserState _state;
49+
private readonly SemaphoreSlim _semaphore = new SemaphoreSlim(1);
3750
public RubberduckParserState State { get { return _state; } }
3851

3952
private readonly ConcurrentDictionary<VBComponent, CancellationTokenSource> _tokenSources =

Rubberduck.Parsing/VBA/RubberduckParserState.cs

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ public enum ResolutionState
1818

1919
public class RubberduckParserState
2020
{
21-
public delegate void ParseRequestEventHandler();
21+
public delegate void ParseRequestEventHandler(ParserState state);
2222
public event ParseRequestEventHandler ParseRequest;
2323

2424
// keys are the declarations; values indicate whether a declaration is resolved.
@@ -196,17 +196,17 @@ public void AddBuiltInDeclarations(IHostApplication hostApplication)
196196
}
197197
}
198198

199-
public void RequestParse()
199+
public void RequestParse(ParserState state = ParserState.Error)
200200
{
201-
OnParseRequest();
201+
OnParseRequest(state);
202202
}
203203

204-
protected virtual void OnParseRequest()
204+
protected virtual void OnParseRequest(ParserState state)
205205
{
206206
var handler = ParseRequest;
207207
if (handler != null)
208208
{
209-
handler();
209+
handler(state);
210210
}
211211
}
212212
}

0 commit comments

Comments
 (0)