Skip to content

Commit

Permalink
Only load and process user com projects if LOAD_USER_COM_PROJECTS is set
Browse files Browse the repository at this point in the history
  • Loading branch information
MDoerner committed May 11, 2019
1 parent b57c05a commit 034e80c
Show file tree
Hide file tree
Showing 2 changed files with 69 additions and 46 deletions.
@@ -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
Expand Down
114 changes: 69 additions & 45 deletions Rubberduck.Parsing/VBA/ParseCoordinator.cs
Expand Up @@ -239,54 +239,15 @@ private void ExecuteCommonParseActivities(IReadOnlyCollection<QualifiedModuleNam
_parserStateManager.SetStatusAndFireStateChanged(this, ParserState.LoadingReference, token);
token.ThrowIfCancellationRequested();

var newOrModifiedProjects = toParse.Select(module => 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();
Expand Down Expand Up @@ -379,6 +340,69 @@ private void ExecuteCommonParseActivities(IReadOnlyCollection<QualifiedModuleNam
token.ThrowIfCancellationRequested();
}

private void SyncComReferences(IReadOnlyCollection<QualifiedModuleName> toParse, CancellationToken token, HashSet<QualifiedModuleName> 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<QualifiedModuleName> toParse, CancellationToken token,
HashSet<QualifiedModuleName> 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<QualifiedModuleName> toParse, IReadOnlyCollection<string> newProjectIds)
{
var newOrModifiedProjects = toParse.Select(module => module.ProjectId).Concat(newProjectIds).ToHashSet();
_parsingCacheService.RefreshUserComProjects(newOrModifiedProjects);
}

private void ClearModuleToModuleReferences(IEnumerable<QualifiedModuleName> modules)
{
foreach (var module in modules)
Expand Down

0 comments on commit 034e80c

Please sign in to comment.