From 034e80cbc2fcc2cdcdc97a20e18a48ea396ca4db Mon Sep 17 00:00:00 2001 From: Max Doerner Date: Sat, 11 May 2019 13:28:40 +0200 Subject: [PATCH] Only load and process user com projects if LOAD_USER_COM_PROJECTS is set --- ...rojectsToResolveFromComProjectsSelector.cs | 1 - Rubberduck.Parsing/VBA/ParseCoordinator.cs | 114 +++++++++++------- 2 files changed, 69 insertions(+), 46 deletions(-) diff --git a/Rubberduck.Parsing/VBA/DeclarationResolving/ProjectsToResolveFromComProjectsSelector.cs b/Rubberduck.Parsing/VBA/DeclarationResolving/ProjectsToResolveFromComProjectsSelector.cs index 7e8d14da84..3f10f5cb80 100644 --- a/Rubberduck.Parsing/VBA/DeclarationResolving/ProjectsToResolveFromComProjectsSelector.cs +++ b/Rubberduck.Parsing/VBA/DeclarationResolving/ProjectsToResolveFromComProjectsSelector.cs @@ -1,6 +1,5 @@ using System.Collections.Generic; using System.Linq; -using Rubberduck.Parsing.VBA.Extensions; using Rubberduck.VBEditor.ComManagement; namespace Rubberduck.Parsing.VBA.DeclarationResolving diff --git a/Rubberduck.Parsing/VBA/ParseCoordinator.cs b/Rubberduck.Parsing/VBA/ParseCoordinator.cs index dc594c2bfd..d8d1a013e5 100644 --- a/Rubberduck.Parsing/VBA/ParseCoordinator.cs +++ b/Rubberduck.Parsing/VBA/ParseCoordinator.cs @@ -239,54 +239,15 @@ private void ExecuteCommonParseActivities(IReadOnlyCollection module.ProjectId).Concat(newProjectIds).ToHashSet(); - _parsingCacheService.RefreshUserComProjects(newOrModifiedProjects); + //TODO: Remove the conditional compilation after loading from typelibs actually works. +#if LOAD_USER_COM_PROJECTS + RefreshUserComProjects(toParse, newProjectIds); token.ThrowIfCancellationRequested(); - _parsingStageService.SyncUserComProjects(); - if (_parsingStageService.LastSyncOfUserComProjectsLoadedDeclarations || _parsingStageService.UserProjectIdsUnloaded.Any()) - { - var unloadedProjectIds = _parsingStageService.UserProjectIdsUnloaded.ToHashSet(); - var unloadedModules = - _parsingCacheService.DeclarationFinder.AllModules - .Where(qmn => unloadedProjectIds.Contains(qmn.ProjectId)) - .ToHashSet(); - var additionalModulesToBeReresolved = OtherModulesReferencingAnyNotToBeParsed(unloadedModules.AsReadOnly(), toParse); - toReresolveReferences.UnionWith(additionalModulesToBeReresolved); - _parserStateManager.SetModuleStates(additionalModulesToBeReresolved, ParserState.ResolvingReferences, token); - ClearModuleToModuleReferences(unloadedModules); - RefreshDeclarationFinder(); - } - - _parsingStageService.SyncComReferences(token); - if (_parsingStageService.LastSyncOfCOMReferencesLoadedReferences || _parsingStageService.COMReferencesUnloadedInLastSync.Any()) - { - var unloadedReferences = _parsingStageService.COMReferencesUnloadedInLastSync.ToHashSet(); - var unloadedModules = - _parsingCacheService.DeclarationFinder.AllModules - .Where(qmn => unloadedReferences.Contains(qmn.ProjectId)) - .ToHashSet(); - var additionalModulesToBeReresolved = OtherModulesReferencingAnyNotToBeParsed(unloadedModules.AsReadOnly(), toParse); - toReresolveReferences.UnionWith(additionalModulesToBeReresolved); - _parserStateManager.SetModuleStates(additionalModulesToBeReresolved, ParserState.ResolvingReferences, token); - ClearModuleToModuleReferences(unloadedModules); - RefreshDeclarationFinder(); - } + SyncDeclarationsFromUserComProjects(toParse, token, toReresolveReferences); +#endif - if (_parsingStageService.COMReferencesAffectedByPriorityChangesInLastSync.Any()) - { - //We only use the referencedProjectId because that simplifies the reference management immensely. - var affectedReferences = _parsingStageService.COMReferencesAffectedByPriorityChangesInLastSync - .Select(tpl => tpl.referencedProjectId) - .ToHashSet(); - var referenceModules = - _parsingCacheService.DeclarationFinder.AllModules - .Where(qmn => affectedReferences.Contains(qmn.ProjectId)) - .ToHashSet(); - var additionalModulesToBeReresolved = OtherModulesReferencingAnyNotToBeParsed(referenceModules.AsReadOnly(), toParse); - toReresolveReferences.UnionWith(additionalModulesToBeReresolved); - _parserStateManager.SetModuleStates(additionalModulesToBeReresolved, ParserState.ResolvingReferences, token); - } + SyncComReferences(toParse, token, toReresolveReferences); token.ThrowIfCancellationRequested(); _parsingStageService.LoadBuitInDeclarations(); @@ -379,6 +340,69 @@ private void ExecuteCommonParseActivities(IReadOnlyCollection toParse, CancellationToken token, HashSet toReresolveReferences) + { + _parsingStageService.SyncComReferences(token); + if (_parsingStageService.LastSyncOfCOMReferencesLoadedReferences || + _parsingStageService.COMReferencesUnloadedInLastSync.Any()) + { + var unloadedReferences = _parsingStageService.COMReferencesUnloadedInLastSync.ToHashSet(); + var unloadedModules = + _parsingCacheService.DeclarationFinder.AllModules + .Where(qmn => unloadedReferences.Contains(qmn.ProjectId)) + .ToHashSet(); + var additionalModulesToBeReresolved = + OtherModulesReferencingAnyNotToBeParsed(unloadedModules.AsReadOnly(), toParse); + toReresolveReferences.UnionWith(additionalModulesToBeReresolved); + _parserStateManager.SetModuleStates(additionalModulesToBeReresolved, ParserState.ResolvingReferences, token); + ClearModuleToModuleReferences(unloadedModules); + RefreshDeclarationFinder(); + } + + if (_parsingStageService.COMReferencesAffectedByPriorityChangesInLastSync.Any()) + { + //We only use the referencedProjectId because that simplifies the reference management immensely. + var affectedReferences = _parsingStageService.COMReferencesAffectedByPriorityChangesInLastSync + .Select(tpl => tpl.referencedProjectId) + .ToHashSet(); + var referenceModules = + _parsingCacheService.DeclarationFinder.AllModules + .Where(qmn => affectedReferences.Contains(qmn.ProjectId)) + .ToHashSet(); + var additionalModulesToBeReresolved = + OtherModulesReferencingAnyNotToBeParsed(referenceModules.AsReadOnly(), toParse); + toReresolveReferences.UnionWith(additionalModulesToBeReresolved); + _parserStateManager.SetModuleStates(additionalModulesToBeReresolved, ParserState.ResolvingReferences, token); + } + } + + private void SyncDeclarationsFromUserComProjects(IReadOnlyCollection toParse, CancellationToken token, + HashSet toReresolveReferences) + { + _parsingStageService.SyncUserComProjects(); + if (_parsingStageService.LastSyncOfUserComProjectsLoadedDeclarations || + _parsingStageService.UserProjectIdsUnloaded.Any()) + { + var unloadedProjectIds = _parsingStageService.UserProjectIdsUnloaded.ToHashSet(); + var unloadedModules = + _parsingCacheService.DeclarationFinder.AllModules + .Where(qmn => unloadedProjectIds.Contains(qmn.ProjectId)) + .ToHashSet(); + var additionalModulesToBeReresolved = + OtherModulesReferencingAnyNotToBeParsed(unloadedModules.AsReadOnly(), toParse); + toReresolveReferences.UnionWith(additionalModulesToBeReresolved); + _parserStateManager.SetModuleStates(additionalModulesToBeReresolved, ParserState.ResolvingReferences, token); + ClearModuleToModuleReferences(unloadedModules); + RefreshDeclarationFinder(); + } + } + + private void RefreshUserComProjects(IReadOnlyCollection toParse, IReadOnlyCollection newProjectIds) + { + var newOrModifiedProjects = toParse.Select(module => module.ProjectId).Concat(newProjectIds).ToHashSet(); + _parsingCacheService.RefreshUserComProjects(newOrModifiedProjects); + } + private void ClearModuleToModuleReferences(IEnumerable modules) { foreach (var module in modules)