Skip to content

Commit 82c8b0d

Browse files
committed
Extract separate failed/unpund resolution collections on ModuleState into IFailedResolutionStore
1 parent e3b158d commit 82c8b0d

File tree

13 files changed

+208
-344
lines changed

13 files changed

+208
-344
lines changed

Rubberduck.CodeAnalysis/Inspections/Concrete/MemberNotOnInterfaceInspection.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@ public MemberNotOnInterfaceInspection(RubberduckParserState state)
4444

4545
protected override IEnumerable<IInspectionResult> DoGetInspectionResults()
4646
{
47-
var unresolved = State.DeclarationFinder.UnresolvedMemberDeclarations
47+
var unresolved = State.DeclarationFinder.UnresolvedMemberDeclarations()
4848
.Where(decl => !decl.IsIgnoringInspectionResultFor(AnnotationName)).ToList();
4949

5050
var targets = Declarations.Where(decl => decl.AsTypeDeclaration != null &&

Rubberduck.Parsing/Symbols/IDeclarationFinderFactory.cs

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
using Rubberduck.Parsing.Annotations;
22
using System.Collections.Generic;
33
using Rubberduck.Parsing.VBA.DeclarationCaching;
4+
using Rubberduck.Parsing.VBA.ReferenceManagement;
45
using Rubberduck.VBEditor;
56
using Rubberduck.VBEditor.SafeComWrappers.Abstract;
67

@@ -10,11 +11,8 @@ public interface IDeclarationFinderFactory
1011
{
1112
DeclarationFinder Create(
1213
IReadOnlyList<Declaration> declarations,
13-
IEnumerable<IParseTreeAnnotation> annotations,
14-
IReadOnlyList<UnboundMemberDeclaration> unresolvedMemberDeclarations,
15-
IReadOnlyDictionary<QualifiedModuleName, IReadOnlyCollection<IdentifierReference>> unboundDefaultMemberAccesses,
16-
IReadOnlyDictionary<QualifiedModuleName, IReadOnlyCollection<IdentifierReference>> failedLetCoercions,
17-
IReadOnlyDictionary<QualifiedModuleName, IReadOnlyCollection<IdentifierReference>> failedProcedureCoercions,
14+
IEnumerable<IParseTreeAnnotation> annotations,
15+
IReadOnlyDictionary<QualifiedModuleName, IFailedResolutionStore> failedResolutionStores,
1816
IHostApplication hostApp);
1917
void Release(DeclarationFinder declarationFinder);
2018
}

Rubberduck.Parsing/VBA/DeclarationCaching/ConcurrentlyConstructedDeclarationFinder.cs

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
using System.Threading.Tasks;
44
using Rubberduck.Parsing.Annotations;
55
using Rubberduck.Parsing.Symbols;
6+
using Rubberduck.Parsing.VBA.ReferenceManagement;
67
using Rubberduck.VBEditor;
78
using Rubberduck.VBEditor.SafeComWrappers.Abstract;
89

@@ -15,12 +16,9 @@ public class ConcurrentlyConstructedDeclarationFinder : DeclarationFinder
1516
public ConcurrentlyConstructedDeclarationFinder(
1617
IReadOnlyList<Declaration> declarations,
1718
IEnumerable<IParseTreeAnnotation> annotations,
18-
IReadOnlyList<UnboundMemberDeclaration> unresolvedMemberDeclarations,
19-
IReadOnlyDictionary<QualifiedModuleName, IReadOnlyCollection<IdentifierReference>> unboundDefaultMemberAccesses,
20-
IReadOnlyDictionary<QualifiedModuleName, IReadOnlyCollection<IdentifierReference>> failedLetCoercions,
21-
IReadOnlyDictionary<QualifiedModuleName, IReadOnlyCollection<IdentifierReference>> failedProcedureCoercions,
19+
IReadOnlyDictionary<QualifiedModuleName, IFailedResolutionStore> failedResolutionStores,
2220
IHostApplication hostApp = null)
23-
:base(declarations, annotations, unresolvedMemberDeclarations, unboundDefaultMemberAccesses, failedLetCoercions, failedProcedureCoercions, hostApp)
21+
:base(declarations, annotations, failedResolutionStores, hostApp)
2422
{}
2523

2624
protected override void ExecuteCollectionConstructionActions(List<Action> collectionConstructionActions)

Rubberduck.Parsing/VBA/DeclarationCaching/ConcurrentlyConstructedDeclarationFinderFactory.cs

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
using System.Collections.Generic;
22
using Rubberduck.Parsing.Annotations;
33
using Rubberduck.Parsing.Symbols;
4+
using Rubberduck.Parsing.VBA.ReferenceManagement;
45
using Rubberduck.VBEditor;
56
using Rubberduck.VBEditor.SafeComWrappers.Abstract;
67

@@ -10,14 +11,11 @@ public class ConcurrentlyConstructedDeclarationFinderFactory : IDeclarationFinde
1011
{
1112
public DeclarationFinder Create(
1213
IReadOnlyList<Declaration> declarations,
13-
IEnumerable<IParseTreeAnnotation> annotations,
14-
IReadOnlyList<UnboundMemberDeclaration> unresolvedMemberDeclarations,
15-
IReadOnlyDictionary<QualifiedModuleName, IReadOnlyCollection<IdentifierReference>> unboundDefaultMemberAccesses,
16-
IReadOnlyDictionary<QualifiedModuleName, IReadOnlyCollection<IdentifierReference>> failedLetCoercions,
17-
IReadOnlyDictionary<QualifiedModuleName, IReadOnlyCollection<IdentifierReference>> failedProcedureCoercions,
14+
IEnumerable<IParseTreeAnnotation> annotations,
15+
IReadOnlyDictionary<QualifiedModuleName, IFailedResolutionStore> failedResolutionStores,
1816
IHostApplication hostApp)
1917
{
20-
return new ConcurrentlyConstructedDeclarationFinder(declarations, annotations, unresolvedMemberDeclarations, unboundDefaultMemberAccesses, failedLetCoercions, failedProcedureCoercions, hostApp);
18+
return new ConcurrentlyConstructedDeclarationFinder(declarations, annotations, failedResolutionStores, hostApp);
2119
}
2220

2321
public void Release(DeclarationFinder declarationFinder)

Rubberduck.Parsing/VBA/DeclarationCaching/DeclarationFinder.cs

Lines changed: 51 additions & 52 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
using Rubberduck.Parsing.Grammar;
1111
using Rubberduck.Parsing.Symbols;
1212
using Rubberduck.Parsing.VBA.Extensions;
13+
using Rubberduck.Parsing.VBA.ReferenceManagement;
1314
using Rubberduck.VBEditor;
1415
using Rubberduck.VBEditor.Extensions;
1516
using Rubberduck.VBEditor.SafeComWrappers.Abstract;
@@ -24,12 +25,11 @@ public class DeclarationFinder
2425
private readonly IHostApplication _hostApp;
2526
private IDictionary<string, List<Declaration>> _declarationsByName;
2627
private IDictionary<QualifiedModuleName, List<Declaration>> _declarations;
27-
private readonly ConcurrentDictionary<QualifiedModuleName, ConcurrentBag<IdentifierReference>> _newUnboundDefaultMemberAccesses;
28-
private readonly ConcurrentDictionary<QualifiedModuleName, ConcurrentBag<IdentifierReference>> _newFailedLetCoercions;
29-
private readonly ConcurrentDictionary<QualifiedModuleName, ConcurrentBag<IdentifierReference>> _newFailedProcedureCoercions;
28+
29+
private readonly IReadOnlyDictionary<QualifiedModuleName, IFailedResolutionStore> _failedResolutionStores;
30+
private readonly ConcurrentDictionary<QualifiedModuleName, IMutableFailedResolutionStore> _newFailedResolutionStores;
3031
private readonly ConcurrentDictionary<QualifiedMemberName, ConcurrentBag<Declaration>> _newUndeclared;
31-
private readonly ConcurrentBag<UnboundMemberDeclaration> _newUnresolved;
32-
private List<UnboundMemberDeclaration> _unresolved;
32+
3333
private IDictionary<(QualifiedModuleName module, int annotatedLine), List<IParseTreeAnnotation>> _annotations;
3434
private IDictionary<Declaration, List<ParameterDeclaration>> _parametersByParent;
3535
private IDictionary<DeclarationType, List<Declaration>> _userDeclarationsByType;
@@ -41,10 +41,6 @@ public class DeclarationFinder
4141
private IReadOnlyDictionary<string, IReadOnlyList<IdentifierReference>> _referencesByProjectId;
4242
private IDictionary<QualifiedMemberName, List<IdentifierReference>> _referencesByMember;
4343

44-
private readonly IReadOnlyDictionary<QualifiedModuleName, IReadOnlyCollection<IdentifierReference>> _unboundDefaultMemberAccesses;
45-
private readonly IReadOnlyDictionary<QualifiedModuleName, IReadOnlyCollection<IdentifierReference>> _failedLetCoercions;
46-
private readonly IReadOnlyDictionary<QualifiedModuleName, IReadOnlyCollection<IdentifierReference>> _failedProcedureCoercions;
47-
4844
private Lazy<IDictionary<DeclarationType, List<Declaration>>> _builtInDeclarationsByType;
4945
private Lazy<IDictionary<Declaration, List<Declaration>>> _handlersByWithEventsField;
5046

@@ -72,24 +68,16 @@ private static QualifiedSelection GetGroupingKey(Declaration declaration)
7268
public DeclarationFinder(
7369
IReadOnlyList<Declaration> declarations,
7470
IEnumerable<IParseTreeAnnotation> annotations,
75-
IReadOnlyList<UnboundMemberDeclaration> unresolvedMemberDeclarations,
76-
IReadOnlyDictionary<QualifiedModuleName, IReadOnlyCollection<IdentifierReference>> unboundDefaultMemberAccesses,
77-
IReadOnlyDictionary<QualifiedModuleName, IReadOnlyCollection<IdentifierReference>> failedLetCoercions,
78-
IReadOnlyDictionary<QualifiedModuleName, IReadOnlyCollection<IdentifierReference>> failedProcedureCoercions,
71+
IReadOnlyDictionary<QualifiedModuleName, IFailedResolutionStore> failedResolutionStores,
7972
IHostApplication hostApp = null)
8073
{
8174
_hostApp = hostApp;
82-
_unboundDefaultMemberAccesses = unboundDefaultMemberAccesses;
83-
_failedLetCoercions = failedLetCoercions;
84-
_failedProcedureCoercions = failedProcedureCoercions;
75+
_failedResolutionStores = failedResolutionStores;
8576

86-
_newUndeclared = new ConcurrentDictionary<QualifiedMemberName, ConcurrentBag<Declaration>>(new Dictionary<QualifiedMemberName, ConcurrentBag<Declaration>>());
87-
_newUnresolved = new ConcurrentBag<UnboundMemberDeclaration>(new List<UnboundMemberDeclaration>());
88-
_newUnboundDefaultMemberAccesses = new ConcurrentDictionary<QualifiedModuleName, ConcurrentBag<IdentifierReference>>();
89-
_newFailedLetCoercions = new ConcurrentDictionary<QualifiedModuleName, ConcurrentBag<IdentifierReference>>();
90-
_newFailedProcedureCoercions = new ConcurrentDictionary<QualifiedModuleName, ConcurrentBag<IdentifierReference>>();
77+
_newFailedResolutionStores = new ConcurrentDictionary<QualifiedModuleName, IMutableFailedResolutionStore>();
78+
_newUndeclared = new ConcurrentDictionary<QualifiedMemberName, ConcurrentBag<Declaration>>();
9179

92-
var collectionConstructionActions = CollectionConstructionActions(declarations, annotations, unresolvedMemberDeclarations);
80+
var collectionConstructionActions = CollectionConstructionActions(declarations, annotations);
9381
ExecuteCollectionConstructionActions(collectionConstructionActions);
9482

9583
//Temporal coupling: the initializers of the lazy collections use the regular collections filled above.
@@ -101,14 +89,10 @@ protected virtual void ExecuteCollectionConstructionActions(List<Action> collect
10189
collectionConstructionActions.ForEach(action => action.Invoke());
10290
}
10391

104-
private List<Action> CollectionConstructionActions(IReadOnlyList<Declaration> declarations, IEnumerable<IParseTreeAnnotation> annotations,
105-
IReadOnlyList<UnboundMemberDeclaration> unresolvedMemberDeclarations)
92+
private List<Action> CollectionConstructionActions(IReadOnlyList<Declaration> declarations, IEnumerable<IParseTreeAnnotation> annotations)
10693
{
10794
var actions = new List<Action>
10895
{
109-
() =>
110-
_unresolved = unresolvedMemberDeclarations
111-
.ToList(),
11296
() =>
11397
_annotations = annotations
11498
.Where(a => a.AnnotatedLine.HasValue)
@@ -357,13 +341,8 @@ public IEnumerable<Declaration> FindDeclarationsForSelection(QualifiedSelection
357341
}
358342

359343
//This does not need a lock because enumerators over a ConcurrentBag uses a snapshot.
360-
public IEnumerable<UnboundMemberDeclaration> FreshUnresolvedMemberDeclarations => _newUnresolved.ToList();
361344
public IEnumerable<Declaration> FreshUndeclared => _newUndeclared.AllValues();
362-
public IEnumerable<IdentifierReference> FreshUnboundDefaultMemberAccesses => _newUnboundDefaultMemberAccesses.AllValues();
363-
public IEnumerable<IdentifierReference> FreshFailedLetCoercions => _newFailedLetCoercions.AllValues();
364-
public IEnumerable<IdentifierReference> FreshFailedProcedureCoercions => _newFailedProcedureCoercions.AllValues();
365-
366-
public IEnumerable<UnboundMemberDeclaration> UnresolvedMemberDeclarations => _unresolved;
345+
public IReadOnlyDictionary<QualifiedModuleName, IFailedResolutionStore> FreshFailedResolutionStores => _newFailedResolutionStores.ToDictionary(kvp => kvp.Key, kvp => (IFailedResolutionStore)new FailedResolutionStore(kvp.Value));
367346

368347
public IEnumerable<Declaration> Members(Declaration module)
369348
{
@@ -1068,25 +1047,26 @@ public void AddUnboundContext(Declaration parentDeclaration, VBAParser.LExpressi
10681047
(context is VBAParser.MemberAccessExprContext) ? (ParserRuleContext)context.children[0] : withExpression.Context,
10691048
annotations);
10701049

1071-
_newUnresolved.Add(declaration);
1050+
var failedResolutions = _newFailedResolutionStores.GetOrAdd(declaration.QualifiedModuleName, new ConcurrentFailedResolutionStore());
1051+
failedResolutions.AddUnresolvedMemberDeclaration(declaration);
10721052
}
10731053

10741054
public void AddUnboundDefaultMemberAccess(IdentifierReference defaultMemberAccess)
10751055
{
1076-
var accesses = _newUnboundDefaultMemberAccesses.GetOrAdd(defaultMemberAccess.QualifiedModuleName, new ConcurrentBag<IdentifierReference>());
1077-
accesses.Add(defaultMemberAccess);
1056+
var failedResolutions = _newFailedResolutionStores.GetOrAdd(defaultMemberAccess.QualifiedModuleName, new ConcurrentFailedResolutionStore());
1057+
failedResolutions.AddUnboundDefaultMemberAccess(defaultMemberAccess);
10781058
}
10791059

10801060
public void AddFailedLetCoercionReference(IdentifierReference failedLetCoercion)
10811061
{
1082-
var failedCoercions = _newFailedLetCoercions.GetOrAdd(failedLetCoercion.QualifiedModuleName, new ConcurrentBag<IdentifierReference>());
1083-
failedCoercions.Add(failedLetCoercion);
1062+
var failedResolutions = _newFailedResolutionStores.GetOrAdd(failedLetCoercion.QualifiedModuleName, new ConcurrentFailedResolutionStore());
1063+
failedResolutions.AddFailedLetCoercion(failedLetCoercion);
10841064
}
10851065

10861066
public void AddFailedProcedureCoercionReference(IdentifierReference failedProcedureCoercion)
10871067
{
1088-
var failedCoercions = _newFailedProcedureCoercions.GetOrAdd(failedProcedureCoercion.QualifiedModuleName, new ConcurrentBag<IdentifierReference>());
1089-
failedCoercions.Add(failedProcedureCoercion);
1068+
var failedResolutions = _newFailedResolutionStores.GetOrAdd(failedProcedureCoercion.QualifiedModuleName, new ConcurrentFailedResolutionStore());
1069+
failedResolutions.AddFailedProcedureCoercion(failedProcedureCoercion);
10901070
}
10911071

10921072
public Declaration OnBracketedExpression(string expression, ParserRuleContext context)
@@ -1542,8 +1522,8 @@ public IEnumerable<IdentifierReference> AllIdentifierReferences()
15421522
/// </summary>
15431523
public IReadOnlyCollection<IdentifierReference> UnboundDefaultMemberAccesses(QualifiedModuleName module)
15441524
{
1545-
return _unboundDefaultMemberAccesses.TryGetValue(module, out var defaultMemberAccesses)
1546-
? defaultMemberAccesses
1525+
return _failedResolutionStores.TryGetValue(module, out var store)
1526+
? store.UnboundDefaultMemberAccesses
15471527
: new HashSet<IdentifierReference>();
15481528
}
15491529

@@ -1552,17 +1532,17 @@ public IReadOnlyCollection<IdentifierReference> UnboundDefaultMemberAccesses(Qua
15521532
/// </summary>
15531533
public IEnumerable<IdentifierReference> AllUnboundDefaultMemberAccesses()
15541534
{
1555-
return _unboundDefaultMemberAccesses.Values
1556-
.SelectMany(defaultMemberAccess => defaultMemberAccess);
1535+
return _failedResolutionStores.Values
1536+
.SelectMany(store => store.UnboundDefaultMemberAccesses);
15571537
}
15581538

15591539
/// <summary>
15601540
/// Gets the failed Let coercions in a module.
15611541
/// </summary>
15621542
public IReadOnlyCollection<IdentifierReference> FailedLetCoercions(QualifiedModuleName module)
15631543
{
1564-
return _failedLetCoercions.TryGetValue(module, out var failedLetCoercions)
1565-
? failedLetCoercions
1544+
return _failedResolutionStores.TryGetValue(module, out var store)
1545+
? store.FailedLetCoercions
15661546
: new HashSet<IdentifierReference>();
15671547
}
15681548

@@ -1571,17 +1551,17 @@ public IReadOnlyCollection<IdentifierReference> FailedLetCoercions(QualifiedModu
15711551
/// </summary>
15721552
public IEnumerable<IdentifierReference> FailedLetCoercions()
15731553
{
1574-
return _failedLetCoercions.Values
1575-
.SelectMany(coercion => coercion);
1554+
return _failedResolutionStores.Values
1555+
.SelectMany(store => store.FailedLetCoercions);
15761556
}
15771557

15781558
/// <summary>
15791559
/// Gets the failed procedure coercions in a module.
15801560
/// </summary>
15811561
public IReadOnlyCollection<IdentifierReference> FailedProcedureCoercions(QualifiedModuleName module)
15821562
{
1583-
return _failedProcedureCoercions.TryGetValue(module, out var failedProcedureCoercions)
1584-
? failedProcedureCoercions
1563+
return _failedResolutionStores.TryGetValue(module, out var store)
1564+
? store.FailedProcedureCoercions
15851565
: new HashSet<IdentifierReference>();
15861566
}
15871567

@@ -1590,8 +1570,27 @@ public IReadOnlyCollection<IdentifierReference> FailedProcedureCoercions(Qualifi
15901570
/// </summary>
15911571
public IEnumerable<IdentifierReference> FailedProcedureCoercions()
15921572
{
1593-
return _failedProcedureCoercions.Values
1594-
.SelectMany(coercion => coercion);
1573+
return _failedResolutionStores.Values
1574+
.SelectMany(store => store.FailedProcedureCoercions);
1575+
}
1576+
1577+
/// <summary>
1578+
/// Gets the unresolved member call declarations to a members in a module.
1579+
/// </summary>
1580+
public IReadOnlyCollection<UnboundMemberDeclaration> UnresolvedMemberDeclarations(QualifiedModuleName module)
1581+
{
1582+
return _failedResolutionStores.TryGetValue(module, out var store)
1583+
? store.UnresolvedMemberDeclarations
1584+
: new HashSet<UnboundMemberDeclaration>();
1585+
}
1586+
1587+
/// <summary>
1588+
/// Gets all unresolved member call declarations.
1589+
/// </summary>
1590+
public IEnumerable<UnboundMemberDeclaration> UnresolvedMemberDeclarations()
1591+
{
1592+
return _failedResolutionStores.Values
1593+
.SelectMany(store => store.UnresolvedMemberDeclarations);
15951594
}
15961595
}
15971596
}

Rubberduck.Parsing/VBA/DeclarationCaching/DeclarationFinderFactory.cs

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
using System.Collections.Generic;
22
using Rubberduck.Parsing.Annotations;
33
using Rubberduck.Parsing.Symbols;
4+
using Rubberduck.Parsing.VBA.ReferenceManagement;
45
using Rubberduck.VBEditor;
56
using Rubberduck.VBEditor.SafeComWrappers.Abstract;
67

@@ -9,14 +10,11 @@ namespace Rubberduck.Parsing.VBA.DeclarationCaching
910
public class DeclarationFinderFactory : IDeclarationFinderFactory
1011
{
1112
public DeclarationFinder Create(IReadOnlyList<Declaration> declarations,
12-
IEnumerable<IParseTreeAnnotation> annotations,
13-
IReadOnlyList<UnboundMemberDeclaration> unresolvedMemberDeclarations,
14-
IReadOnlyDictionary<QualifiedModuleName, IReadOnlyCollection<IdentifierReference>> unboundDefaultMemberAccesses,
15-
IReadOnlyDictionary<QualifiedModuleName, IReadOnlyCollection<IdentifierReference>> failedLetCoercions,
16-
IReadOnlyDictionary<QualifiedModuleName, IReadOnlyCollection<IdentifierReference>> failedProcedureCoercions,
13+
IEnumerable<IParseTreeAnnotation> annotations,
14+
IReadOnlyDictionary<QualifiedModuleName, IFailedResolutionStore> failedResolutionStores,
1715
IHostApplication hostApp)
1816
{
19-
return new DeclarationFinder(declarations, annotations, unresolvedMemberDeclarations, unboundDefaultMemberAccesses, failedLetCoercions, failedProcedureCoercions, hostApp);
17+
return new DeclarationFinder(declarations, annotations, failedResolutionStores, hostApp);
2018
}
2119

2220
public void Release(DeclarationFinder declarationFinder)

0 commit comments

Comments
 (0)