Skip to content

Commit a904f35

Browse files
authored
Merge pull request #1969 from Hosch250/Issue1908
Remove/reload one module at a time
2 parents 5442afe + 18b8a51 commit a904f35

File tree

3 files changed

+73
-167
lines changed

3 files changed

+73
-167
lines changed

RetailCoder.VBE/App.cs

Lines changed: 0 additions & 162 deletions
Original file line numberDiff line numberDiff line change
@@ -157,168 +157,6 @@ public void Shutdown()
157157
}
158158
}
159159

160-
/*#region sink handlers.
161-
async void sink_ProjectRemoved(object sender, DispatcherEventArgs<VBProject> e)
162-
{
163-
if (!_handleSinkEvents || !_vbe.IsInDesignMode()) { return; }
164-
165-
if (e.Item.Protection == vbext_ProjectProtection.vbext_pp_locked)
166-
{
167-
Logger.Debug("Locked project '{0}' was removed.", e.Item.Name);
168-
return;
169-
}
170-
171-
_parser.Cancel();
172-
173-
var projectId = e.Item.HelpFile;
174-
Debug.Assert(projectId != null);
175-
176-
_parser.State.RemoveProject(e.Item);
177-
_parser.State.OnParseRequested(this);
178-
}
179-
180-
async void sink_ProjectAdded(object sender, DispatcherEventArgs<VBProject> e)
181-
{
182-
if (!_handleSinkEvents || !_vbe.IsInDesignMode()) { return; }
183-
184-
Logger.Debug("Project '{0}' was added.", e.Item.Name);
185-
if (e.Item.Protection == vbext_ProjectProtection.vbext_pp_locked)
186-
{
187-
Logger.Debug("Project is protected and will not be added to parser state.");
188-
return;
189-
}
190-
191-
_parser.State.AddProject(e.Item); // note side-effect: assigns ProjectId/HelpFile
192-
var projectId = e.Item.HelpFile;
193-
RegisterComponentsEventSink(e.Item.VBComponents, projectId);
194-
195-
if (!_parser.State.AllDeclarations.Any())
196-
{
197-
// forces menus to evaluate their CanExecute state:
198-
Parser_StateChanged(this, new ParserStateEventArgs(ParserState.Pending));
199-
_stateBar.SetStatusText();
200-
return;
201-
}
202-
203-
_parser.State.OnParseRequested(sender);
204-
}
205-
206-
async void sink_ComponentSelected(object sender, DispatcherEventArgs<VBComponent> e)
207-
{
208-
if (!_handleSinkEvents || !_vbe.IsInDesignMode()) { return; }
209-
210-
if (!_parser.State.AllDeclarations.Any())
211-
{
212-
return;
213-
}
214-
}
215-
216-
async void sink_ComponentRenamed(object sender, DispatcherRenamedEventArgs<VBComponent> e)
217-
{
218-
if (!_handleSinkEvents || !_vbe.IsInDesignMode()) { return; }
219-
220-
if (!_parser.State.AllDeclarations.Any())
221-
{
222-
return;
223-
}
224-
225-
_parser.Cancel();
226-
227-
_sourceControlPanelVM.HandleRenamedComponent(e.Item, e.OldName);
228-
229-
Logger.Debug("Component '{0}' was renamed to '{1}'.", e.OldName, e.Item.Name);
230-
231-
var projectId = e.Item.Collection.Parent.HelpFile;
232-
var componentDeclaration = _parser.State.AllDeclarations.FirstOrDefault(f =>
233-
f.ProjectId == projectId &&
234-
f.DeclarationType == DeclarationType.ClassModule &&
235-
f.IdentifierName == e.OldName);
236-
237-
if (e.Item.Type == vbext_ComponentType.vbext_ct_Document &&
238-
componentDeclaration != null &&
239-
240-
// according to ThunderFrame, Excel is the only one we explicitly support
241-
// with two Document-component types just skip the Worksheet component
242-
((ClassModuleDeclaration) componentDeclaration).Supertypes.All(a => a.IdentifierName != "Worksheet"))
243-
{
244-
_parser.State.RemoveProject(projectId);
245-
246-
_parser.State.AddProject(e.Item.Collection.Parent);
247-
}
248-
else
249-
{
250-
_parser.State.RemoveRenamedComponent(e.Item, e.OldName);
251-
}
252-
253-
_parser.State.OnParseRequested(this);
254-
}
255-
256-
async void sink_ComponentRemoved(object sender, DispatcherEventArgs<VBComponent> e)
257-
{
258-
if (!_handleSinkEvents || !_vbe.IsInDesignMode()) { return; }
259-
260-
if (!_parser.State.AllDeclarations.Any())
261-
{
262-
return;
263-
}
264-
265-
_parser.Cancel(e.Item);
266-
267-
_sourceControlPanelVM.HandleRemovedComponent(e.Item);
268-
269-
Logger.Debug("Component '{0}' was removed.", e.Item.Name);
270-
_parser.State.ClearStateCache(e.Item, true);
271-
}
272-
273-
async void sink_ComponentReloaded(object sender, DispatcherEventArgs<VBComponent> e)
274-
{
275-
if (!_handleSinkEvents || !_vbe.IsInDesignMode()) { return; }
276-
277-
if (!_parser.State.AllDeclarations.Any())
278-
{
279-
return;
280-
}
281-
282-
_parser.Cancel(e.Item);
283-
284-
_parser.State.OnParseRequested(sender, e.Item);
285-
}
286-
287-
async void sink_ComponentAdded(object sender, DispatcherEventArgs<VBComponent> e)
288-
{
289-
if (!_handleSinkEvents || !_vbe.IsInDesignMode()) { return; }
290-
291-
if (!_parser.State.AllDeclarations.Any())
292-
{
293-
return;
294-
}
295-
296-
_sourceControlPanelVM.HandleAddedComponent(e.Item);
297-
298-
Logger.Debug("Component '{0}' was added.", e.Item.Name);
299-
_parser.State.OnParseRequested(sender, e.Item);
300-
}
301-
302-
async void sink_ProjectRenamed(object sender, DispatcherRenamedEventArgs<VBProject> e)
303-
{
304-
if (!_handleSinkEvents || !_vbe.IsInDesignMode()) { return; }
305-
306-
if (!_parser.State.AllDeclarations.Any())
307-
{
308-
return;
309-
}
310-
311-
_parser.Cancel();
312-
313-
Logger.Debug("Project '{0}' (ID {1}) was renamed to '{2}'.", e.OldName, e.Item.HelpFile, e.Item.Name);
314-
315-
_parser.State.RemoveProject(e.Item.HelpFile);
316-
_parser.State.AddProject(e.Item);
317-
318-
_parser.State.OnParseRequested(sender);
319-
}
320-
#endregion*/
321-
322160
private void _stateBar_Refresh(object sender, EventArgs e)
323161
{
324162
// handles "refresh" button click on "Rubberduck" command bar

Rubberduck.SourceControl/SourceControlProviderBase.cs

Lines changed: 18 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -212,15 +212,29 @@ private void Refresh()
212212
name = selection.QualifiedName.Component.Name;
213213
}
214214

215-
Project.RemoveAllComponents();
216-
Project.ImportSourceFiles(CurrentRepository.LocalLocation);
215+
try
216+
{
217+
Project.LoadAllComponents(CurrentRepository.LocalLocation);
218+
}
219+
catch (AggregateException ex)
220+
{
221+
HandleVbeSinkEvents = true;
222+
throw new SourceControlException("Unknown exception.", ex);
223+
}
217224

218225
Project.VBE.SetSelection(selection.QualifiedName.Project, selection.Selection, name, _wrapperFactory);
219226
}
220227
else
221228
{
222-
Project.RemoveAllComponents();
223-
Project.ImportSourceFiles(CurrentRepository.LocalLocation);
229+
try
230+
{
231+
Project.LoadAllComponents(CurrentRepository.LocalLocation);
232+
}
233+
catch (AggregateException ex)
234+
{
235+
HandleVbeSinkEvents = true;
236+
throw new SourceControlException("Unknown exception.", ex);
237+
}
224238
}
225239

226240
HandleVbeSinkEvents = true;

Rubberduck.VBEEditor/Extensions/VbProjectExtensions.cs

Lines changed: 55 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
1-
using Microsoft.Vbe.Interop;
1+
using System;
2+
using Microsoft.Vbe.Interop;
23
using System.Collections.Generic;
34
using System.IO;
45
using System.Linq;
@@ -102,5 +103,58 @@ public static void ImportSourceFiles(this VBProject project, string filePath)
102103
project.VBComponents.ImportSourceFile(file.FullName);
103104
}
104105
}
106+
107+
public static void LoadAllComponents(this VBProject project, string filePath)
108+
{
109+
var dirInfo = new DirectoryInfo(filePath);
110+
111+
var files = dirInfo.EnumerateFiles()
112+
.Where(f => f.Extension == VBComponentExtensions.StandardExtension ||
113+
f.Extension == VBComponentExtensions.ClassExtension ||
114+
f.Extension == VBComponentExtensions.DocClassExtension ||
115+
f.Extension == VBComponentExtensions.FormExtension
116+
);
117+
118+
var exceptions = new List<Exception>();
119+
120+
foreach (VBComponent component in project.VBComponents)
121+
{
122+
try
123+
{
124+
var name = component.Name;
125+
project.VBComponents.RemoveSafely(component);
126+
127+
var file = files.SingleOrDefault(f => f.Name == name + f.Extension);
128+
if (file != null)
129+
{
130+
project.VBComponents.ImportSourceFile(file.FullName);
131+
}
132+
}
133+
catch (Exception ex)
134+
{
135+
exceptions.Add(ex);
136+
}
137+
}
138+
139+
foreach (var file in files)
140+
{
141+
try
142+
{
143+
if (project.VBComponents.OfType<VBComponent>().All(v => v.Name + file.Extension != file.Name))
144+
{
145+
project.VBComponents.ImportSourceFile(file.FullName);
146+
}
147+
}
148+
catch (Exception ex)
149+
{
150+
exceptions.Add(ex);
151+
}
152+
}
153+
154+
if (exceptions.Count != 0)
155+
{
156+
throw new AggregateException(string.Empty, exceptions);
157+
}
158+
}
105159
}
106160
}

0 commit comments

Comments
 (0)