Skip to content

Commit daa3f92

Browse files
committed
Merge pull request #903 from Hosch250/ReinstateTests
Request parse from anywhere and make ExtractInterface call ImplementInterface
2 parents c7a6e1a + a7a0622 commit daa3f92

File tree

13 files changed

+206
-228
lines changed

13 files changed

+206
-228
lines changed

RetailCoder.VBE/App.cs

Lines changed: 3 additions & 65 deletions
Original file line numberDiff line numberDiff line change
@@ -36,9 +36,6 @@ public class App : IDisposable
3636

3737
private Configuration _config;
3838

39-
private readonly ConcurrentDictionary<VBComponent, CancellationTokenSource> _tokenSources =
40-
new ConcurrentDictionary<VBComponent, CancellationTokenSource>();
41-
4239
public App(VBE vbe, IMessageBox messageBox,
4340
IParserErrorsPresenterFactory parserErrorsPresenterFactory,
4441
IRubberduckParser parser,
@@ -94,7 +91,7 @@ private async void hooks_MessageReceived(object sender, HookEventArgs e)
9491
}
9592

9693
var component = _vbe.ActiveCodePane.CodeModule.Parent;
97-
ParseComponentAsync(component);
94+
_parser.ParseComponentAsync(component);
9895

9996
AwaitNextKey();
10097
return;
@@ -141,48 +138,14 @@ private async void hooks_MessageReceived(object sender, HookEventArgs e)
141138

142139
private void _stateBar_Refresh(object sender, EventArgs e)
143140
{
144-
ParseAll();
141+
_parser.State.RequestParse();
145142
}
146143

147144
private void Parser_StateChanged(object sender, EventArgs e)
148145
{
149146
_appMenus.EvaluateCanExecute(_parser.State);
150147
}
151148

152-
private void ParseComponentAsync(VBComponent component, bool resolve = true)
153-
{
154-
var tokenSource = RenewTokenSource(component);
155-
156-
var token = tokenSource.Token;
157-
_parser.ParseAsync(component, token);
158-
159-
if (resolve && !token.IsCancellationRequested)
160-
{
161-
using (var source = new CancellationTokenSource())
162-
{
163-
_parser.Resolve(source.Token);
164-
}
165-
}
166-
}
167-
168-
private CancellationTokenSource RenewTokenSource(VBComponent component)
169-
{
170-
if (_tokenSources.ContainsKey(component))
171-
{
172-
CancellationTokenSource existingTokenSource;
173-
_tokenSources.TryRemove(component, out existingTokenSource);
174-
if (existingTokenSource != null)
175-
{
176-
existingTokenSource.Cancel();
177-
existingTokenSource.Dispose();
178-
}
179-
}
180-
181-
var tokenSource = new CancellationTokenSource();
182-
_tokenSources[component] = tokenSource;
183-
return tokenSource;
184-
}
185-
186149
public void Startup()
187150
{
188151
CleanReloadConfig();
@@ -193,7 +156,7 @@ public void Startup()
193156
Task.Delay(1000).ContinueWith(t =>
194157
{
195158
_parser.State.AddBuiltInDeclarations(_vbe.HostApplication());
196-
ParseAll();
159+
_parser.State.RequestParse();
197160
});
198161

199162
//_hooks.AddHook(new LowLevelKeyboardHook(_vbe));
@@ -202,22 +165,6 @@ public void Startup()
202165
//_hooks.Attach();
203166
}
204167

205-
private void ParseAll()
206-
{
207-
var components = _vbe.VBProjects.Cast<VBProject>()
208-
.SelectMany(project => project.VBComponents.Cast<VBComponent>());
209-
210-
var result = Parallel.ForEach(components, component => { ParseComponentAsync(component, false); });
211-
212-
if (result.IsCompleted)
213-
{
214-
using (var tokenSource = new CancellationTokenSource())
215-
{
216-
_parser.Resolve(tokenSource.Token);
217-
}
218-
}
219-
}
220-
221168
private void CleanReloadConfig()
222169
{
223170
LoadConfig();
@@ -262,15 +209,6 @@ public void Dispose()
262209
_parser.State.StateChanged -= Parser_StateChanged;
263210

264211
_hooks.Dispose();
265-
266-
if (_tokenSources.Any())
267-
{
268-
foreach (var tokenSource in _tokenSources)
269-
{
270-
tokenSource.Value.Cancel();
271-
tokenSource.Value.Dispose();
272-
}
273-
}
274212
}
275213
}
276214
}

RetailCoder.VBE/Common/DeclarationExtensions.cs

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -510,9 +510,13 @@ 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+
var completeSelection = new Selection(implementsStmt.GetSelection().StartLine,
514+
implementsStmt.GetSelection().StartColumn, reference.Selection.EndLine,
515+
reference.Selection.EndColumn);
516+
517+
if (reference.QualifiedModuleName.ComponentName == selection.QualifiedName.ComponentName &&
518+
reference.QualifiedModuleName.Project == selection.QualifiedName.Project &&
519+
completeSelection.Contains(selection.Selection))
516520
{
517521
return declaration;
518522
}

RetailCoder.VBE/Refactorings/ExtractInterface/ExtractInterfaceModel.cs

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
using System.Collections.Generic;
2+
using System.Collections.ObjectModel;
23
using System.Linq;
34
using Rubberduck.Parsing.Grammar;
45
using Rubberduck.Parsing.Symbols;
@@ -24,14 +25,15 @@ public class ExtractInterfaceModel
2425
public string InterfaceName { get; set; }
2526
public List<InterfaceMember> Members { get; set; }
2627

27-
private readonly static DeclarationType[] DeclarationTypes =
28+
private static readonly DeclarationType[] _declarationTypes =
2829
{
2930
DeclarationType.Class,
3031
DeclarationType.Document,
3132
DeclarationType.UserForm
3233
};
34+
public ReadOnlyCollection<DeclarationType> DeclarationTypes = new ReadOnlyCollection<DeclarationType>(_declarationTypes);
3335

34-
public readonly string[] PrimitiveTypes =
36+
private static readonly string[] _primitiveTypes =
3537
{
3638
Tokens.Boolean,
3739
Tokens.Byte,
@@ -46,6 +48,7 @@ public class ExtractInterfaceModel
4648
Tokens.String,
4749
Tokens.StrPtr
4850
};
51+
public ReadOnlyCollection<string> PrimitiveTypes = new ReadOnlyCollection<string>(_primitiveTypes);
4952

5053
public ExtractInterfaceModel(RubberduckParserState parseResult, QualifiedSelection selection)
5154
{

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: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ public void Refactor()
3333

3434
if (!selection.HasValue)
3535
{
36-
_messageBox.Show("Invalid selection.", "Rubberduck - Implement Interface",
36+
_messageBox.Show(RubberduckUI.ImplementInterface_InvalidSelectionMessage, RubberduckUI.ImplementInterface_Caption,
3737
System.Windows.Forms.MessageBoxButtons.OK, System.Windows.Forms.MessageBoxIcon.Exclamation);
3838
return;
3939
}
@@ -45,14 +45,15 @@ 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
{
55+
_messageBox.Show(RubberduckUI.ImplementInterface_InvalidSelectionMessage, RubberduckUI.ImplementInterface_Caption,
56+
System.Windows.Forms.MessageBoxButtons.OK, System.Windows.Forms.MessageBoxIcon.Exclamation);
5657
return;
5758
}
5859

0 commit comments

Comments
 (0)