Skip to content

Commit 923d97d

Browse files
committed
Some cleanup in the DeclarationFinder
1 parent 5e30a0c commit 923d97d

File tree

1 file changed

+30
-41
lines changed

1 file changed

+30
-41
lines changed

Rubberduck.Parsing/Symbols/DeclarationFinder.cs

Lines changed: 30 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -52,8 +52,11 @@ public class DeclarationFinder
5252
private readonly Lazy<ConcurrentDictionary<Declaration, Declaration[]>> _handlersByWithEventsField;
5353
private readonly Lazy<ConcurrentDictionary<VBAParser.ImplementsStmtContext, Declaration[]>> _membersByImplementsContext;
5454
private readonly Lazy<ConcurrentDictionary<Declaration, Declaration[]>> _interfaceMembers;
55+
private Lazy<List<Declaration>> _nonBaseAsType;
56+
private readonly Lazy<ConcurrentBag<Declaration>> _eventHandlers;
57+
private readonly Lazy<ConcurrentBag<Declaration>> _classes;
5558

56-
private static readonly object ThreadLock = new object();
59+
private readonly object threadLock = new object();
5760

5861
public DeclarationFinder(IReadOnlyList<Declaration> declarations, IEnumerable<IAnnotation> annotations, IReadOnlyList<UnboundMemberDeclaration> unresolvedMemberDeclarations, IHostApplication hostApp = null)
5962
{
@@ -135,6 +138,14 @@ public DeclarationFinder(IReadOnlyList<Declaration> declarations, IEnumerable<IA
135138
_membersByImplementsContext = new Lazy<ConcurrentDictionary<VBAParser.ImplementsStmtContext, Declaration[]>>(() =>
136139
new ConcurrentDictionary<VBAParser.ImplementsStmtContext, Declaration[]>(
137140
implementableMembers.ToDictionary(item => item.Context, item => item.Members)), true);
141+
142+
_nonBaseAsType = new Lazy<List<Declaration>>(() =>
143+
_declarations.AllValues().Where(d =>
144+
!string.IsNullOrWhiteSpace(d.AsTypeName)
145+
&& !d.AsTypeIsBaseType
146+
&& d.DeclarationType != DeclarationType.Project
147+
&& d.DeclarationType != DeclarationType.ProceduralModule).ToList()
148+
,true);
138149
}
139150

140151
public IEnumerable<Declaration> FreshUndeclared
@@ -152,38 +163,22 @@ public IEnumerable<Declaration> Members(QualifiedModuleName module)
152163
return _declarations[module];
153164
}
154165

155-
private IEnumerable<Declaration> _nonBaseAsType;
156166
public IEnumerable<Declaration> FindDeclarationsWithNonBaseAsType()
157167
{
158-
lock (ThreadLock)
159-
{
160-
return _nonBaseAsType ?? (_nonBaseAsType = _declarations.AllValues().Where(d =>
161-
!string.IsNullOrWhiteSpace(d.AsTypeName)
162-
&& !d.AsTypeIsBaseType
163-
&& d.DeclarationType != DeclarationType.Project
164-
&& d.DeclarationType != DeclarationType.ProceduralModule).ToList());
165-
}
166-
}
168+
return _nonBaseAsType.Value;
167169

168-
private readonly Lazy<ConcurrentBag<Declaration>> _eventHandlers;
170+
}
171+
169172
public IEnumerable<Declaration> FindEventHandlers()
170173
{
171-
lock (ThreadLock)
172-
{
173-
return _eventHandlers.Value;
174-
}
174+
return _eventHandlers.Value;
175175
}
176176

177-
private readonly Lazy<ConcurrentBag<Declaration>> _classes;
178-
179177
public IEnumerable<Declaration> Classes
180178
{
181179
get
182180
{
183-
lock (ThreadLock)
184-
{
185-
return _classes.Value;
186-
}
181+
return _classes.Value;
187182
}
188183
}
189184

@@ -193,10 +188,7 @@ public IEnumerable<Declaration> Projects
193188
{
194189
get
195190
{
196-
lock (ThreadLock)
197-
{
198-
return _projects.Value;
199-
}
191+
return _projects.Value;
200192
}
201193
}
202194

@@ -214,10 +206,7 @@ public IEnumerable<Declaration> UserDeclarations(DeclarationType type)
214206

215207
public IEnumerable<UnboundMemberDeclaration> FreshUnresolvedMemberDeclarations()
216208
{
217-
lock (ThreadLock)
218-
{
219-
return _newUnresolved.ToArray();
220-
}
209+
return _newUnresolved.ToArray(); //This does not need a lock because enumerators over a ConcurrentBag uses a snapshot.
221210
}
222211

223212
public IEnumerable<UnboundMemberDeclaration> UnresolvedMemberDeclarations()
@@ -259,19 +248,18 @@ public Declaration FindParameter(Declaration procedure, string parameterName)
259248
public IEnumerable<Declaration> FindMemberMatches(Declaration parent, string memberName)
260249
{
261250
ConcurrentBag<Declaration> children;
262-
if (_declarations.TryGetValue(parent.QualifiedName.QualifiedModuleName, out children))
263-
{
264-
return children.Where(item => item.DeclarationType.HasFlag(DeclarationType.Member)
265-
&& item.IdentifierName == memberName).ToList();
266-
}
267-
268-
return Enumerable.Empty<Declaration>();
251+
return _declarations.TryGetValue(parent.QualifiedName.QualifiedModuleName, out children)
252+
? children.Where(item => item.DeclarationType.HasFlag(DeclarationType.Member)
253+
&& item.IdentifierName == memberName).ToList()
254+
: Enumerable.Empty<Declaration>();
269255
}
270256

271257
public IEnumerable<IAnnotation> FindAnnotations(QualifiedModuleName module)
272258
{
273259
ConcurrentBag<IAnnotation> result;
274-
return _annotations.TryGetValue(module, out result) ? result : Enumerable.Empty<IAnnotation>();
260+
return _annotations.TryGetValue(module, out result)
261+
? result
262+
: Enumerable.Empty<IAnnotation>();
275263
}
276264

277265
public bool IsMatch(string declarationName, string potentialMatchName)
@@ -326,7 +314,8 @@ public Declaration FindProject(string name, Declaration currentScope = null)
326314
Declaration result = null;
327315
try
328316
{
329-
result = MatchName(name).SingleOrDefault(project => project.DeclarationType.HasFlag(DeclarationType.Project)
317+
result = MatchName(name).SingleOrDefault(project =>
318+
project.DeclarationType.HasFlag(DeclarationType.Project)
330319
&& (currentScope == null || project.ProjectId == currentScope.ProjectId));
331320
}
332321
catch (InvalidOperationException exception)
@@ -337,7 +326,7 @@ public Declaration FindProject(string name, Declaration currentScope = null)
337326
return result;
338327
}
339328

340-
public Declaration FindStdModule(string name, Declaration parent = null, bool includeBuiltIn = false)
329+
public Declaration FindStdModule(string name, Declaration parent, bool includeBuiltIn = false)
341330
{
342331
Debug.Assert(parent != null);
343332
Declaration result = null;
@@ -356,7 +345,7 @@ public Declaration FindStdModule(string name, Declaration parent = null, bool in
356345
return result;
357346
}
358347

359-
public Declaration FindClassModule(string name, Declaration parent = null, bool includeBuiltIn = false)
348+
public Declaration FindClassModule(string name, Declaration parent, bool includeBuiltIn = false)
360349
{
361350
Debug.Assert(parent != null);
362351
Declaration result = null;

0 commit comments

Comments
 (0)