Skip to content

Commit d865d10

Browse files
authored
Merge pull request #3735 from MDoerner/ExtractComponentsFromQMNsSecondTry
Removed `IComponent` reference from `QualifiedModuleName`, made struct `readonly` and introduced `ProjectRepository`.
2 parents ded10ed + e3a82e0 commit d865d10

File tree

103 files changed

+3240
-787
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

103 files changed

+3240
-787
lines changed

RetailCoder.VBE/API/VBA/ParserState.cs

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
using Rubberduck.Parsing.VBA;
1111
using Rubberduck.UI.Command.MenuItems;
1212
using Rubberduck.Parsing.Symbols;
13+
using Rubberduck.VBEditor.ComManagement;
1314
using Rubberduck.VBEditor.SafeComWrappers.VBA;
1415

1516
namespace Rubberduck.API.VBA
@@ -64,14 +65,15 @@ public void Initialize(Microsoft.Vbe.Interop.VBE vbe)
6465

6566
_vbe = new VBE(vbe);
6667
var declarationFinderFactory = new ConcurrentlyConstructedDeclarationFinderFactory();
67-
_state = new RubberduckParserState(null, declarationFinderFactory);
68+
var projectRepository = new ProjectsRepository(_vbe);
69+
_state = new RubberduckParserState(null, projectRepository, declarationFinderFactory);
6870
_state.StateChanged += _state_StateChanged;
6971

7072
var exporter = new ModuleExporter();
7173

7274
Func<IVBAPreprocessor> preprocessorFactory = () => new VBAPreprocessor(double.Parse(_vbe.Version, CultureInfo.InvariantCulture));
73-
_attributeParser = new AttributeParser(exporter, preprocessorFactory);
74-
var projectManager = new ProjectManager(_state, _vbe);
75+
_attributeParser = new AttributeParser(exporter, preprocessorFactory, _state.ProjectsProvider);
76+
var projectManager = new RepositoryProjectManager(projectRepository);
7577
var moduleToModuleReferenceManager = new ModuleToModuleReferenceManager();
7678
var parserStateManager = new ParserStateManager(_state);
7779
var referenceRemover = new ReferenceRemover(_state, moduleToModuleReferenceManager);

RetailCoder.VBE/Navigation/CodeExplorer/CodeExplorerComponentViewModel.cs

Lines changed: 14 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
using Rubberduck.VBEditor;
88
using resx = Rubberduck.UI.CodeExplorer.CodeExplorer;
99
using Rubberduck.Parsing.Annotations;
10+
using Rubberduck.VBEditor.ComManagement;
1011
using Rubberduck.VBEditor.SafeComWrappers;
1112

1213
namespace Rubberduck.Navigation.CodeExplorer
@@ -33,10 +34,13 @@ public class CodeExplorerComponentViewModel : CodeExplorerItemViewModel, ICodeEx
3334
DeclarationType.Variable,
3435
};
3536

36-
public CodeExplorerComponentViewModel(CodeExplorerItemViewModel parent, Declaration declaration, IEnumerable<Declaration> declarations)
37+
private readonly IProjectsProvider _projectsProvider;
38+
39+
public CodeExplorerComponentViewModel(CodeExplorerItemViewModel parent, Declaration declaration, IEnumerable<Declaration> declarations, IProjectsProvider projectsProvider)
3740
{
3841
Parent = parent;
3942
Declaration = declaration;
43+
_projectsProvider = projectsProvider;
4044
_icon = Icons[DeclarationType];
4145
Items = declarations.GroupBy(item => item.Scope).SelectMany(grouping =>
4246
grouping.Where(item => item.ParentDeclaration != null
@@ -48,12 +52,17 @@ public CodeExplorerComponentViewModel(CodeExplorerItemViewModel parent, Declarat
4852

4953
_name = Declaration.IdentifierName;
5054

51-
var component = declaration.QualifiedName.QualifiedModuleName.Component;
55+
var qualifiedModuleName = declaration.QualifiedName.QualifiedModuleName;
5256
try
5357
{
54-
if (component.Type == ComponentType.Document)
58+
if (qualifiedModuleName.ComponentType == ComponentType.Document)
5559
{
56-
var parenthesizedName = component.Properties["Name"].Value.ToString();
60+
var component = _projectsProvider.Component(qualifiedModuleName);
61+
string parenthesizedName;
62+
using (var properties = component.Properties)
63+
{
64+
parenthesizedName = properties["Name"].Value.ToString() ?? String.Empty;
65+
}
5766

5867
if (ContainsBuiltinDocumentPropertiesProperty())
5968
{
@@ -79,7 +88,7 @@ public CodeExplorerComponentViewModel(CodeExplorerItemViewModel parent, Declarat
7988

8089
private bool ContainsBuiltinDocumentPropertiesProperty()
8190
{
82-
var properties = Declaration.QualifiedName.QualifiedModuleName.Component.Properties;
91+
using (var properties = _projectsProvider.Component(Declaration.QualifiedName.QualifiedModuleName).Properties)
8392
{
8493
return properties.Any(item => item.Name == "BuiltinDocumentProperties");
8594
}

RetailCoder.VBE/Navigation/CodeExplorer/CodeExplorerCustomFolderViewModel.cs

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
using System.Windows.Media.Imaging;
55
using Rubberduck.Parsing.Symbols;
66
using Rubberduck.VBEditor;
7+
using Rubberduck.VBEditor.ComManagement;
78
using resx = Rubberduck.Properties.Resources;
89

910
namespace Rubberduck.Navigation.CodeExplorer
@@ -18,9 +19,12 @@ public class CodeExplorerCustomFolderViewModel : CodeExplorerItemViewModel
1819
DeclarationType.UserForm,
1920
};
2021

21-
public CodeExplorerCustomFolderViewModel(CodeExplorerItemViewModel parent, string name, string fullPath)
22+
private readonly IProjectsProvider _projectsProvider;
23+
24+
public CodeExplorerCustomFolderViewModel(CodeExplorerItemViewModel parent, string name, string fullPath, IProjectsProvider projectsProvider)
2225
{
2326
_parent = parent;
27+
_projectsProvider = projectsProvider;
2428
FullPath = fullPath;
2529
Name = name.Replace("\"", string.Empty);
2630
FolderAttribute = string.Format("@Folder(\"{0}\")", fullPath.Replace("\"", string.Empty));
@@ -42,7 +46,7 @@ public void AddNodes(List<Declaration> declarations)
4246
var members = declarations.Where(item =>
4347
!ComponentTypes.Contains(item.DeclarationType) && item.ComponentName == moduleName);
4448

45-
AddChild(new CodeExplorerComponentViewModel(this, parent, members));
49+
AddChild(new CodeExplorerComponentViewModel(this, parent, members, _projectsProvider));
4650
}
4751
catch (InvalidOperationException exception)
4852
{

RetailCoder.VBE/Navigation/CodeExplorer/CodeExplorerItemViewModel.cs

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -85,13 +85,13 @@ public override int Compare(CodeExplorerItemViewModel x, CodeExplorerItemViewMod
8585

8686
if (x.ExpandedIcon != y.ExpandedIcon)
8787
{
88-
// ReSharper disable PossibleInvalidOperationException - this will have a component
89-
var xComponent = x.QualifiedSelection.Value.QualifiedName.Component;
90-
var yComponent = y.QualifiedSelection.Value.QualifiedName.Component;
88+
// ReSharper disable PossibleInvalidOperationException - this will have a QualifiedSelection
89+
var xQmn = x.QualifiedSelection.Value.QualifiedName;
90+
var yQmn = y.QualifiedSelection.Value.QualifiedName;
9191

92-
if (xComponent.Type == ComponentType.Document ^ yComponent.Type == ComponentType.Document)
92+
if (xQmn.ComponentType == ComponentType.Document ^ yQmn.ComponentType == ComponentType.Document)
9393
{
94-
return xComponent.Type == ComponentType.Document ? -1 : 1;
94+
return xQmn.ComponentType == ComponentType.Document ? -1 : 1;
9595
}
9696
}
9797

RetailCoder.VBE/Navigation/CodeExplorer/CodeExplorerViewModel.cs

Lines changed: 4 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,6 @@ public sealed class CodeExplorerViewModel : ViewModelBase, IDisposable
2828
{
2929
private readonly FolderHelper _folderHelper;
3030
private readonly RubberduckParserState _state;
31-
private IConfigProvider<GeneralSettings> _generalSettingsProvider;
3231
private readonly IConfigProvider<WindowSettings> _windowSettingsProvider;
3332
private readonly GeneralSettings _generalSettings;
3433
private readonly WindowSettings _windowSettings;
@@ -42,7 +41,6 @@ public CodeExplorerViewModel(FolderHelper folderHelper, RubberduckParserState st
4241
_state = state;
4342
_state.StateChanged += HandleStateChanged;
4443
_state.ModuleStateChanged += ParserState_ModuleStateChanged;
45-
_generalSettingsProvider = generalSettingsProvider;
4644
_windowSettingsProvider = windowSettingsProvider;
4745

4846
if (generalSettingsProvider != null)
@@ -374,8 +372,7 @@ private void ParserState_ModuleStateChanged(object sender, Parsing.ParseProgress
374372
return;
375373
}
376374

377-
var components = e.Module.Component.Collection;
378-
var componentProject = components.Parent;
375+
var componentProject = _state.ProjectsProvider.Project(e.Module.ProjectId);
379376
{
380377
var projectNode = Projects.OfType<CodeExplorerProjectViewModel>()
381378
.FirstOrDefault(p => p.Declaration.Project.Equals(componentProject));
@@ -399,13 +396,13 @@ private void ParserState_ModuleStateChanged(object sender, Parsing.ParseProgress
399396
{
400397
if (folderNode == null)
401398
{
402-
folderNode = new CodeExplorerCustomFolderViewModel(projectNode, projectName, projectName);
399+
folderNode = new CodeExplorerCustomFolderViewModel(projectNode, projectName, projectName, _state.ProjectsProvider);
403400
projectNode.AddChild(folderNode);
404401
}
405402

406403
var declaration = CreateDeclaration(e.Module);
407404
var newNode =
408-
new CodeExplorerComponentViewModel(folderNode, declaration, new List<Declaration>())
405+
new CodeExplorerComponentViewModel(folderNode, declaration, new List<Declaration>(), _state.ProjectsProvider)
409406
{
410407
IsErrorState = true
411408
};
@@ -427,7 +424,7 @@ private Declaration CreateDeclaration(QualifiedModuleName module)
427424
{
428425
var projectDeclaration =
429426
_state.DeclarationFinder.UserDeclarations(DeclarationType.Project)
430-
.FirstOrDefault(item => item.Project.VBComponents.Contains(module.Component));
427+
.FirstOrDefault(item => item.Project.ProjectId == module.ProjectId);
431428

432429
if (module.ComponentType == ComponentType.StandardModule)
433430
{

RetailCoder.VBE/Navigation/Folders/FolderHelper.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ public CodeExplorerCustomFolderViewModel GetFolderTree(Declaration declaration =
2323
{
2424
var delimiter = GetDelimiter();
2525

26-
var root = new CodeExplorerCustomFolderViewModel(null, string.Empty, string.Empty);
26+
var root = new CodeExplorerCustomFolderViewModel(null, string.Empty, string.Empty, _state.ProjectsProvider);
2727

2828
var items = declaration == null
2929
? _state.AllUserDeclarations.ToList()
@@ -46,7 +46,7 @@ public CodeExplorerCustomFolderViewModel GetFolderTree(Declaration declaration =
4646
var node = currentNode.Items.FirstOrDefault(i => i.Name == section);
4747
if (node == null)
4848
{
49-
node = new CodeExplorerCustomFolderViewModel(currentNode, section, fullPath);
49+
node = new CodeExplorerCustomFolderViewModel(currentNode, section, fullPath, _state.ProjectsProvider);
5050
currentNode.AddChild(node);
5151
}
5252

RetailCoder.VBE/Refactorings/ImplementInterface/ImplementInterfaceRefactoring.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -87,7 +87,7 @@ public void Refactor(QualifiedSelection selection)
8787

8888
if (oldSelection.HasValue)
8989
{
90-
using (var module = oldSelection.Value.QualifiedName.Component.CodeModule)
90+
using (var module = _state.ProjectsProvider.Component(oldSelection.Value.QualifiedName).CodeModule)
9191
{
9292
using (var pane = module.CodePane)
9393
{

RetailCoder.VBE/Refactorings/IntroduceField/IntroduceFieldRefactoring.cs

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -89,10 +89,12 @@ private void PromoteVariable(IModuleRewriter rewriter, Declaration target)
8989

9090
if (oldSelection.HasValue)
9191
{
92-
var module = oldSelection.Value.QualifiedName.Component.CodeModule;
93-
var pane = module.CodePane;
92+
using (var module = _state.ProjectsProvider.Component(oldSelection.Value.QualifiedName).CodeModule)
9493
{
95-
pane.Selection = oldSelection.Value.Selection;
94+
using (var pane = module.CodePane)
95+
{
96+
pane.Selection = oldSelection.Value.Selection;
97+
}
9698
}
9799
}
98100

RetailCoder.VBE/Refactorings/RemoveParameters/RemoveParametersRefactoring.cs

Lines changed: 8 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
using Rubberduck.Parsing.VBA;
1111
using Rubberduck.UI;
1212
using Rubberduck.VBEditor;
13+
using Rubberduck.VBEditor.ComManagement;
1314
using Rubberduck.VBEditor.SafeComWrappers.Abstract;
1415
using Antlr4.Runtime;
1516

@@ -21,11 +22,13 @@ public class RemoveParametersRefactoring : IRefactoring
2122
private readonly IRefactoringPresenterFactory<IRemoveParametersPresenter> _factory;
2223
private RemoveParametersModel _model;
2324
private readonly HashSet<IModuleRewriter> _rewriters = new HashSet<IModuleRewriter>();
25+
private readonly IProjectsProvider _projectsProvider;
2426

25-
public RemoveParametersRefactoring(IVBE vbe, IRefactoringPresenterFactory<IRemoveParametersPresenter> factory)
27+
public RemoveParametersRefactoring(IVBE vbe, IRefactoringPresenterFactory<IRemoveParametersPresenter> factory, IProjectsProvider projectsProvider)
2628
{
2729
_vbe = vbe;
2830
_factory = factory;
31+
_projectsProvider = projectsProvider;
2932
}
3033

3134
public void Refactor()
@@ -42,16 +45,9 @@ public void Refactor()
4245
return;
4346
}
4447

45-
QualifiedSelection? oldSelection = null;
4648
using (var pane = _vbe.ActiveCodePane)
4749
{
48-
using (var module = pane.CodeModule)
49-
{
50-
if (!module.IsWrappingNullReference)
51-
{
52-
oldSelection = module.GetQualifiedSelection();
53-
}
54-
}
50+
var oldSelection = pane.GetQualifiedSelection();
5551

5652
RemoveParameters();
5753

@@ -66,7 +62,7 @@ public void Refactor()
6662

6763
public void Refactor(QualifiedSelection target)
6864
{
69-
var pane = _vbe.ActiveCodePane;
65+
using (var pane = _vbe.ActiveCodePane)
7066
{
7167
if (pane.IsWrappingNullReference)
7268
{
@@ -84,7 +80,7 @@ public void Refactor(Declaration target)
8480
throw new ArgumentException("Invalid declaration type");
8581
}
8682

87-
var pane = _vbe.ActiveCodePane;
83+
using (var pane = _vbe.ActiveCodePane)
8884
{
8985
if (pane.IsWrappingNullReference)
9086
{
@@ -144,7 +140,7 @@ private void AdjustReferences(IEnumerable<IdentifierReference> references, Decla
144140
continue;
145141
}
146142

147-
using (var module = reference.QualifiedModuleName.Component.CodeModule)
143+
using (var module = _projectsProvider.Component(reference.QualifiedModuleName).CodeModule)
148144
{
149145
RemoveCallArguments(argumentList, module);
150146
}

RetailCoder.VBE/Refactorings/Rename/RenameRefactoring.cs

Lines changed: 14 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -211,7 +211,8 @@ private bool IsValidTarget(Declaration target)
211211

212212
if (target.DeclarationType.HasFlag(DeclarationType.Control))
213213
{
214-
using (var controls = target.QualifiedName.QualifiedModuleName.Component.Controls)
214+
var component = _state.ProjectsProvider.Component(target.QualifiedName.QualifiedModuleName);
215+
using (var controls = component.Controls)
215216
{
216217
using (var control = controls.FirstOrDefault(item => item.Name == target.IdentifierName))
217218
{
@@ -225,7 +226,7 @@ private bool IsValidTarget(Declaration target)
225226
}
226227
else if (target.DeclarationType.HasFlag(DeclarationType.Module))
227228
{
228-
using (var module = target.QualifiedName.QualifiedModuleName.Component.CodeModule)
229+
using (var module = _state.ProjectsProvider.Component(target.QualifiedName.QualifiedModuleName).CodeModule)
229230
{
230231
if (module.IsWrappingNullReference)
231232
{
@@ -388,7 +389,8 @@ private void RenameVariable()
388389
{
389390
if (_model.Target.DeclarationType.HasFlag(DeclarationType.Control))
390391
{
391-
using (var controls = _model.Target.QualifiedName.QualifiedModuleName.Component.Controls)
392+
var component = _state.ProjectsProvider.Component(_model.Target.QualifiedName.QualifiedModuleName);
393+
using (var controls = component.Controls)
392394
{
393395
using (var control = controls.SingleOrDefault(item => item.Name == _model.Target.IdentifierName))
394396
{
@@ -431,7 +433,7 @@ private void RenameModule()
431433
}
432434
}
433435

434-
var component = _model.Target.QualifiedName.QualifiedModuleName.Component;
436+
var component = _state.ProjectsProvider.Component(_model.Target.QualifiedName.QualifiedModuleName);
435437
if (component.Type == ComponentType.Document)
436438
{
437439
var properties = component.Properties;
@@ -564,9 +566,15 @@ private IEnumerable<Declaration> FindEventHandlersForControl(Declaration control
564566

565567
private void CacheInitialSelection(QualifiedSelection qSelection)
566568
{
567-
if (!qSelection.QualifiedName.Component.CodeModule.CodePane.IsWrappingNullReference)
569+
using (var codeModule = _state.ProjectsProvider.Component(qSelection.QualifiedName).CodeModule)
568570
{
569-
_initialSelection = new Tuple<ICodePane, Selection>(qSelection.QualifiedName.Component.CodeModule.CodePane, qSelection.QualifiedName.Component.CodeModule.CodePane.Selection);
571+
using (var codePane = codeModule.CodePane)
572+
{
573+
if (!codePane.IsWrappingNullReference)
574+
{
575+
_initialSelection = new Tuple<ICodePane, Selection>(codePane, codePane.Selection);
576+
}
577+
}
570578
}
571579
}
572580

0 commit comments

Comments
 (0)