Skip to content

Commit 4383ecd

Browse files
committed
Fix declaration list clearing in sync functions. Add a crapload of unit tests. Closes #4726
1 parent 1b2f65b commit 4383ecd

14 files changed

+1663
-377
lines changed

Rubberduck.Core/CodeAnalysis/CodeMetrics/CodeMetricsViewModel.cs

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -54,12 +54,10 @@ private void OnStateChanged(object sender, ParserStateEventArgs e)
5454
Unparsed = false;
5555
IsBusy = _state.Status != ParserState.Pending && _state.Status <= ParserState.ResolvedDeclarations;
5656

57-
if (e.State != ParserState.ResolvedDeclarations)
57+
if (e.State == ParserState.ResolvedDeclarations)
5858
{
59-
return;
59+
Synchronize(_state.DeclarationFinder.AllUserDeclarations.ToList());
6060
}
61-
62-
Synchronize(_state.DeclarationFinder.AllUserDeclarations.ToList());
6361
}
6462

6563
private void Synchronize(List<Declaration> declarations)

Rubberduck.Core/Navigation/CodeExplorer/CodeExplorerComponentViewModel.cs

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -73,11 +73,17 @@ protected override void AddNewChildren(List<Declaration> updated)
7373
return;
7474
}
7575

76-
AddChildren(updated.GroupBy(item => item.Scope).SelectMany(grouping =>
77-
grouping.Where(item =>
78-
item.ParentDeclaration != null && item.ParentScope == Declaration.Scope &&
79-
MemberTypes.Contains(item.DeclarationType))
80-
.Select(item => new CodeExplorerMemberViewModel(this, item, grouping))));
76+
var children = updated
77+
.Where(declaration => declaration.ParentDeclaration != null &&
78+
MemberTypes.Contains(declaration.DeclarationType) &&
79+
declaration.ParentScope.Equals(Declaration.Scope, StringComparison.OrdinalIgnoreCase))
80+
.ToList();
81+
82+
foreach (var member in children)
83+
{
84+
AddChild(new CodeExplorerMemberViewModel(this, member, updated));
85+
updated.Remove(member);
86+
}
8187
}
8288

8389
private void SetName()

Rubberduck.Core/Navigation/CodeExplorer/CodeExplorerCustomFolderViewModel.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -103,7 +103,7 @@ public override void Synchronize(List<Declaration> updated)
103103
protected override void SynchronizeChildren(List<Declaration> updated)
104104
{
105105
var declarations = updated.Where(declaration => declaration.IsInFolderOrSubFolder(FullPath)).ToList();
106-
106+
107107
if (!declarations.Any())
108108
{
109109
Declaration = null;

Rubberduck.Core/Navigation/CodeExplorer/CodeExplorerMemberViewModel.cs

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -9,9 +9,9 @@ namespace Rubberduck.Navigation.CodeExplorer
99
{
1010
public class CodeExplorerMemberViewModel : CodeExplorerItemViewModel
1111
{
12-
public CodeExplorerMemberViewModel(ICodeExplorerNode parent, Declaration declaration, IEnumerable<Declaration> declarations) : base(parent, declaration)
12+
public CodeExplorerMemberViewModel(ICodeExplorerNode parent, Declaration declaration, List<Declaration> declarations) : base(parent, declaration)
1313
{
14-
AddNewChildren(declarations.ToList());
14+
AddNewChildren(declarations);
1515
Name = DetermineMemberName(declaration);
1616
}
1717

@@ -76,10 +76,14 @@ protected sealed override void AddNewChildren(List<Declaration> updated)
7676
{
7777
if (updated != null)
7878
{
79-
AddChildren(updated
80-
.Where(item =>
81-
SubMemberTypes.Contains(item.DeclarationType) && item.ParentDeclaration.Equals(Declaration))
82-
.Select(item => new CodeExplorerSubMemberViewModel(this, item)));
79+
var updates = updated.Where(item => SubMemberTypes.Contains(item.DeclarationType) && item.ParentDeclaration.Equals(Declaration)).ToList();
80+
81+
AddChildren(updates.Select(item => new CodeExplorerSubMemberViewModel(this, item)));
82+
83+
foreach (var declaration in updates)
84+
{
85+
updated.Remove(declaration);
86+
}
8387
}
8488
}
8589

Rubberduck.Core/Navigation/CodeExplorer/CodeExplorerProjectViewModel.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -197,8 +197,8 @@ public static List<Declaration> ExtractTrackedDeclarationsForProject(Declaration
197197
}
198198

199199
return owned.Where(declaration => !UntrackedTypes.Contains(declaration.DeclarationType) &&
200-
!ModuleRestrictedTypes.Contains(declaration.DeclarationType) ||
201-
declaration.ParentDeclaration.DeclarationType.HasFlag(DeclarationType.Module)).ToList();
200+
(!ModuleRestrictedTypes.Contains(declaration.DeclarationType) ||
201+
declaration.ParentDeclaration.DeclarationType.HasFlag(DeclarationType.Module))).ToList();
202202
}
203203
}
204204
}

Rubberduck.Core/Navigation/CodeExplorer/CodeExplorerViewModel.cs

Lines changed: 7 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -237,34 +237,33 @@ private void HandleStateChanged(object sender, ParserStateEventArgs e)
237237

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

240-
if (e.State != ParserState.ResolvedDeclarations)
240+
if (e.State == ParserState.ResolvedDeclarations)
241241
{
242-
return;
242+
Synchronize(_state.DeclarationFinder.AllUserDeclarations);
243243
}
244-
245-
Synchronize(_state.DeclarationFinder.AllUserDeclarations.ToList());
246244
}
247245

248-
private void Synchronize(List<Declaration> declarations)
246+
private void Synchronize(IEnumerable<Declaration> declarations)
249247
{
250248
_uiDispatcher.Invoke(() =>
251249
{
250+
var updates = declarations.ToList();
252251
var existing = Projects.OfType<CodeExplorerProjectViewModel>().ToList();
253252

254253
foreach (var project in existing)
255254
{
256-
project.Synchronize(declarations);
255+
project.Synchronize(updates);
257256
if (project.Declaration is null)
258257
{
259258
Projects.Remove(project);
260259
}
261260
}
262261

263-
var adding = declarations.OfType<ProjectDeclaration>().ToList();
262+
var adding = updates.OfType<ProjectDeclaration>().ToList();
264263

265264
foreach (var project in adding)
266265
{
267-
var model = new CodeExplorerProjectViewModel(project, declarations.Where(proj => proj.ProjectId.Equals(project.ProjectId)).ToList(), _state, _vbe);
266+
var model = new CodeExplorerProjectViewModel(project, updates, _state, _vbe);
268267
Projects.Add(model);
269268
}
270269

0 commit comments

Comments
 (0)