Skip to content

Commit 4213a8a

Browse files
authored
Merge pull request #4650 from comintern/refs
Locked references removal fix
2 parents 7733e38 + 8d1cbad commit 4213a8a

21 files changed

+454
-109
lines changed

Rubberduck.Core/AddRemoveReferences/ReferenceModel.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,6 @@
88
using Rubberduck.VBEditor;
99
using Rubberduck.VBEditor.SafeComWrappers;
1010
using Rubberduck.VBEditor.SafeComWrappers.Abstract;
11-
using Rubberduck.VBEditor.Utility;
1211

1312
namespace Rubberduck.AddRemoveReferences
1413
{
@@ -129,6 +128,7 @@ public bool IsPinned
129128
public bool IsRecent { get; set; }
130129
public bool IsRegistered { get; set; }
131130
public bool IsReferenced { get; set; }
131+
public bool IsUsed { get; set; }
132132

133133
public int? Priority { get; set; }
134134

Rubberduck.Core/UI/AddRemoveReferences/AddRemoveReferencesPresenterFactory.cs

Lines changed: 61 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -55,61 +55,83 @@ public AddRemoveReferencesPresenter Create(ProjectDeclaration project)
5555
return null;
5656
}
5757

58-
var refs = new Dictionary<RegisteredLibraryKey, RegisteredLibraryInfo>();
59-
// Iterating the returned libraries here instead of just .ToDictionary() using because we can't trust that the registry doesn't contain errors.
60-
foreach (var reference in _finder.FindRegisteredLibraries())
61-
{
62-
if (refs.ContainsKey(reference.UniqueId))
63-
{
64-
_logger.Warn($"Duplicate registry definition for {reference.Guid} version {reference.Version}.");
65-
continue;
66-
}
67-
refs.Add(reference.UniqueId, reference);
68-
}
58+
AddRemoveReferencesModel model = null;
6959

70-
var models = new Dictionary<RegisteredLibraryKey, ReferenceModel>();
71-
using (var references = project.Project?.References)
60+
try
7261
{
73-
if (references is null)
62+
Cursor.Current = Cursors.WaitCursor;
63+
64+
var refs = new Dictionary<RegisteredLibraryKey, RegisteredLibraryInfo>();
65+
// Iterating the returned libraries here instead of just .ToDictionary() using because we can't trust that the registry doesn't contain errors.
66+
foreach (var reference in _finder.FindRegisteredLibraries())
7467
{
75-
return null;
68+
if (refs.ContainsKey(reference.UniqueId))
69+
{
70+
_logger.Warn(
71+
$"Duplicate registry definition for {reference.Guid} version {reference.Version}.");
72+
continue;
73+
}
74+
75+
refs.Add(reference.UniqueId, reference);
7676
}
77-
var priority = 1;
78-
foreach (var reference in references)
79-
{
80-
var guid = Guid.TryParse(reference.Guid, out var result) ? result : Guid.Empty;
81-
var libraryId = new RegisteredLibraryKey(guid, reference.Major, reference.Minor);
8277

83-
if (refs.ContainsKey(libraryId))
78+
var models = new Dictionary<RegisteredLibraryKey, ReferenceModel>();
79+
using (var references = project.Project?.References)
80+
{
81+
if (references is null)
8482
{
85-
// TODO: If for some reason the VBA reference is broken, we could technically use this to repair it. Just a thought...
86-
models.Add(libraryId, new ReferenceModel(refs[libraryId], reference, priority++));
83+
return null;
8784
}
88-
else // These should all be either VBA projects or irreparably broken.
85+
86+
var priority = 1;
87+
foreach (var reference in references)
8988
{
90-
models.Add(libraryId, new ReferenceModel(reference, priority++));
89+
var guid = Guid.TryParse(reference.Guid, out var result) ? result : Guid.Empty;
90+
var libraryId = new RegisteredLibraryKey(guid, reference.Major, reference.Minor);
91+
92+
// TODO: If for some reason the VBA reference is broken, we could technically use this to repair it. Just a thought...
93+
var adding = refs.ContainsKey(libraryId)
94+
? new ReferenceModel(refs[libraryId], reference, priority++)
95+
: new ReferenceModel(reference, priority++);
96+
97+
adding.IsUsed = adding.IsBuiltIn ||
98+
_state.DeclarationFinder.IsReferenceUsedInProject(project,
99+
adding.ToReferenceInfo());
100+
101+
models.Add(libraryId, adding);
102+
reference.Dispose();
91103
}
92-
reference.Dispose();
93104
}
94-
}
95105

96-
foreach (var reference in refs.Where(library =>
97-
(_use64BitPaths || library.Value.Has32BitVersion) &&
98-
!models.ContainsKey(library.Key)))
106+
foreach (var reference in refs.Where(library =>
107+
(_use64BitPaths || library.Value.Has32BitVersion) &&
108+
!models.ContainsKey(library.Key)))
109+
{
110+
models.Add(reference.Key, new ReferenceModel(reference.Value));
111+
}
112+
113+
var settings = _settings.Create();
114+
model = new AddRemoveReferencesModel(project, models.Values, settings);
115+
if (AddRemoveReferencesViewModel.HostHasProjects)
116+
{
117+
model.References.AddRange(GetUserProjectFolderModels(model.Settings).Where(proj =>
118+
!model.References.Any(item =>
119+
item.FullPath.Equals(proj.FullPath, StringComparison.OrdinalIgnoreCase))));
120+
}
121+
}
122+
catch (Exception ex)
99123
{
100-
models.Add(reference.Key, new ReferenceModel(reference.Value));
124+
_logger.Warn(ex, "Unexpected exception attempting to create AddRemoveReferencesModel.");
101125
}
102-
103-
var settings = _settings.Create();
104-
var model = new AddRemoveReferencesModel(project, models.Values, settings);
105-
if (AddRemoveReferencesViewModel.HostHasProjects)
126+
finally
106127
{
107-
model.References.AddRange(GetUserProjectFolderModels(model.Settings).Where(proj =>
108-
!model.References.Any(item =>
109-
item.FullPath.Equals(proj.FullPath, StringComparison.OrdinalIgnoreCase))));
128+
Cursor.Current = Cursors.Default;
110129
}
111130

112-
return new AddRemoveReferencesPresenter(new AddRemoveReferencesDialog(new AddRemoveReferencesViewModel(model, _reconciler, _browser)));
131+
return (model != null)
132+
? new AddRemoveReferencesPresenter(
133+
new AddRemoveReferencesDialog(new AddRemoveReferencesViewModel(model, _reconciler, _browser)))
134+
: null;
113135
}
114136

115137
private IEnumerable<ReferenceModel> GetUserProjectFolderModels(IReferenceSettings settings)

Rubberduck.Core/UI/AddRemoveReferences/AddRemoveReferencesViewModel.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -115,7 +115,7 @@ public AddRemoveReferencesViewModel(IAddRemoveReferencesModel model, IReferenceR
115115

116116
public string ProjectCaption => string.IsNullOrEmpty(Model?.Project?.IdentifierName)
117117
? RubberduckUI.References_Caption
118-
: string.Format(RubberduckUI.References_CaptionTemplate, Model.Project.IdentifierName);
118+
: string.Format(RubberduckUI.References_CaptionTemplate, Model.Project.ProjectDisplayName);
119119

120120
/// <summary>
121121
/// The IAddRemoveReferencesModel for the view.
@@ -212,7 +212,7 @@ private void ExecuteAddCommand(object parameter)
212212
/// <param name="parameter">Ignored</param>
213213
private void ExecuteRemoveCommand(object parameter)
214214
{
215-
if (SelectedReference == null)
215+
if (SelectedReference == null || SelectedReference.IsBuiltIn)
216216
{
217217
return;
218218
}

0 commit comments

Comments
 (0)