Skip to content

Commit 5f9658c

Browse files
authored
Merge pull request #2764 from MDoerner/SelectiveReferenceResolvingPart1
Selective reference resolving part1
2 parents 243eb05 + 654634e commit 5f9658c

File tree

5 files changed

+170
-42
lines changed

5 files changed

+170
-42
lines changed

Rubberduck.Parsing/Symbols/Declaration.cs

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -616,5 +616,12 @@ public void ClearReferences()
616616
{
617617
_references = new ConcurrentBag<IdentifierReference>();
618618
}
619+
620+
public void RemoveReferencesFrom(ICollection<QualifiedModuleName> modulesByWhichToRemoveReferences)
621+
{
622+
//This gets replaced with a new ConcurrentBag because one cannot remove specific items from a ConcurrentBag.
623+
//Moreover, changing to a ConcurrentDictionary<IdentifierReference,byte> breaks all sorts of tests, for some obscure reason.
624+
var newReferences = new ConcurrentBag<IdentifierReference>(_references.Where(reference => !modulesByWhichToRemoveReferences.Contains(reference.QualifiedModuleName)));
625+
}
619626
}
620627
}

Rubberduck.Parsing/Symbols/DeclarationFinder.cs

Lines changed: 25 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ public static IEnumerable<TValue> AllValues<TKey, TValue>(
3030
public static ConcurrentDictionary<TKey, ConcurrentBag<TValue>> ToConcurrentDictionary<TKey, TValue>(this IEnumerable<IGrouping<TKey, TValue>> source)
3131
{
3232
return new ConcurrentDictionary<TKey, ConcurrentBag<TValue>>(source.Select(x => new KeyValuePair<TKey, ConcurrentBag<TValue>>(x.Key, new ConcurrentBag<TValue>(x))));
33-
}
33+
}
3434
}
3535

3636
public class DeclarationFinder
@@ -42,8 +42,9 @@ public class DeclarationFinder
4242
private readonly AnnotationService _annotationService;
4343
private readonly ConcurrentDictionary<string, ConcurrentBag<Declaration>> _declarationsByName;
4444
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;
4748
private readonly ConcurrentDictionary<QualifiedModuleName, ConcurrentBag<IAnnotation>> _annotations;
4849
private readonly ConcurrentDictionary<Declaration, ConcurrentBag<Declaration>> _parametersByParent;
4950
private readonly ConcurrentDictionary<DeclarationType, ConcurrentBag<Declaration>> _userDeclarationsByType;
@@ -54,7 +55,7 @@ public class DeclarationFinder
5455

5556
private static readonly object ThreadLock = new object();
5657

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)
5859
{
5960
_hostApp = hostApp;
6061
_annotations = annotations.GroupBy(node => node.QualifiedSelection.QualifiedName).ToConcurrentDictionary();
@@ -90,8 +91,10 @@ public DeclarationFinder(IReadOnlyList<Declaration> declarations, IEnumerable<IA
9091
.ToDictionary(item => item.WithEventsField, item => item.Handlers.ToArray())
9192
), true);
9293

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+
9598
_annotationService = new AnnotationService(this);
9699

97100
var implementsInstructions = UserDeclarations(DeclarationType.ClassModule).SelectMany(cls =>
@@ -134,9 +137,9 @@ public DeclarationFinder(IReadOnlyList<Declaration> declarations, IEnumerable<IA
134137
implementableMembers.ToDictionary(item => item.Context, item => item.Members)), true);
135138
}
136139

137-
public IEnumerable<Declaration> Undeclared
140+
public IEnumerable<Declaration> FreshUndeclared
138141
{
139-
get { return _undeclared.AllValues(); }
142+
get { return _newUndeclared.AllValues(); }
140143
}
141144

142145
public IEnumerable<Declaration> Members(Declaration module)
@@ -209,14 +212,19 @@ public IEnumerable<Declaration> UserDeclarations(DeclarationType type)
209212
return result;
210213
}
211214

212-
public IEnumerable<UnboundMemberDeclaration> UnresolvedMemberDeclarations()
215+
public IEnumerable<UnboundMemberDeclaration> FreshUnresolvedMemberDeclarations()
213216
{
214217
lock (ThreadLock)
215218
{
216-
return _unresolved.ToArray();
219+
return _newUnresolved.ToArray();
217220
}
218221
}
219222

223+
public IEnumerable<UnboundMemberDeclaration> UnresolvedMemberDeclarations()
224+
{
225+
return _unresolved.ToList();
226+
}
227+
220228
public IEnumerable<Declaration> FindHandlersForWithEventsField(Declaration field)
221229
{
222230
Declaration[] result;
@@ -510,13 +518,13 @@ public Declaration OnUndeclaredVariable(Declaration enclosingProcedure, string i
510518
Accessibility.Implicit, DeclarationType.Variable, context, context.GetSelection(), false, null,
511519
false, annotations, null, true);
512520

513-
var hasUndeclared = _undeclared.ContainsKey(enclosingProcedure.QualifiedName);
521+
var hasUndeclared = _newUndeclared.ContainsKey(enclosingProcedure.QualifiedName);
514522
if (hasUndeclared)
515523
{
516524
ConcurrentBag<Declaration> undeclared;
517-
while (!_undeclared.TryGetValue(enclosingProcedure.QualifiedName, out undeclared))
525+
while (!_newUndeclared.TryGetValue(enclosingProcedure.QualifiedName, out undeclared))
518526
{
519-
_undeclared.TryGetValue(enclosingProcedure.QualifiedName, out undeclared);
527+
_newUndeclared.TryGetValue(enclosingProcedure.QualifiedName, out undeclared);
520528
}
521529
var inScopeUndeclared = undeclared.FirstOrDefault(d => d.IdentifierName == identifierName);
522530
if (inScopeUndeclared != null)
@@ -527,7 +535,7 @@ public Declaration OnUndeclaredVariable(Declaration enclosingProcedure, string i
527535
}
528536
else
529537
{
530-
_undeclared.TryAdd(enclosingProcedure.QualifiedName, new ConcurrentBag<Declaration> { undeclaredLocal });
538+
_newUndeclared.TryAdd(enclosingProcedure.QualifiedName, new ConcurrentBag<Declaration> { undeclaredLocal });
531539
}
532540
return undeclaredLocal;
533541
}
@@ -550,7 +558,7 @@ public void AddUnboundContext(Declaration parentDeclaration, VBAParser.LExprCont
550558
(access is VBAParser.MemberAccessExprContext) ? (ParserRuleContext)access.children[0] : withExpression.Context,
551559
annotations);
552560

553-
_unresolved.Add(declaration);
561+
_newUnresolved.Add(declaration);
554562
}
555563

556564
public Declaration OnBracketedExpression(string expression, ParserRuleContext context)
@@ -561,13 +569,13 @@ public Declaration OnBracketedExpression(string expression, ParserRuleContext co
561569
var qualifiedName = hostApp.QualifiedName.QualifiedModuleName.QualifyMemberName(expression);
562570

563571
ConcurrentBag<Declaration> undeclared;
564-
if (_undeclared.TryGetValue(qualifiedName, out undeclared))
572+
if (_newUndeclared.TryGetValue(qualifiedName, out undeclared))
565573
{
566574
return undeclared.SingleOrDefault();
567575
}
568576

569577
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 });
571579
return item;
572580
}
573581

Rubberduck.Parsing/VBA/ModuleState.cs

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ namespace Rubberduck.Parsing.VBA
1313
public class ModuleState
1414
{
1515
public ConcurrentDictionary<Declaration, byte> Declarations { get; private set; }
16+
public ConcurrentDictionary<UnboundMemberDeclaration, byte> UnresolvedMemberDeclarations { get; private set; }
1617
public ITokenStream TokenStream { get; private set; }
1718
public IParseTree ParseTree { get; private set; }
1819
public ParserState State { get; private set; }
@@ -29,7 +30,8 @@ public class ModuleState
2930
public ModuleState(ConcurrentDictionary<Declaration, byte> declarations)
3031
{
3132
Declarations = declarations;
32-
TokenStream = null;
33+
UnresolvedMemberDeclarations = new ConcurrentDictionary<UnboundMemberDeclaration, byte>();
34+
TokenStream = null;UnboundMemberDeclaration
3335
ParseTree = null;
3436

3537
if (declarations.Any() && declarations.ElementAt(0).Key.QualifiedName.QualifiedModuleName.Component != null)
@@ -55,6 +57,7 @@ public ModuleState(ConcurrentDictionary<Declaration, byte> declarations)
5557
public ModuleState(ParserState state)
5658
{
5759
Declarations = new ConcurrentDictionary<Declaration, byte>();
60+
UnresolvedMemberDeclarations = new ConcurrentDictionary<UnboundMemberDeclaration, byte>();
5861
TokenStream = null;
5962
ParseTree = null;
6063
State = state;
@@ -72,6 +75,7 @@ public ModuleState(ParserState state)
7275
public ModuleState(SyntaxErrorException moduleException)
7376
{
7477
Declarations = new ConcurrentDictionary<Declaration, byte>();
78+
UnresolvedMemberDeclarations = new ConcurrentDictionary<UnboundMemberDeclaration, byte>();
7579
TokenStream = null;
7680
ParseTree = null;
7781
State = ParserState.Error;
@@ -89,6 +93,7 @@ public ModuleState(SyntaxErrorException moduleException)
8993
public ModuleState(IDictionary<Tuple<string, DeclarationType>, Attributes> moduleAttributes)
9094
{
9195
Declarations = new ConcurrentDictionary<Declaration, byte>();
96+
UnresolvedMemberDeclarations = new ConcurrentDictionary<UnboundMemberDeclaration, byte>();
9297
TokenStream = null;
9398
ParseTree = null;
9499
State = ParserState.None;

0 commit comments

Comments
 (0)