Skip to content

Commit 91d2bb8

Browse files
authored
Merge pull request #1911 from Hosch250/dontWorkWhenVbeIsRunning
Dont work when vbe is running
2 parents 69337ce + 211b965 commit 91d2bb8

File tree

6 files changed

+102
-20
lines changed

6 files changed

+102
-20
lines changed

RetailCoder.VBE/App.cs

Lines changed: 11 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
using System.Threading.Tasks;
2020
using System.Windows.Forms;
2121
using Rubberduck.UI.SourceControl;
22+
using Rubberduck.VBEditor.Extensions;
2223

2324
namespace Rubberduck
2425
{
@@ -216,7 +217,7 @@ public void Shutdown()
216217
#region sink handlers. todo: move to another class
217218
async void sink_ProjectRemoved(object sender, DispatcherEventArgs<VBProject> e)
218219
{
219-
if (!_handleSinkEvents) { return; }
220+
if (!_handleSinkEvents || !_vbe.IsInDesignMode()) { return; }
220221

221222
if (e.Item.Protection == vbext_ProjectProtection.vbext_pp_locked)
222223
{
@@ -256,7 +257,7 @@ async void sink_ProjectRemoved(object sender, DispatcherEventArgs<VBProject> e)
256257

257258
async void sink_ProjectAdded(object sender, DispatcherEventArgs<VBProject> e)
258259
{
259-
if (!_handleSinkEvents) { return; }
260+
if (!_handleSinkEvents || !_vbe.IsInDesignMode()) { return; }
260261

261262
_logger.Debug("Project '{0}' was added.", e.Item.Name);
262263
if (e.Item.Protection == vbext_ProjectProtection.vbext_pp_locked)
@@ -313,7 +314,7 @@ private void RegisterComponentsEventSink(VBComponents components, string project
313314

314315
async void sink_ComponentSelected(object sender, DispatcherEventArgs<VBComponent> e)
315316
{
316-
if (!_handleSinkEvents) { return; }
317+
if (!_handleSinkEvents || !_vbe.IsInDesignMode()) { return; }
317318

318319
if (!_parser.State.AllDeclarations.Any())
319320
{
@@ -326,7 +327,7 @@ async void sink_ComponentSelected(object sender, DispatcherEventArgs<VBComponent
326327

327328
async void sink_ComponentRenamed(object sender, DispatcherRenamedEventArgs<VBComponent> e)
328329
{
329-
if (!_handleSinkEvents) { return; }
330+
if (!_handleSinkEvents || !_vbe.IsInDesignMode()) { return; }
330331

331332
if (!_parser.State.AllDeclarations.Any())
332333
{
@@ -342,7 +343,7 @@ async void sink_ComponentRenamed(object sender, DispatcherRenamedEventArgs<VBCom
342343

343344
async void sink_ComponentRemoved(object sender, DispatcherEventArgs<VBComponent> e)
344345
{
345-
if (!_handleSinkEvents) { return; }
346+
if (!_handleSinkEvents || !_vbe.IsInDesignMode()) { return; }
346347

347348
if (!_parser.State.AllDeclarations.Any())
348349
{
@@ -357,7 +358,7 @@ async void sink_ComponentRemoved(object sender, DispatcherEventArgs<VBComponent>
357358

358359
async void sink_ComponentReloaded(object sender, DispatcherEventArgs<VBComponent> e)
359360
{
360-
if (!_handleSinkEvents) { return; }
361+
if (!_handleSinkEvents || !_vbe.IsInDesignMode()) { return; }
361362

362363
if (!_parser.State.AllDeclarations.Any())
363364
{
@@ -370,7 +371,7 @@ async void sink_ComponentReloaded(object sender, DispatcherEventArgs<VBComponent
370371

371372
async void sink_ComponentAdded(object sender, DispatcherEventArgs<VBComponent> e)
372373
{
373-
if (!_handleSinkEvents) { return; }
374+
if (!_handleSinkEvents || !_vbe.IsInDesignMode()) { return; }
374375

375376
if (!_parser.State.AllDeclarations.Any())
376377
{
@@ -385,7 +386,7 @@ async void sink_ComponentAdded(object sender, DispatcherEventArgs<VBComponent> e
385386

386387
async void sink_ComponentActivated(object sender, DispatcherEventArgs<VBComponent> e)
387388
{
388-
if (!_handleSinkEvents) { return; }
389+
if (!_handleSinkEvents || !_vbe.IsInDesignMode()) { return; }
389390

390391
if (!_parser.State.AllDeclarations.Any())
391392
{
@@ -398,7 +399,7 @@ async void sink_ComponentActivated(object sender, DispatcherEventArgs<VBComponen
398399

399400
async void sink_ProjectRenamed(object sender, DispatcherRenamedEventArgs<VBProject> e)
400401
{
401-
if (!_handleSinkEvents) { return; }
402+
if (!_handleSinkEvents || !_vbe.IsInDesignMode()) { return; }
402403

403404
if (!_parser.State.AllDeclarations.Any())
404405
{
@@ -415,7 +416,7 @@ async void sink_ProjectRenamed(object sender, DispatcherRenamedEventArgs<VBProje
415416

416417
async void sink_ProjectActivated(object sender, DispatcherEventArgs<VBProject> e)
417418
{
418-
if (!_handleSinkEvents) { return; }
419+
if (!_handleSinkEvents || !_vbe.IsInDesignMode()) { return; }
419420

420421
if (!_parser.State.AllDeclarations.Any())
421422
{

RetailCoder.VBE/UI/Command/RunAllTestsCommand.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
using Rubberduck.Parsing.VBA;
66
using Rubberduck.UI.UnitTesting;
77
using Rubberduck.UnitTesting;
8+
using Rubberduck.VBEditor.Extensions;
89

910
namespace Rubberduck.UI.Command
1011
{
@@ -28,7 +29,7 @@ public RunAllTestsCommand(VBE vbe, RubberduckParserState state, ITestEngine engi
2829

2930
public override bool CanExecute(object parameter)
3031
{
31-
return _vbe.VBProjects.Cast<VBProject>().All(project => project.Mode == vbext_VBAMode.vbext_vm_Design);
32+
return _vbe.IsInDesignMode();
3233
}
3334

3435
public override void Execute(object parameter)

RetailCoder.VBE/UI/UnitTesting/TestExplorerViewModel.cs

Lines changed: 5 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
using Rubberduck.UI.Controls;
1414
using Rubberduck.UI.Settings;
1515
using Rubberduck.UnitTesting;
16+
using Rubberduck.VBEditor.Extensions;
1617

1718
namespace Rubberduck.UI.UnitTesting
1819
{
@@ -85,26 +86,22 @@ private void RunCompleted(object sender, TestRunEventArgs e)
8586

8687
private bool CanExecuteRunPassedTestsCommand(object obj)
8788
{
88-
return _vbe.VBProjects.Cast<VBProject>().All(project => project.Mode == vbext_VBAMode.vbext_vm_Design) &&
89-
_model.Tests.Any(test => test.Result.Outcome == TestOutcome.Succeeded);
89+
return _vbe.IsInDesignMode() && _model.Tests.Any(test => test.Result.Outcome == TestOutcome.Succeeded);
9090
}
9191

9292
private bool CanExecuteRunFailedTestsCommand(object obj)
9393
{
94-
return _vbe.VBProjects.Cast<VBProject>().All(project => project.Mode == vbext_VBAMode.vbext_vm_Design) &&
95-
_model.Tests.Any(test => test.Result.Outcome == TestOutcome.Failed);
94+
return _vbe.IsInDesignMode() && _model.Tests.Any(test => test.Result.Outcome == TestOutcome.Failed);
9695
}
9796

9897
private bool CanExecuteRunNotExecutedTestsCommand(object obj)
9998
{
100-
return _vbe.VBProjects.Cast<VBProject>().All(project => project.Mode == vbext_VBAMode.vbext_vm_Design) &&
101-
_model.Tests.Any(test => test.Result.Outcome == TestOutcome.Unknown);
99+
return _vbe.IsInDesignMode() && _model.Tests.Any(test => test.Result.Outcome == TestOutcome.Unknown);
102100
}
103101

104102
private bool CanExecuteRepeatLastRunCommand(object obj)
105103
{
106-
return _vbe.VBProjects.Cast<VBProject>().All(project => project.Mode == vbext_VBAMode.vbext_vm_Design) &&
107-
_model.LastRun.Any();
104+
return _vbe.IsInDesignMode() && _model.LastRun.Any();
108105
}
109106

110107
public event EventHandler<EventArgs> TestCompleted;

Rubberduck.Parsing/VBA/RubberduckParser.cs

Lines changed: 32 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -124,7 +124,7 @@ public void Parse()
124124
// tests do not fire events when components are removed--clear components
125125
foreach (var tree in State.ParseTrees)
126126
{
127-
State.ClearStateCache(tree.Key.Component);
127+
State.ClearStateCache(tree.Key); // handle potentially removed components without crashing
128128
}
129129

130130
SyncComReferences(State.Projects);
@@ -205,6 +205,32 @@ private void ParseAll()
205205
}
206206
}
207207

208+
var componentsRemoved = false;
209+
foreach (var declaration in State.AllUserDeclarations)
210+
{
211+
if (!declaration.DeclarationType.HasFlag(DeclarationType.Module))
212+
{
213+
continue;
214+
}
215+
216+
var componentExists = false;
217+
foreach (var component in components)
218+
{
219+
if (component.Name == declaration.ComponentName &&
220+
component.Collection.Parent.HelpFile == declaration.ProjectId)
221+
{
222+
componentExists = true;
223+
break;
224+
}
225+
}
226+
227+
if (!componentExists)
228+
{
229+
componentsRemoved = true;
230+
State.ClearStateCache(declaration.QualifiedName.QualifiedModuleName);
231+
}
232+
}
233+
208234
var toParse = new List<VBComponent>();
209235
var unchanged = new List<VBComponent>();
210236

@@ -225,6 +251,11 @@ private void ParseAll()
225251

226252
if (toParse.Count == 0)
227253
{
254+
if (componentsRemoved) // trigger UI updates
255+
{
256+
State.SetStatusAndFireStateChanged(ParserState.ResolvedDeclarations);
257+
}
258+
228259
State.SetStatusAndFireStateChanged(State.Status);
229260
return;
230261
}

Rubberduck.Parsing/VBA/RubberduckParserState.cs

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -677,6 +677,53 @@ public bool ClearStateCache(VBComponent component, bool notifyStateChanged = fal
677677
return success;
678678
}
679679

680+
public bool ClearStateCache(QualifiedModuleName component, bool notifyStateChanged = false)
681+
{
682+
var keys = new List<QualifiedModuleName> { component };
683+
foreach (var key in _moduleStates.Keys)
684+
{
685+
if (key.Equals(component) && !keys.Contains(key))
686+
{
687+
keys.Add(key);
688+
}
689+
}
690+
691+
var success = RemoveKeysFromCollections(keys);
692+
693+
var projectId = component.ProjectId;
694+
var sameProjectDeclarations = new List<KeyValuePair<QualifiedModuleName, ModuleState>>();
695+
foreach (var item in _moduleStates)
696+
{
697+
if (item.Key.ProjectId == projectId)
698+
{
699+
sameProjectDeclarations.Add(new KeyValuePair<QualifiedModuleName, ModuleState>(item.Key, item.Value));
700+
}
701+
}
702+
703+
var projectCount = 0;
704+
foreach (var item in sameProjectDeclarations)
705+
{
706+
if (item.Value.Declarations == null) { continue; }
707+
708+
foreach (var declaration in item.Value.Declarations)
709+
{
710+
if (declaration.Key.DeclarationType == DeclarationType.Project)
711+
{
712+
projectCount++;
713+
break;
714+
}
715+
}
716+
}
717+
718+
if (notifyStateChanged)
719+
{
720+
OnStateChanged(ParserState.ResolvedDeclarations); // trigger test explorer and code explorer updates
721+
OnStateChanged(ParserState.Ready); // trigger find all references &c. updates
722+
}
723+
724+
return success;
725+
}
726+
680727
public bool RemoveRenamedComponent(VBComponent component, string oldComponentName)
681728
{
682729
var match = new QualifiedModuleName(component, oldComponentName);

Rubberduck.VBEEditor/Extensions/VbeExtensions.cs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,11 @@ public static void SetSelection(this VBE vbe, VBProject vbProject, Selection sel
2828
}
2929
}
3030

31+
public static bool IsInDesignMode(this VBE vbe)
32+
{
33+
return vbe.VBProjects.Cast<VBProject>().All(project => project.Mode == vbext_VBAMode.vbext_vm_Design);
34+
}
35+
3136
public static CodeModuleSelection FindInstruction(this VBE vbe, QualifiedModuleName qualifiedModuleName, Selection selection)
3237
{
3338
var module = qualifiedModuleName.Component.CodeModule;

0 commit comments

Comments
 (0)