@@ -30,7 +30,7 @@ public static IEnumerable<TValue> AllValues<TKey, TValue>(
30
30
public static ConcurrentDictionary < TKey , ConcurrentBag < TValue > > ToConcurrentDictionary < TKey , TValue > ( this IEnumerable < IGrouping < TKey , TValue > > source )
31
31
{
32
32
return new ConcurrentDictionary < TKey , ConcurrentBag < TValue > > ( source . Select ( x => new KeyValuePair < TKey , ConcurrentBag < TValue > > ( x . Key , new ConcurrentBag < TValue > ( x ) ) ) ) ;
33
- }
33
+ }
34
34
}
35
35
36
36
public class DeclarationFinder
@@ -42,8 +42,9 @@ public class DeclarationFinder
42
42
private readonly AnnotationService _annotationService ;
43
43
private readonly ConcurrentDictionary < string , ConcurrentBag < Declaration > > _declarationsByName ;
44
44
private readonly ConcurrentDictionary < QualifiedModuleName , ConcurrentBag < Declaration > > _declarations ;
45
- private readonly ConcurrentDictionary < QualifiedMemberName , ConcurrentBag < Declaration > > _undeclared ;
46
- private readonly ConcurrentBag < UnboundMemberDeclaration > _unresolved ;
45
+ private readonly ConcurrentDictionary < QualifiedMemberName , ConcurrentBag < Declaration > > _newUndeclared ;
46
+ private readonly ConcurrentBag < UnboundMemberDeclaration > _newUnresolved ;
47
+ private readonly List < UnboundMemberDeclaration > _unresolved ;
47
48
private readonly ConcurrentDictionary < QualifiedModuleName , ConcurrentBag < IAnnotation > > _annotations ;
48
49
private readonly ConcurrentDictionary < Declaration , ConcurrentBag < Declaration > > _parametersByParent ;
49
50
private readonly ConcurrentDictionary < DeclarationType , ConcurrentBag < Declaration > > _userDeclarationsByType ;
@@ -54,7 +55,7 @@ public class DeclarationFinder
54
55
55
56
private static readonly object ThreadLock = new object ( ) ;
56
57
57
- public DeclarationFinder ( IReadOnlyList < Declaration > declarations , IEnumerable < IAnnotation > annotations , IHostApplication hostApp = null )
58
+ public DeclarationFinder ( IReadOnlyList < Declaration > declarations , IEnumerable < IAnnotation > annotations , IReadOnlyList < UnboundMemberDeclaration > unresolvedMemberDeclarations , IHostApplication hostApp = null )
58
59
{
59
60
_hostApp = hostApp ;
60
61
_annotations = annotations . GroupBy ( node => node . QualifiedSelection . QualifiedName ) . ToConcurrentDictionary ( ) ;
@@ -90,8 +91,10 @@ public DeclarationFinder(IReadOnlyList<Declaration> declarations, IEnumerable<IA
90
91
. ToDictionary ( item => item . WithEventsField , item => item . Handlers . ToArray ( ) )
91
92
) , true ) ;
92
93
93
- _undeclared = new ConcurrentDictionary < QualifiedMemberName , ConcurrentBag < Declaration > > ( new Dictionary < QualifiedMemberName , ConcurrentBag < Declaration > > ( ) ) ;
94
- _unresolved = new ConcurrentBag < UnboundMemberDeclaration > ( new List < UnboundMemberDeclaration > ( ) ) ;
94
+ _newUndeclared = new ConcurrentDictionary < QualifiedMemberName , ConcurrentBag < Declaration > > ( new Dictionary < QualifiedMemberName , ConcurrentBag < Declaration > > ( ) ) ;
95
+ _newUnresolved = new ConcurrentBag < UnboundMemberDeclaration > ( new List < UnboundMemberDeclaration > ( ) ) ;
96
+ _unresolved = unresolvedMemberDeclarations . ToList ( ) ;
97
+
95
98
_annotationService = new AnnotationService ( this ) ;
96
99
97
100
var implementsInstructions = UserDeclarations ( DeclarationType . ClassModule ) . SelectMany ( cls =>
@@ -134,9 +137,9 @@ public DeclarationFinder(IReadOnlyList<Declaration> declarations, IEnumerable<IA
134
137
implementableMembers . ToDictionary ( item => item . Context , item => item . Members ) ) , true ) ;
135
138
}
136
139
137
- public IEnumerable < Declaration > Undeclared
140
+ public IEnumerable < Declaration > FreshUndeclared
138
141
{
139
- get { return _undeclared . AllValues ( ) ; }
142
+ get { return _newUndeclared . AllValues ( ) ; }
140
143
}
141
144
142
145
public IEnumerable < Declaration > Members ( Declaration module )
@@ -209,14 +212,19 @@ public IEnumerable<Declaration> UserDeclarations(DeclarationType type)
209
212
return result ;
210
213
}
211
214
212
- public IEnumerable < UnboundMemberDeclaration > UnresolvedMemberDeclarations ( )
215
+ public IEnumerable < UnboundMemberDeclaration > FreshUnresolvedMemberDeclarations ( )
213
216
{
214
217
lock ( ThreadLock )
215
218
{
216
- return _unresolved . ToArray ( ) ;
219
+ return _newUnresolved . ToArray ( ) ;
217
220
}
218
221
}
219
222
223
+ public IEnumerable < UnboundMemberDeclaration > UnresolvedMemberDeclarations ( )
224
+ {
225
+ return _unresolved . ToList ( ) ;
226
+ }
227
+
220
228
public IEnumerable < Declaration > FindHandlersForWithEventsField ( Declaration field )
221
229
{
222
230
Declaration [ ] result ;
@@ -510,13 +518,13 @@ public Declaration OnUndeclaredVariable(Declaration enclosingProcedure, string i
510
518
Accessibility . Implicit , DeclarationType . Variable , context , context . GetSelection ( ) , false , null ,
511
519
false , annotations , null , true ) ;
512
520
513
- var hasUndeclared = _undeclared . ContainsKey ( enclosingProcedure . QualifiedName ) ;
521
+ var hasUndeclared = _newUndeclared . ContainsKey ( enclosingProcedure . QualifiedName ) ;
514
522
if ( hasUndeclared )
515
523
{
516
524
ConcurrentBag < Declaration > undeclared ;
517
- while ( ! _undeclared . TryGetValue ( enclosingProcedure . QualifiedName , out undeclared ) )
525
+ while ( ! _newUndeclared . TryGetValue ( enclosingProcedure . QualifiedName , out undeclared ) )
518
526
{
519
- _undeclared . TryGetValue ( enclosingProcedure . QualifiedName , out undeclared ) ;
527
+ _newUndeclared . TryGetValue ( enclosingProcedure . QualifiedName , out undeclared ) ;
520
528
}
521
529
var inScopeUndeclared = undeclared . FirstOrDefault ( d => d . IdentifierName == identifierName ) ;
522
530
if ( inScopeUndeclared != null )
@@ -527,7 +535,7 @@ public Declaration OnUndeclaredVariable(Declaration enclosingProcedure, string i
527
535
}
528
536
else
529
537
{
530
- _undeclared . TryAdd ( enclosingProcedure . QualifiedName , new ConcurrentBag < Declaration > { undeclaredLocal } ) ;
538
+ _newUndeclared . TryAdd ( enclosingProcedure . QualifiedName , new ConcurrentBag < Declaration > { undeclaredLocal } ) ;
531
539
}
532
540
return undeclaredLocal ;
533
541
}
@@ -550,7 +558,7 @@ public void AddUnboundContext(Declaration parentDeclaration, VBAParser.LExprCont
550
558
( access is VBAParser . MemberAccessExprContext ) ? ( ParserRuleContext ) access . children [ 0 ] : withExpression . Context ,
551
559
annotations ) ;
552
560
553
- _unresolved . Add ( declaration ) ;
561
+ _newUnresolved . Add ( declaration ) ;
554
562
}
555
563
556
564
public Declaration OnBracketedExpression ( string expression , ParserRuleContext context )
@@ -561,13 +569,13 @@ public Declaration OnBracketedExpression(string expression, ParserRuleContext co
561
569
var qualifiedName = hostApp . QualifiedName . QualifiedModuleName . QualifyMemberName ( expression ) ;
562
570
563
571
ConcurrentBag < Declaration > undeclared ;
564
- if ( _undeclared . TryGetValue ( qualifiedName , out undeclared ) )
572
+ if ( _newUndeclared . TryGetValue ( qualifiedName , out undeclared ) )
565
573
{
566
574
return undeclared . SingleOrDefault ( ) ;
567
575
}
568
576
569
577
var item = new Declaration ( qualifiedName , hostApp , hostApp , Tokens . Variant , string . Empty , false , false , Accessibility . Global , DeclarationType . BracketedExpression , context , context . GetSelection ( ) , false , null ) ;
570
- _undeclared . TryAdd ( qualifiedName , new ConcurrentBag < Declaration > { item } ) ;
578
+ _newUndeclared . TryAdd ( qualifiedName , new ConcurrentBag < Declaration > { item } ) ;
571
579
return item ;
572
580
}
573
581
0 commit comments