Skip to content

Commit fc333e1

Browse files
committed
Rereference modules referencing libraries affected by priority changes
1 parent dd426b1 commit fc333e1

File tree

4 files changed

+28
-10
lines changed

4 files changed

+28
-10
lines changed

Rubberduck.Parsing/VBA/ComReferenceLoading/COMReferenceSynchronizerBase.cs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ public abstract class COMReferenceSynchronizerBase : ICOMReferenceSynchronizer,
2424
private readonly IProjectsProvider _projectsProvider;
2525
private readonly IReferencedDeclarationsCollector _referencedDeclarationsCollector;
2626

27-
private readonly List<QualifiedModuleName> _unloadedCOMReferences = new List<QualifiedModuleName>();
27+
private readonly List<string> _unloadedCOMReferences = new List<string>();
2828
private readonly List<(string projectId, string referencedProjectId)> _referencesAffectedByPriorityChanges = new List<(string projectId, string referencedProjectId)>();
2929

3030
private readonly Dictionary<(string identifierName, string fullPath), string> _projectIdsByFilePathAndProjectName = new Dictionary<(string identifierName, string fullPath), string>();
@@ -59,7 +59,7 @@ protected COMReferenceSynchronizerBase(RubberduckParserState state, IParserState
5959

6060

6161
public bool LastSyncOfCOMReferencesLoadedReferences { get; private set; }
62-
public IEnumerable<QualifiedModuleName> COMReferencesUnloadedInLastSync => _unloadedCOMReferences;
62+
public IEnumerable<string> COMReferencesUnloadedInLastSync => _unloadedCOMReferences;
6363
public IEnumerable<(string projectId, string referencedProjectId)> COMReferencesAffectedByPriorityChangesInLastSync => _referencesAffectedByPriorityChanges;
6464

6565
private readonly IDictionary<string, ReferencePriorityMap> _projectReferences = new Dictionary<string, ReferencePriorityMap>();
@@ -362,9 +362,9 @@ private void UnloadComReference(string referencedProjectId)
362362
//There is nothing to unload for a user project.
363363
if (!IsUserProjectProjectId(referencedProjectId))
364364
{
365-
var projectQMN = ProjectQMNFromBuildInProjectId(referencedProjectId);
365+
_unloadedCOMReferences.Add(referencedProjectId);
366366

367-
_unloadedCOMReferences.Add(projectQMN);
367+
var projectQMN = ProjectQMNFromBuildInProjectId(referencedProjectId);
368368
_state.RemoveBuiltInDeclarations(projectQMN);
369369
}
370370
}

Rubberduck.Parsing/VBA/ComReferenceLoading/ICOMReferenceSynchronizer.cs

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,12 @@
11
using System.Collections.Generic;
22
using System.Threading;
3-
using Rubberduck.VBEditor;
43

54
namespace Rubberduck.Parsing.VBA.ComReferenceLoading
65
{
76
public interface ICOMReferenceSynchronizer
87
{
98
bool LastSyncOfCOMReferencesLoadedReferences { get; }
10-
IEnumerable<QualifiedModuleName> COMReferencesUnloadedInLastSync { get; }
9+
IEnumerable<string> COMReferencesUnloadedInLastSync { get; }
1110
IEnumerable<(string projectId, string referencedProjectId)> COMReferencesAffectedByPriorityChangesInLastSync { get; }
1211

1312
void SyncComReferences(CancellationToken token);

Rubberduck.Parsing/VBA/ParseCoordinator.cs

Lines changed: 22 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -226,13 +226,32 @@ private void ExecuteCommonParseActivities(IReadOnlyCollection<QualifiedModuleNam
226226
_parsingStageService.SyncComReferences(token);
227227
if (_parsingStageService.LastSyncOfCOMReferencesLoadedReferences || _parsingStageService.COMReferencesUnloadedInLastSync.Any())
228228
{
229-
var unloadedReferences = _parsingStageService.COMReferencesUnloadedInLastSync;
230-
var additionalModulesToBeReresolved = OtherModulesReferencingAnyNotToBeParsed(unloadedReferences.ToHashSet().AsReadOnly(), toParse);
229+
var unloadedReferences = _parsingStageService.COMReferencesUnloadedInLastSync.ToHashSet();
230+
var unloadedModules =
231+
_parsingCacheService.DeclarationFinder.AllModules
232+
.Where(qmn => unloadedReferences.Contains(qmn.ProjectId))
233+
.ToHashSet();
234+
var additionalModulesToBeReresolved = OtherModulesReferencingAnyNotToBeParsed(unloadedModules.AsReadOnly(), toParse);
231235
toReresolveReferences.UnionWith(additionalModulesToBeReresolved);
232236
_parserStateManager.SetModuleStates(additionalModulesToBeReresolved, ParserState.ResolvingReferences, token);
233-
ClearModuleToModuleReferences(unloadedReferences);
237+
ClearModuleToModuleReferences(unloadedModules);
234238
RefreshDeclarationFinder();
235239
}
240+
241+
if (_parsingStageService.COMReferencesAffectedByPriorityChangesInLastSync.Any())
242+
{
243+
//We only use the referencedProjectId because that simplifies the reference management immensely.
244+
var affectedReferences = _parsingStageService.COMReferencesAffectedByPriorityChangesInLastSync
245+
.Select(tpl => tpl.referencedProjectId)
246+
.ToHashSet();
247+
var referenceModules =
248+
_parsingCacheService.DeclarationFinder.AllModules
249+
.Where(qmn => affectedReferences.Contains(qmn.ProjectId))
250+
.ToHashSet();
251+
var additionalModulesToBeReresolved = OtherModulesReferencingAnyNotToBeParsed(referenceModules.AsReadOnly(), toParse);
252+
toReresolveReferences.UnionWith(additionalModulesToBeReresolved);
253+
_parserStateManager.SetModuleStates(additionalModulesToBeReresolved, ParserState.ResolvingReferences, token);
254+
}
236255
token.ThrowIfCancellationRequested();
237256

238257
_parsingStageService.LoadBuitInDeclarations();

Rubberduck.Parsing/VBA/ParsingStageService.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,7 @@ public ParsingStageService(
5454

5555
public bool LastLoadOfBuiltInDeclarationsLoadedDeclarations => _builtInDeclarationLoader.LastLoadOfBuiltInDeclarationsLoadedDeclarations;
5656
public bool LastSyncOfCOMReferencesLoadedReferences => _comSynchronizer.LastSyncOfCOMReferencesLoadedReferences;
57-
public IEnumerable<QualifiedModuleName> COMReferencesUnloadedInLastSync => _comSynchronizer.COMReferencesUnloadedInLastSync;
57+
public IEnumerable<string> COMReferencesUnloadedInLastSync => _comSynchronizer.COMReferencesUnloadedInLastSync;
5858
public IEnumerable<(string projectId, string referencedProjectId)>COMReferencesAffectedByPriorityChangesInLastSync =>_comSynchronizer.COMReferencesAffectedByPriorityChangesInLastSync;
5959

6060
public void LoadBuitInDeclarations()

0 commit comments

Comments
 (0)