Skip to content

Commit

Permalink
Fix built-in event discovery
Browse files Browse the repository at this point in the history
  • Loading branch information
Hosch250 committed Jun 7, 2016
1 parent f32c499 commit a2a3ad0
Show file tree
Hide file tree
Showing 6 changed files with 12 additions and 22 deletions.
24 changes: 7 additions & 17 deletions RetailCoder.VBE/Common/DeclarationExtensions.cs
Original file line number Diff line number Diff line change
Expand Up @@ -225,35 +225,25 @@ public static IEnumerable<Declaration> FindBuiltInEventHandlers(this IEnumerable
var declarationList = declarations.ToList();

var handlerNames = declarationList.Where(declaration => declaration.IsBuiltIn && declaration.DeclarationType == DeclarationType.Event)
.Select(e => e.ParentDeclaration.IdentifierName + "_" + e.IdentifierName);
.SelectMany(e =>
{
var parentModuleSubtypes = ((ClassModuleDeclaration) e.ParentDeclaration).Subtypes;
return parentModuleSubtypes.Any()
? parentModuleSubtypes.Select(v => v.IdentifierName + "_" + e.IdentifierName)
: new[] { e.ParentDeclaration.IdentifierName + "_" + e.IdentifierName };
});

// class module built-in events
var classModuleHandlers = declarationList.Where(item =>
item.DeclarationType == DeclarationType.Procedure &&
item.ParentDeclaration.DeclarationType == DeclarationType.ClassModule &&
(item.IdentifierName == "Class_Initialize" || item.IdentifierName == "Class_Terminate"));

// user form built-in events
var userFormHandlers = declarationList.Where(item =>
item.DeclarationType == DeclarationType.Procedure &&
item.ParentDeclaration.DeclarationType == DeclarationType.ClassModule &&
item.QualifiedName.QualifiedModuleName.Component.Type == vbext_ComponentType.vbext_ct_MSForm &&
new[]
{
"UserForm_Activate", "UserForm_AddControl", "UserForm_BeforeDragOver", "UserForm_BeforeDropOrPaste",
"UserForm_Click", "UserForm_DblClick", "UserForm_Deactivate", "UserForm_Error",
"UserForm_Initialize", "UserForm_KeyDown", "UserForm_KeyPress", "UserForm_KeyUp", "UserForm_Layout",
"UserForm_MouseDown", "UserForm_MouseMove", "UserForm_MouseUp", "UserForm_QueryClose",
"UserForm_RemoveControl", "UserForm_Resize", "UserForm_Scroll", "UserForm_Terminate",
"UserForm_Zoom"
}.Contains(item.IdentifierName));

var handlers = declarationList.Where(declaration => !declaration.IsBuiltIn
&& declaration.DeclarationType == DeclarationType.Procedure
&& handlerNames.Contains(declaration.IdentifierName)).ToList();

handlers.AddRange(classModuleHandlers);
handlers.AddRange(userFormHandlers);

return handlers;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@ public override IEnumerable<InspectionResultBase> GetInspectionResults()
// ParamArray parameters do not allow an explicit "ByRef" parameter mechanism.
&& !((ParameterDeclaration)item).IsParamArray
&& !interfaceMembers.Select(m => m.Scope).Contains(item.ParentScope)
&& !UserDeclarations.FindBuiltInEventHandlers().Contains(item.ParentDeclaration)
&& !State.AllDeclarations.FindBuiltInEventHandlers().Contains(item.ParentDeclaration)
let arg = item.Context as VBAParser.ArgContext
where arg != null && arg.BYREF() == null && arg.BYVAL() == null
select new QualifiedContext<VBAParser.ArgContext>(item.QualifiedName, arg))
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -49,7 +49,7 @@ public override IEnumerable<InspectionResultBase> GetInspectionResults()

var eventScopes = declarations.Where(item =>
!item.IsBuiltIn && item.DeclarationType == DeclarationType.Event)
.Select(e => e.Scope).Concat(declarations.FindBuiltInEventHandlers().Select(e => e.Scope));
.Select(e => e.Scope).Concat(State.AllDeclarations.FindBuiltInEventHandlers().Select(e => e.Scope));

var declareScopes = declarations.Where(item =>
item.DeclarationType == DeclarationType.LibraryFunction
Expand Down
2 changes: 1 addition & 1 deletion RetailCoder.VBE/Inspections/ParameterNotUsedInspection.cs
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@ public override IEnumerable<InspectionResultBase> GetInspectionResults()
var interfaceMemberScopes = declarations.FindInterfaceMembers().Select(m => m.Scope).ToList();
var interfaceImplementationMemberScopes = declarations.FindInterfaceImplementationMembers().Select(m => m.Scope).ToList();

var builtInHandlers = declarations.FindBuiltInEventHandlers();
var builtInHandlers = State.AllDeclarations.FindBuiltInEventHandlers();

var parameters = declarations.Where(parameter => parameter.DeclarationType == DeclarationType.Parameter
&& parameter.ParentDeclaration.DeclarationType != DeclarationType.Event
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -72,7 +72,7 @@ public override IEnumerable<InspectionResultBase> GetInspectionResults()
return UserDeclarations.Where(item => item.IsWithEvents)
.All(withEvents => UserDeclarations.FindEventProcedures(withEvents) == null) &&
!UserDeclarations.FindBuiltInEventHandlers().Contains(declaration);
!State.AllDeclarations.FindBuiltInEventHandlers().Contains(declaration);
});

return ParseTreeResults.ArgListsWithOneByRefParam
Expand Down
2 changes: 1 addition & 1 deletion RetailCoder.VBE/Inspections/ProcedureNotUsedInspection.cs
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,7 @@ public override IEnumerable<InspectionResultBase> GetInspectionResults()
handlers.AddRange(forms.SelectMany(form => declarations.FindFormEventHandlers(form)));
}

handlers.AddRange(declarations.FindBuiltInEventHandlers());
handlers.AddRange(State.AllDeclarations.FindBuiltInEventHandlers());

var items = declarations
.Where(item => !IsIgnoredDeclaration(declarations, item, handlers, classes, modules)
Expand Down

0 comments on commit a2a3ad0

Please sign in to comment.