Skip to content

Commit 9302839

Browse files
committed
Move checks for import into ImportCommand
Previously, these checks were only executed in the update from files command. However, it was discovered that not doing checks will silently not import modules for which the import fails and even aborts in the middle for document modules. Because of these problems, all major checks are now executed for all subtypes of the import command. The subtypes now only determine the modules to remove before import and are allowed to add some more validation at chosen places in the import checks.
1 parent 8bf1526 commit 9302839

File tree

12 files changed

+1574
-709
lines changed

12 files changed

+1574
-709
lines changed

Rubberduck.Core/UI/CodeExplorer/CodeExplorerControl.xaml

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -471,7 +471,8 @@
471471
CommandParameter="{Binding SelectedItem, Mode=OneWay}" />
472472
<MenuItem Header="{Resx ResxName=Rubberduck.Resources.CodeExplorer.CodeExplorerUI, Key=ReplaceFromFiles}"
473473
Command="{Binding ReplaceProjectContentsFromFilesCommand}"
474-
CommandParameter="{Binding SelectedItem, Mode=OneWay}" />
474+
CommandParameter="{Binding SelectedItem, Mode=OneWay}"
475+
Visibility="{Binding VBAVisibility}" />
475476
</MenuItem>
476477
<MenuItem Header="{Resx ResxName=Rubberduck.Resources.CodeExplorer.CodeExplorerUI, Key=CodeExplorer_AddModule}"
477478
ItemsSource="{StaticResource AddModuleCommands}">

Rubberduck.Core/UI/CodeExplorer/Commands/ImportCommand.cs

Lines changed: 347 additions & 6 deletions
Large diffs are not rendered by default.
Lines changed: 21 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,15 @@
11
using System.Collections.Generic;
22
using System.Linq;
33
using Rubberduck.Interaction;
4+
using Rubberduck.JunkDrawer.Extensions;
5+
using Rubberduck.Parsing.Symbols;
46
using Rubberduck.Parsing.VBA;
57
using Rubberduck.Resources;
8+
using Rubberduck.VBEditor;
9+
using Rubberduck.VBEditor.ComManagement;
610
using Rubberduck.VBEditor.Events;
7-
using Rubberduck.VBEditor.Extensions;
8-
using Rubberduck.VBEditor.SafeComWrappers;
911
using Rubberduck.VBEditor.SafeComWrappers.Abstract;
12+
using Rubberduck.VBEditor.Utility;
1013

1114
namespace Rubberduck.UI.CodeExplorer.Commands
1215
{
@@ -17,21 +20,28 @@ public ReplaceProjectContentsFromFilesCommand(
1720
IFileSystemBrowserFactory dialogFactory,
1821
IVbeEvents vbeEvents,
1922
IParseManager parseManager,
23+
IDeclarationFinderProvider declarationFinderProvider,
24+
IProjectsProvider projectsProvider,
25+
IModuleNameFromFileExtractor moduleNameFromFileExtractor,
26+
IEnumerable<IRequiredBinaryFilesFromFileNameExtractor> binaryFileExtractors,
27+
IFileExistenceChecker fileExistenceChecker,
2028
IMessageBox messageBox)
21-
:base(vbe, dialogFactory, vbeEvents, parseManager, messageBox)
22-
{ }
29+
:base(vbe, dialogFactory, vbeEvents, parseManager, declarationFinderProvider, projectsProvider, moduleNameFromFileExtractor, binaryFileExtractors, fileExistenceChecker, messageBox)
30+
{}
2331

2432
protected override string DialogsTitle => RubberduckUI.ReplaceProjectContentsFromFilesCommand_DialogCaption;
2533

26-
protected override void ImportFiles(ICollection<string> filesToImport, IVBProject targetProject)
34+
protected override ICollection<QualifiedModuleName> ModulesToRemoveBeforeImport(IDictionary<string, QualifiedModuleName> existingModules)
2735
{
28-
if (!UserConfirmsToReplaceProjectContents(targetProject))
29-
{
30-
return;
31-
}
36+
return DeclarationFinderProvider.DeclarationFinder
37+
.UserDeclarations(DeclarationType.Module)
38+
.Select(decl => decl.QualifiedModuleName)
39+
.ToHashSet();
40+
}
3241

33-
RemoveReImportableComponents(targetProject);
34-
base.ImportFiles(filesToImport, targetProject);
42+
protected override bool UserDeniesExecution(IVBProject targetProject)
43+
{
44+
return !UserConfirmsToReplaceProjectContents(targetProject);
3545
}
3646

3747
private bool UserConfirmsToReplaceProjectContents(IVBProject project)
@@ -40,29 +50,5 @@ private bool UserConfirmsToReplaceProjectContents(IVBProject project)
4050
var message = string.Format(RubberduckUI.ReplaceProjectContentsFromFilesCommand_DialogCaption, projectName);
4151
return MessageBox.ConfirmYesNo(message, DialogsTitle, false);
4252
}
43-
44-
private void RemoveReImportableComponents(IVBProject project)
45-
{
46-
var reImportableComponentTypes = ReImportableComponentTypes;
47-
using(var components = project.VBComponents)
48-
{
49-
foreach(var component in components)
50-
{
51-
using (component)
52-
{
53-
if (reImportableComponentTypes.Contains(component.Type))
54-
{
55-
components.Remove(component);
56-
}
57-
}
58-
}
59-
}
60-
}
61-
62-
//We currently do not take precautions for component types requiring a binary file to be present.
63-
private ICollection<ComponentType> ReImportableComponentTypes => ComponentTypesForExtension.Values
64-
.SelectMany(componentTypes => componentTypes)
65-
.Where(componentType => componentType != ComponentType.Document)
66-
.ToList();
6753
}
6854
}

0 commit comments

Comments
 (0)