10
10
using Rubberduck . Parsing . Grammar ;
11
11
using Rubberduck . Parsing . Symbols ;
12
12
using Rubberduck . Parsing . VBA . Extensions ;
13
+ using Rubberduck . Parsing . VBA . ReferenceManagement ;
13
14
using Rubberduck . VBEditor ;
14
15
using Rubberduck . VBEditor . Extensions ;
15
16
using Rubberduck . VBEditor . SafeComWrappers . Abstract ;
@@ -24,12 +25,11 @@ public class DeclarationFinder
24
25
private readonly IHostApplication _hostApp ;
25
26
private IDictionary < string , List < Declaration > > _declarationsByName ;
26
27
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 ;
30
31
private readonly ConcurrentDictionary < QualifiedMemberName , ConcurrentBag < Declaration > > _newUndeclared ;
31
- private readonly ConcurrentBag < UnboundMemberDeclaration > _newUnresolved ;
32
- private List < UnboundMemberDeclaration > _unresolved ;
32
+
33
33
private IDictionary < ( QualifiedModuleName module , int annotatedLine ) , List < IParseTreeAnnotation > > _annotations ;
34
34
private IDictionary < Declaration , List < ParameterDeclaration > > _parametersByParent ;
35
35
private IDictionary < DeclarationType , List < Declaration > > _userDeclarationsByType ;
@@ -41,10 +41,6 @@ public class DeclarationFinder
41
41
private IReadOnlyDictionary < string , IReadOnlyList < IdentifierReference > > _referencesByProjectId ;
42
42
private IDictionary < QualifiedMemberName , List < IdentifierReference > > _referencesByMember ;
43
43
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
-
48
44
private Lazy < IDictionary < DeclarationType , List < Declaration > > > _builtInDeclarationsByType ;
49
45
private Lazy < IDictionary < Declaration , List < Declaration > > > _handlersByWithEventsField ;
50
46
@@ -72,24 +68,16 @@ private static QualifiedSelection GetGroupingKey(Declaration declaration)
72
68
public DeclarationFinder (
73
69
IReadOnlyList < Declaration > declarations ,
74
70
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 ,
79
72
IHostApplication hostApp = null )
80
73
{
81
74
_hostApp = hostApp ;
82
- _unboundDefaultMemberAccesses = unboundDefaultMemberAccesses ;
83
- _failedLetCoercions = failedLetCoercions ;
84
- _failedProcedureCoercions = failedProcedureCoercions ;
75
+ _failedResolutionStores = failedResolutionStores ;
85
76
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 > > ( ) ;
91
79
92
- var collectionConstructionActions = CollectionConstructionActions ( declarations , annotations , unresolvedMemberDeclarations ) ;
80
+ var collectionConstructionActions = CollectionConstructionActions ( declarations , annotations ) ;
93
81
ExecuteCollectionConstructionActions ( collectionConstructionActions ) ;
94
82
95
83
//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
101
89
collectionConstructionActions . ForEach ( action => action . Invoke ( ) ) ;
102
90
}
103
91
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 )
106
93
{
107
94
var actions = new List < Action >
108
95
{
109
- ( ) =>
110
- _unresolved = unresolvedMemberDeclarations
111
- . ToList ( ) ,
112
96
( ) =>
113
97
_annotations = annotations
114
98
. Where ( a => a . AnnotatedLine . HasValue )
@@ -357,13 +341,8 @@ public IEnumerable<Declaration> FindDeclarationsForSelection(QualifiedSelection
357
341
}
358
342
359
343
//This does not need a lock because enumerators over a ConcurrentBag uses a snapshot.
360
- public IEnumerable < UnboundMemberDeclaration > FreshUnresolvedMemberDeclarations => _newUnresolved . ToList ( ) ;
361
344
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 ) ) ;
367
346
368
347
public IEnumerable < Declaration > Members ( Declaration module )
369
348
{
@@ -1068,25 +1047,26 @@ public void AddUnboundContext(Declaration parentDeclaration, VBAParser.LExpressi
1068
1047
( context is VBAParser . MemberAccessExprContext ) ? ( ParserRuleContext ) context . children [ 0 ] : withExpression . Context ,
1069
1048
annotations ) ;
1070
1049
1071
- _newUnresolved . Add ( declaration ) ;
1050
+ var failedResolutions = _newFailedResolutionStores . GetOrAdd ( declaration . QualifiedModuleName , new ConcurrentFailedResolutionStore ( ) ) ;
1051
+ failedResolutions . AddUnresolvedMemberDeclaration ( declaration ) ;
1072
1052
}
1073
1053
1074
1054
public void AddUnboundDefaultMemberAccess ( IdentifierReference defaultMemberAccess )
1075
1055
{
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 ) ;
1078
1058
}
1079
1059
1080
1060
public void AddFailedLetCoercionReference ( IdentifierReference failedLetCoercion )
1081
1061
{
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 ) ;
1084
1064
}
1085
1065
1086
1066
public void AddFailedProcedureCoercionReference ( IdentifierReference failedProcedureCoercion )
1087
1067
{
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 ) ;
1090
1070
}
1091
1071
1092
1072
public Declaration OnBracketedExpression ( string expression , ParserRuleContext context )
@@ -1542,8 +1522,8 @@ public IEnumerable<IdentifierReference> AllIdentifierReferences()
1542
1522
/// </summary>
1543
1523
public IReadOnlyCollection < IdentifierReference > UnboundDefaultMemberAccesses ( QualifiedModuleName module )
1544
1524
{
1545
- return _unboundDefaultMemberAccesses . TryGetValue ( module , out var defaultMemberAccesses )
1546
- ? defaultMemberAccesses
1525
+ return _failedResolutionStores . TryGetValue ( module , out var store )
1526
+ ? store . UnboundDefaultMemberAccesses
1547
1527
: new HashSet < IdentifierReference > ( ) ;
1548
1528
}
1549
1529
@@ -1552,17 +1532,17 @@ public IReadOnlyCollection<IdentifierReference> UnboundDefaultMemberAccesses(Qua
1552
1532
/// </summary>
1553
1533
public IEnumerable < IdentifierReference > AllUnboundDefaultMemberAccesses ( )
1554
1534
{
1555
- return _unboundDefaultMemberAccesses . Values
1556
- . SelectMany ( defaultMemberAccess => defaultMemberAccess ) ;
1535
+ return _failedResolutionStores . Values
1536
+ . SelectMany ( store => store . UnboundDefaultMemberAccesses ) ;
1557
1537
}
1558
1538
1559
1539
/// <summary>
1560
1540
/// Gets the failed Let coercions in a module.
1561
1541
/// </summary>
1562
1542
public IReadOnlyCollection < IdentifierReference > FailedLetCoercions ( QualifiedModuleName module )
1563
1543
{
1564
- return _failedLetCoercions . TryGetValue ( module , out var failedLetCoercions )
1565
- ? failedLetCoercions
1544
+ return _failedResolutionStores . TryGetValue ( module , out var store )
1545
+ ? store . FailedLetCoercions
1566
1546
: new HashSet < IdentifierReference > ( ) ;
1567
1547
}
1568
1548
@@ -1571,17 +1551,17 @@ public IReadOnlyCollection<IdentifierReference> FailedLetCoercions(QualifiedModu
1571
1551
/// </summary>
1572
1552
public IEnumerable < IdentifierReference > FailedLetCoercions ( )
1573
1553
{
1574
- return _failedLetCoercions . Values
1575
- . SelectMany ( coercion => coercion ) ;
1554
+ return _failedResolutionStores . Values
1555
+ . SelectMany ( store => store . FailedLetCoercions ) ;
1576
1556
}
1577
1557
1578
1558
/// <summary>
1579
1559
/// Gets the failed procedure coercions in a module.
1580
1560
/// </summary>
1581
1561
public IReadOnlyCollection < IdentifierReference > FailedProcedureCoercions ( QualifiedModuleName module )
1582
1562
{
1583
- return _failedProcedureCoercions . TryGetValue ( module , out var failedProcedureCoercions )
1584
- ? failedProcedureCoercions
1563
+ return _failedResolutionStores . TryGetValue ( module , out var store )
1564
+ ? store . FailedProcedureCoercions
1585
1565
: new HashSet < IdentifierReference > ( ) ;
1586
1566
}
1587
1567
@@ -1590,8 +1570,27 @@ public IReadOnlyCollection<IdentifierReference> FailedProcedureCoercions(Qualifi
1590
1570
/// </summary>
1591
1571
public IEnumerable < IdentifierReference > FailedProcedureCoercions ( )
1592
1572
{
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 ) ;
1595
1594
}
1596
1595
}
1597
1596
}
0 commit comments