Skip to content

Commit

Permalink
Fix declaration list clearing in sync functions. Add a crapload of un…
Browse files Browse the repository at this point in the history
…it tests. Closes #4726
  • Loading branch information
comintern committed Jan 20, 2019
1 parent 1b2f65b commit 4383ecd
Show file tree
Hide file tree
Showing 14 changed files with 1,663 additions and 377 deletions.
Expand Up @@ -54,12 +54,10 @@ private void OnStateChanged(object sender, ParserStateEventArgs e)
Unparsed = false;
IsBusy = _state.Status != ParserState.Pending && _state.Status <= ParserState.ResolvedDeclarations;

if (e.State != ParserState.ResolvedDeclarations)
if (e.State == ParserState.ResolvedDeclarations)
{
return;
Synchronize(_state.DeclarationFinder.AllUserDeclarations.ToList());
}

Synchronize(_state.DeclarationFinder.AllUserDeclarations.ToList());
}

private void Synchronize(List<Declaration> declarations)
Expand Down
Expand Up @@ -73,11 +73,17 @@ protected override void AddNewChildren(List<Declaration> updated)
return;
}

AddChildren(updated.GroupBy(item => item.Scope).SelectMany(grouping =>
grouping.Where(item =>
item.ParentDeclaration != null && item.ParentScope == Declaration.Scope &&
MemberTypes.Contains(item.DeclarationType))
.Select(item => new CodeExplorerMemberViewModel(this, item, grouping))));
var children = updated
.Where(declaration => declaration.ParentDeclaration != null &&
MemberTypes.Contains(declaration.DeclarationType) &&
declaration.ParentScope.Equals(Declaration.Scope, StringComparison.OrdinalIgnoreCase))
.ToList();

foreach (var member in children)
{
AddChild(new CodeExplorerMemberViewModel(this, member, updated));
updated.Remove(member);
}
}

private void SetName()
Expand Down
Expand Up @@ -103,7 +103,7 @@ public override void Synchronize(List<Declaration> updated)
protected override void SynchronizeChildren(List<Declaration> updated)
{
var declarations = updated.Where(declaration => declaration.IsInFolderOrSubFolder(FullPath)).ToList();

if (!declarations.Any())
{
Declaration = null;
Expand Down
Expand Up @@ -9,9 +9,9 @@ namespace Rubberduck.Navigation.CodeExplorer
{
public class CodeExplorerMemberViewModel : CodeExplorerItemViewModel
{
public CodeExplorerMemberViewModel(ICodeExplorerNode parent, Declaration declaration, IEnumerable<Declaration> declarations) : base(parent, declaration)
public CodeExplorerMemberViewModel(ICodeExplorerNode parent, Declaration declaration, List<Declaration> declarations) : base(parent, declaration)
{
AddNewChildren(declarations.ToList());
AddNewChildren(declarations);
Name = DetermineMemberName(declaration);
}

Expand Down Expand Up @@ -76,10 +76,14 @@ protected sealed override void AddNewChildren(List<Declaration> updated)
{
if (updated != null)
{
AddChildren(updated
.Where(item =>
SubMemberTypes.Contains(item.DeclarationType) && item.ParentDeclaration.Equals(Declaration))
.Select(item => new CodeExplorerSubMemberViewModel(this, item)));
var updates = updated.Where(item => SubMemberTypes.Contains(item.DeclarationType) && item.ParentDeclaration.Equals(Declaration)).ToList();

AddChildren(updates.Select(item => new CodeExplorerSubMemberViewModel(this, item)));

foreach (var declaration in updates)
{
updated.Remove(declaration);
}
}
}

Expand Down
Expand Up @@ -197,8 +197,8 @@ public static List<Declaration> ExtractTrackedDeclarationsForProject(Declaration
}

return owned.Where(declaration => !UntrackedTypes.Contains(declaration.DeclarationType) &&
!ModuleRestrictedTypes.Contains(declaration.DeclarationType) ||
declaration.ParentDeclaration.DeclarationType.HasFlag(DeclarationType.Module)).ToList();
(!ModuleRestrictedTypes.Contains(declaration.DeclarationType) ||
declaration.ParentDeclaration.DeclarationType.HasFlag(DeclarationType.Module))).ToList();
}
}
}
15 changes: 7 additions & 8 deletions Rubberduck.Core/Navigation/CodeExplorer/CodeExplorerViewModel.cs
Expand Up @@ -237,34 +237,33 @@ private void HandleStateChanged(object sender, ParserStateEventArgs e)

IsBusy = _state.Status != ParserState.Pending && _state.Status <= ParserState.ResolvedDeclarations;

if (e.State != ParserState.ResolvedDeclarations)
if (e.State == ParserState.ResolvedDeclarations)
{
return;
Synchronize(_state.DeclarationFinder.AllUserDeclarations);
}

Synchronize(_state.DeclarationFinder.AllUserDeclarations.ToList());
}

private void Synchronize(List<Declaration> declarations)
private void Synchronize(IEnumerable<Declaration> declarations)
{
_uiDispatcher.Invoke(() =>
{
var updates = declarations.ToList();
var existing = Projects.OfType<CodeExplorerProjectViewModel>().ToList();
foreach (var project in existing)
{
project.Synchronize(declarations);
project.Synchronize(updates);
if (project.Declaration is null)
{
Projects.Remove(project);
}
}
var adding = declarations.OfType<ProjectDeclaration>().ToList();
var adding = updates.OfType<ProjectDeclaration>().ToList();
foreach (var project in adding)
{
var model = new CodeExplorerProjectViewModel(project, declarations.Where(proj => proj.ProjectId.Equals(project.ProjectId)).ToList(), _state, _vbe);
var model = new CodeExplorerProjectViewModel(project, updates, _state, _vbe);
Projects.Add(model);
}
Expand Down

0 comments on commit 4383ecd

Please sign in to comment.