Skip to content

Commit 230bd52

Browse files
committed
Remove 8 expensive calls to FindBuiltInEventHandlers
1 parent 1db9b08 commit 230bd52

8 files changed

+58
-48
lines changed

RetailCoder.VBE/Common/DeclarationExtensions.cs

Lines changed: 0 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -280,44 +280,6 @@ public static IEnumerable<Declaration> FindUserEventHandlers(this IEnumerable<De
280280
return handlers;
281281
}
282282

283-
public static IEnumerable<Declaration> FindBuiltInEventHandlers(this IEnumerable<Declaration> declarations)
284-
{
285-
var declarationList = declarations.ToList();
286-
287-
var handlerNames = declarationList.Where(declaration => declaration.IsBuiltIn && declaration.DeclarationType == DeclarationType.Event)
288-
.SelectMany(e =>
289-
{
290-
var parentModuleSubtypes = ((ClassModuleDeclaration) e.ParentDeclaration).Subtypes;
291-
return parentModuleSubtypes.Any()
292-
? parentModuleSubtypes.Select(v => v.IdentifierName + "_" + e.IdentifierName)
293-
: new[] { e.ParentDeclaration.IdentifierName + "_" + e.IdentifierName };
294-
});
295-
296-
var user = declarationList.FirstOrDefault(decl => !decl.IsBuiltIn);
297-
var host = user != null ? user.Project.VBE.HostApplication() : null ;
298-
299-
var handlers = declarationList.Where(item =>
300-
// class module built-in events
301-
(item.DeclarationType == DeclarationType.Procedure &&
302-
item.ParentDeclaration.DeclarationType == DeclarationType.ClassModule && (
303-
item.IdentifierName.Equals("Class_Initialize", StringComparison.InvariantCultureIgnoreCase) ||
304-
item.IdentifierName.Equals("Class_Terminate", StringComparison.InvariantCultureIgnoreCase))) ||
305-
// standard module built-in handlers (Excel specific):
306-
(host != null &&
307-
host.ApplicationName.Equals("Excel", StringComparison.InvariantCultureIgnoreCase) &&
308-
item.DeclarationType == DeclarationType.Procedure &&
309-
item.ParentDeclaration.DeclarationType == DeclarationType.ProceduralModule && (
310-
item.IdentifierName.Equals("auto_open", StringComparison.InvariantCultureIgnoreCase) ||
311-
item.IdentifierName.Equals("auto_close", StringComparison.InvariantCultureIgnoreCase))) ||
312-
// user handlers:
313-
(!item.IsBuiltIn &&
314-
item.DeclarationType == DeclarationType.Procedure &&
315-
handlerNames.Contains(item.IdentifierName))
316-
).ToList();
317-
318-
return handlers;
319-
}
320-
321283
/// <summary>
322284
/// Gets the <see cref="Declaration"/> of the specified <see cref="DeclarationType"/>,
323285
/// at the specified <see cref="QualifiedSelection"/>.

RetailCoder.VBE/Inspections/ImplicitByRefParameterInspection.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ public ImplicitByRefParameterInspection(RubberduckParserState state)
2323
public override IEnumerable<InspectionResultBase> GetInspectionResults()
2424
{
2525
var interfaceMembers = UserDeclarations.FindInterfaceImplementationMembers();
26-
var builtinEventHandlers = Declarations.FindBuiltInEventHandlers();
26+
var builtinEventHandlers = State.DeclarationFinder.FindBuiltinEventHandlers();
2727

2828
var issues = State.DeclarationFinder
2929
.UserDeclarations(DeclarationType.Parameter)

RetailCoder.VBE/Inspections/ParameterCanBeByValInspection.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ public override IEnumerable<InspectionResultBase> GetInspectionResults()
3333

3434
var eventMembers = declarations.Where(item => !item.IsBuiltIn && item.DeclarationType == DeclarationType.Event).ToList();
3535
var formEventHandlerScopes = State.FindFormEventHandlers().Select(handler => handler.Scope);
36-
var eventHandlerScopes = State.AllDeclarations.FindBuiltInEventHandlers().Concat(declarations.FindUserEventHandlers()).Select(e => e.Scope);
36+
var eventHandlerScopes = State.DeclarationFinder.FindBuiltinEventHandlers().Concat(declarations.FindUserEventHandlers()).Select(e => e.Scope);
3737
var eventScopes = eventMembers.Select(s => s.Scope)
3838
.Concat(formEventHandlerScopes)
3939
.Concat(eventHandlerScopes);

RetailCoder.VBE/Inspections/ParameterNotUsedInspection.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ public override IEnumerable<InspectionResultBase> GetInspectionResults()
2929
var interfaceMembers = State.DeclarationFinder.FindAllInterfaceMembers();
3030
var interfaceImplementationMembers = State.DeclarationFinder.FindAllInterfaceImplementingMembers();
3131

32-
var builtInHandlers = State.AllDeclarations.FindBuiltInEventHandlers();
32+
var builtInHandlers = State.DeclarationFinder.FindBuiltinEventHandlers();
3333

3434
var parameters = State.DeclarationFinder
3535
.UserDeclarations(DeclarationType.Parameter)

RetailCoder.VBE/Inspections/ProcedureCanBeWrittenAsFunctionInspection.cs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -43,13 +43,13 @@ public override IEnumerable<InspectionResultBase> GetInspectionResults()
4343
}
4444

4545
var userDeclarations = UserDeclarations.ToList();
46-
var allDeclarations = State.AllDeclarations.ToList();
46+
var builtinHandlers = State.DeclarationFinder.FindBuiltinEventHandlers().ToList();
4747

4848
var contextLookup = userDeclarations.Where(decl => decl.Context != null).ToDictionary(decl => decl.Context);
4949

5050
var ignored = new HashSet<Declaration>( State.DeclarationFinder.FindAllInterfaceMembers()
5151
.Concat(State.DeclarationFinder.FindAllInterfaceImplementingMembers())
52-
.Concat(allDeclarations.FindBuiltInEventHandlers())
52+
.Concat(builtinHandlers)
5353
.Concat(userDeclarations.Where(item => item.IsWithEvents)));
5454

5555
return ParseTreeResults.Where(context => context.Context.Parent is VBAParser.SubStmtContext)
@@ -58,7 +58,7 @@ public override IEnumerable<InspectionResultBase> GetInspectionResults()
5858
!ignored.Contains(decl) &&
5959
userDeclarations.Where(item => item.IsWithEvents)
6060
.All(withEvents => userDeclarations.FindEventProcedures(withEvents) == null) &&
61-
!allDeclarations.FindBuiltInEventHandlers().Contains(decl))
61+
!builtinHandlers.Contains(decl))
6262
.Select(result => new ProcedureCanBeWrittenAsFunctionInspectionResult(
6363
this,
6464
State,

RetailCoder.VBE/Inspections/ProcedureNotUsedInspection.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ public override IEnumerable<InspectionResultBase> GetInspectionResults()
4141
var handlers = State.DeclarationFinder.UserDeclarations(DeclarationType.Control)
4242
.SelectMany(control => declarations.FindEventHandlers(control)).ToList();
4343

44-
var builtInHandlers = State.AllDeclarations.FindBuiltInEventHandlers();
44+
var builtInHandlers = State.DeclarationFinder.FindBuiltinEventHandlers();
4545
handlers.AddRange(builtInHandlers);
4646

4747
var withEventFields = State.DeclarationFinder.UserDeclarations(DeclarationType.Variable).Where(item => item.IsWithEvents).ToList();
@@ -60,7 +60,7 @@ public override IEnumerable<InspectionResultBase> GetInspectionResults()
6060
handlers.AddRange(forms.SelectMany(form => State.FindFormEventHandlers(form)));
6161
}
6262

63-
handlers.AddRange(Declarations.FindBuiltInEventHandlers());
63+
//handlers.AddRange(builtInHandlers);
6464

6565
var interfaceMembers = State.DeclarationFinder.FindAllInterfaceMembers().ToList();
6666
var implementingMembers = State.DeclarationFinder.FindAllInterfaceImplementingMembers().ToList();

RetailCoder.VBE/Inspections/UseMeaningfulNameInspection.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ public override IEnumerable<InspectionResultBase> GetInspectionResults()
4242
var settings = _settings.Load(new CodeInspectionSettings()) ?? new CodeInspectionSettings();
4343
var whitelistedNames = settings.WhitelistedIdentifiers.Select(s => s.Identifier).ToArray();
4444

45-
var handlers = Declarations.FindBuiltInEventHandlers();
45+
var handlers = State.DeclarationFinder.FindBuiltinEventHandlers();
4646

4747
var issues = UserDeclarations
4848
.Where(declaration => !string.IsNullOrEmpty(declaration.IdentifierName) &&

Rubberduck.Parsing/Symbols/DeclarationFinder.cs

Lines changed: 49 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ public class DeclarationFinder
4040
private readonly ConcurrentDictionary<QualifiedModuleName, IAnnotation[]> _annotations;
4141
private readonly ConcurrentDictionary<Declaration, Declaration[]> _parametersByParent;
4242
private readonly ConcurrentDictionary<DeclarationType, Declaration[]> _userDeclarationsByType;
43-
43+
4444
private readonly Lazy<ConcurrentDictionary<Declaration, Declaration[]>> _handlersByWithEventsField;
4545
private readonly Lazy<ConcurrentDictionary<VBAParser.ImplementsStmtContext, Declaration[]>> _membersByImplementsContext;
4646
private readonly Lazy<ConcurrentDictionary<Declaration, Declaration[]>> _interfaceMembers;
@@ -66,6 +66,7 @@ public DeclarationFinder(IReadOnlyList<Declaration> declarations, IEnumerable<IA
6666
declarations.Where(declaration => !declaration.IsBuiltIn)
6767
.GroupBy(declaration => declaration.DeclarationType)
6868
.ToDictionary(grouping => grouping.Key, grouping => grouping.ToArray()));
69+
_builtinEvents = new ConcurrentBag<Declaration>(FindBuiltInEventHandlers(declarations));
6970

7071
_projects = _projects = declarations.Where(d => d.DeclarationType == DeclarationType.Project).ToList();
7172
_classes = _declarations.AllValues().Where(d => d.DeclarationType == DeclarationType.ClassModule).ToList();
@@ -145,6 +146,15 @@ public IEnumerable<Declaration> FindDeclarationsWithNonBaseAsType()
145146
}
146147
}
147148

149+
private readonly ConcurrentBag<Declaration> _builtinEvents;
150+
public IEnumerable<Declaration> FindBuiltinEventHandlers()
151+
{
152+
lock (ThreadLock)
153+
{
154+
return _builtinEvents.ToList();
155+
}
156+
}
157+
148158
private readonly IEnumerable<Declaration> _classes;
149159
public IEnumerable<Declaration> Classes { get { return _classes; } }
150160

@@ -611,5 +621,43 @@ private IEnumerable<Declaration> FindAllInReferencedProjectByPriority(Declaratio
611621
}
612622
}
613623
}
624+
625+
public static IEnumerable<Declaration> FindBuiltInEventHandlers(IEnumerable<Declaration> declarations)
626+
{
627+
var declarationList = declarations.ToList();
628+
629+
var handlerNames = declarationList.Where(declaration => declaration.IsBuiltIn && declaration.DeclarationType == DeclarationType.Event)
630+
.SelectMany(e =>
631+
{
632+
var parentModuleSubtypes = ((ClassModuleDeclaration)e.ParentDeclaration).Subtypes;
633+
return parentModuleSubtypes.Any()
634+
? parentModuleSubtypes.Select(v => v.IdentifierName + "_" + e.IdentifierName)
635+
: new[] { e.ParentDeclaration.IdentifierName + "_" + e.IdentifierName };
636+
});
637+
638+
var user = declarationList.FirstOrDefault(decl => !decl.IsBuiltIn);
639+
var host = user != null ? user.Project.VBE.HostApplication() : null;
640+
641+
var handlers = declarationList.Where(item =>
642+
// class module built-in events
643+
(item.DeclarationType == DeclarationType.Procedure &&
644+
item.ParentDeclaration.DeclarationType == DeclarationType.ClassModule && (
645+
item.IdentifierName.Equals("Class_Initialize", StringComparison.InvariantCultureIgnoreCase) ||
646+
item.IdentifierName.Equals("Class_Terminate", StringComparison.InvariantCultureIgnoreCase))) ||
647+
// standard module built-in handlers (Excel specific):
648+
(host != null &&
649+
host.ApplicationName.Equals("Excel", StringComparison.InvariantCultureIgnoreCase) &&
650+
item.DeclarationType == DeclarationType.Procedure &&
651+
item.ParentDeclaration.DeclarationType == DeclarationType.ProceduralModule && (
652+
item.IdentifierName.Equals("auto_open", StringComparison.InvariantCultureIgnoreCase) ||
653+
item.IdentifierName.Equals("auto_close", StringComparison.InvariantCultureIgnoreCase))) ||
654+
// user handlers:
655+
(!item.IsBuiltIn &&
656+
item.DeclarationType == DeclarationType.Procedure &&
657+
handlerNames.Contains(item.IdentifierName))
658+
).ToList();
659+
660+
return handlers;
661+
}
614662
}
615663
}

0 commit comments

Comments
 (0)