Skip to content

Commit d837b17

Browse files
authored
Merge pull request #2413 from MDoerner/testsforsymbols
Unit tests for subtypes of Declaration and refactorings
2 parents b8118f9 + 6e0c279 commit d837b17

14 files changed

+1787
-637
lines changed

Rubberduck.Parsing/Symbols/AccessibilityCheck.cs

Lines changed: 11 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
1-
namespace Rubberduck.Parsing.Symbols
1+
using System.Linq;
2+
3+
namespace Rubberduck.Parsing.Symbols
24
{
35
public static class AccessibilityCheck
46
{
@@ -38,7 +40,7 @@ public static bool IsMemberAccessible(Declaration callingProject, Declaration ca
3840
{
3941
return false;
4042
}
41-
if (IsEnclosingModuleOfInstanceMember(callingModule, calleeMember)
43+
if (IsInstanceMemberOfModuleOrOneOfItsSupertypes(callingModule, calleeMember)
4244
|| IsLocalMemberOfTheCallingSubroutineOrProperty(callingParent, calleeMember))
4345
{
4446
return true;
@@ -51,21 +53,16 @@ public static bool IsMemberAccessible(Declaration callingProject, Declaration ca
5153
|| (IsEnclosingProject(callingProject, memberModule) && IsAccessibleThroughoutTheSameProject(calleeMember)));
5254
}
5355

54-
private static bool IsEnclosingModuleOfInstanceMember(Declaration callingModule, Declaration calleeMember)
56+
private static bool IsInstanceMemberOfModuleOrOneOfItsSupertypes(Declaration module, Declaration member)
5557
{
56-
if (callingModule.Equals(calleeMember.ParentScopeDeclaration))
57-
{
58-
return true;
59-
}
60-
foreach (var supertype in ClassModuleDeclaration.GetSupertypes(callingModule))
58+
return IsInstanceMemberOfModule(module, member)
59+
|| ClassModuleDeclaration.GetSupertypes(module).Any(supertype => IsInstanceMemberOfModuleOrOneOfItsSupertypes(supertype, member)); //ClassModuleDeclaration.GetSuperTypes never returns null.
60+
}
61+
62+
private static bool IsInstanceMemberOfModule(Declaration module, Declaration member)
6163
{
62-
if (IsEnclosingModuleOfInstanceMember(supertype, calleeMember))
63-
{
64-
return true;
65-
}
64+
return member.ParentScopeDeclaration.Equals(module);
6665
}
67-
return false;
68-
}
6966

7067
private static bool IsLocalMemberOfTheCallingSubroutineOrProperty(Declaration callingParent, Declaration calleeMember)
7168
{

Rubberduck.Parsing/Symbols/AliasDeclarations.cs

Lines changed: 478 additions & 382 deletions
Large diffs are not rendered by default.

Rubberduck.Parsing/Symbols/ClassModuleDeclaration.cs

Lines changed: 3 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,8 @@ public static IEnumerable<Declaration> GetSupertypes(Declaration type)
5353
{
5454
return new List<Declaration>();
5555
}
56-
return ((ClassModuleDeclaration)type).Supertypes;
56+
var classType = type as ClassModuleDeclaration;
57+
return classType != null ? classType.Supertypes : new List<Declaration>();
5758
}
5859

5960

@@ -115,16 +116,7 @@ public bool IsGlobalClassModule
115116

116117
private bool IsGlobalFromSubtypes()
117118
{
118-
var isGlobal = false;
119-
foreach (var type in Subtypes)
120-
{
121-
if (type is ClassModuleDeclaration && ((ClassModuleDeclaration)type).IsGlobalClassModule)
122-
{
123-
isGlobal = true;
124-
break;
125-
}
126-
}
127-
return isGlobal;
119+
return Subtypes.Any(subtype => (subtype is ClassModuleDeclaration && ((ClassModuleDeclaration)subtype).IsGlobalClassModule));
128120
}
129121

130122

Rubberduck.Parsing/Symbols/DebugDeclarations.cs

Lines changed: 290 additions & 93 deletions
Large diffs are not rendered by default.
Lines changed: 165 additions & 130 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
using System.Collections.Generic;
2+
using System.Linq;
23
using Rubberduck.Parsing.VBA;
34
using Rubberduck.VBEditor;
45

@@ -15,15 +16,7 @@ public FormEventDeclarations(RubberduckParserState state)
1516

1617
public IReadOnlyList<Declaration> Load()
1718
{
18-
Declaration formsClassModule = null;
19-
foreach (var declaration in _state.AllDeclarations)
20-
{
21-
if (declaration.DeclarationType == DeclarationType.ClassModule &&
22-
declaration.Scope == "FM20.DLL;MSForms.FormEvents")
23-
{
24-
formsClassModule = declaration;
25-
}
26-
}
19+
var formsClassModule = FormsClassModuleFromParserState(_state);
2720

2821
if (formsClassModule == null)
2922
{
@@ -33,127 +26,169 @@ public IReadOnlyList<Declaration> Load()
3326
return AddHiddenMSFormDeclarations(formsClassModule);
3427
}
3528

36-
private IReadOnlyList<Declaration> AddHiddenMSFormDeclarations(Declaration parentModule)
37-
{
38-
var userFormActivateEvent = new Declaration(
39-
new QualifiedMemberName(
40-
new QualifiedModuleName("MSForms", "C:\\WINDOWS\\system32\\FM20.DLL", "FormEvents"), "Activate"),
41-
parentModule,
42-
"FM20.DLL;MSForms.FormEvents",
43-
string.Empty,
44-
string.Empty,
45-
false,
46-
false,
47-
Accessibility.Global,
48-
DeclarationType.Event,
49-
false,
50-
null);
51-
52-
var userFormDeactivateEvent = new Declaration(
53-
new QualifiedMemberName(
54-
new QualifiedModuleName("MSForms", "C:\\WINDOWS\\system32\\FM20.DLL", "FormEvents"), "Deactivate"),
55-
parentModule,
56-
"FM20.DLL;MSForms.FormEvents",
57-
string.Empty,
58-
string.Empty,
59-
false,
60-
false,
61-
Accessibility.Global,
62-
DeclarationType.Event,
63-
false,
64-
null);
65-
66-
var userFormInitializeEvent = new Declaration(
67-
new QualifiedMemberName(
68-
new QualifiedModuleName("MSForms", "C:\\WINDOWS\\system32\\FM20.DLL", "FormEvents"), "Initialize"),
69-
parentModule,
70-
"FM20.DLL;MSForms.FormEvents",
71-
string.Empty,
72-
string.Empty,
73-
false,
74-
false,
75-
Accessibility.Global,
76-
DeclarationType.Event,
77-
false,
78-
null);
79-
80-
var userFormQueryCloseEvent = new Declaration(
81-
new QualifiedMemberName(
82-
new QualifiedModuleName("MSForms", "C:\\WINDOWS\\system32\\FM20.DLL", "FormEvents"), "QueryClose"),
83-
parentModule,
84-
"FM20.DLL;MSForms.FormEvents",
85-
string.Empty,
86-
string.Empty,
87-
false,
88-
false,
89-
Accessibility.Global,
90-
DeclarationType.Event,
91-
false,
92-
null);
93-
94-
var userFormQueryCloseEventCancelParameter = new ParameterDeclaration(
95-
new QualifiedMemberName(
96-
new QualifiedModuleName("MSForms", "C:\\WINDOWS\\system32\\FM20.DLL", "FormEvents"), "Cancel"),
97-
userFormQueryCloseEvent,
98-
null,
99-
new Selection(),
100-
"Integer",
101-
null,
102-
string.Empty,
103-
false,
104-
true);
105-
106-
var userFormQueryCloseEventCloseModeParameter = new ParameterDeclaration(
107-
new QualifiedMemberName(
108-
new QualifiedModuleName("MSForms", "C:\\WINDOWS\\system32\\FM20.DLL", "FormEvents"), "CloseMode"),
109-
userFormQueryCloseEvent,
110-
null,
111-
new Selection(),
112-
"Integer",
113-
null,
114-
string.Empty,
115-
false,
116-
true);
117-
118-
var userFormResizeEvent = new Declaration(
119-
new QualifiedMemberName(
120-
new QualifiedModuleName("MSForms", "C:\\WINDOWS\\system32\\FM20.DLL", "FormEvents"), "Resize"),
121-
parentModule,
122-
"FM20.DLL;MSForms.FormEvents",
123-
string.Empty,
124-
string.Empty,
125-
false,
126-
false,
127-
Accessibility.Global,
128-
DeclarationType.Event,
129-
false,
130-
null);
131-
132-
var userFormTerminateEvent = new Declaration(
133-
new QualifiedMemberName(
134-
new QualifiedModuleName("MSForms", "C:\\WINDOWS\\system32\\FM20.DLL", "FormEvents"), "Terminate"),
135-
parentModule,
136-
"FM20.DLL;MSForms.FormEvents",
137-
string.Empty,
138-
string.Empty,
139-
false,
140-
false,
141-
Accessibility.Global,
142-
DeclarationType.Event,
143-
false,
144-
null);
145-
146-
return new List<Declaration>
29+
private static Declaration FormsClassModuleFromParserState(RubberduckParserState state)
14730
{
148-
userFormActivateEvent,
149-
userFormDeactivateEvent,
150-
userFormInitializeEvent,
151-
userFormQueryCloseEvent,
152-
userFormQueryCloseEventCancelParameter,
153-
userFormQueryCloseEventCloseModeParameter,
154-
userFormResizeEvent,
155-
userFormTerminateEvent
156-
};
157-
}
31+
return state.AllDeclarations.LastOrDefault(declaration => declaration.DeclarationType == DeclarationType.ClassModule
32+
&& declaration.Scope == "FM20.DLL;MSForms.FormEvents");
33+
}
34+
35+
36+
private IReadOnlyList<Declaration> AddHiddenMSFormDeclarations(Declaration formsClassModule)
37+
{
38+
39+
var userFormActivateEvent = UserFormActivateEvent(formsClassModule);
40+
var userFormDeactivateEvent = UserFormDeactivateEvent(formsClassModule);
41+
var userFormInitializeEvent = UserFormInitializeEvent(formsClassModule);
42+
var userFormQueryCloseEvent = UserFormQueryCloseEvent(formsClassModule);
43+
var userFormQueryCloseEventCancelParameter = UserFormQueryCloseEventCancelParameter(userFormQueryCloseEvent);
44+
var userFormQueryCloseEventCloseModeParameter = UserFormQueryCloseEventCloseModeParameter(userFormQueryCloseEvent);
45+
var userFormResizeEvent = UserFormResizeEvent(formsClassModule);
46+
var userFormTerminateEvent = UserFormTerminateEvent(formsClassModule);
47+
48+
return new List<Declaration>
49+
{
50+
userFormActivateEvent,
51+
userFormDeactivateEvent,
52+
userFormInitializeEvent,
53+
userFormQueryCloseEvent,
54+
userFormQueryCloseEventCancelParameter,
55+
userFormQueryCloseEventCloseModeParameter,
56+
userFormResizeEvent,
57+
userFormTerminateEvent
58+
};
59+
}
60+
61+
private static Declaration UserFormActivateEvent(Declaration formsClassModule)
62+
{
63+
return new Declaration(
64+
new QualifiedMemberName(
65+
new QualifiedModuleName("MSForms", "C:\\WINDOWS\\system32\\FM20.DLL", "FormEvents"), "Activate"),
66+
formsClassModule,
67+
"FM20.DLL;MSForms.FormEvents",
68+
string.Empty,
69+
string.Empty,
70+
false,
71+
false,
72+
Accessibility.Global,
73+
DeclarationType.Event,
74+
false,
75+
null);
76+
}
77+
78+
private static Declaration UserFormDeactivateEvent(Declaration formsClassModule)
79+
{
80+
return new Declaration(
81+
new QualifiedMemberName(
82+
new QualifiedModuleName("MSForms", "C:\\WINDOWS\\system32\\FM20.DLL", "FormEvents"), "Deactivate"),
83+
formsClassModule,
84+
"FM20.DLL;MSForms.FormEvents",
85+
string.Empty,
86+
string.Empty,
87+
false,
88+
false,
89+
Accessibility.Global,
90+
DeclarationType.Event,
91+
false,
92+
null);
93+
}
94+
95+
private static Declaration UserFormInitializeEvent(Declaration formsClassModule)
96+
{
97+
return new Declaration(
98+
new QualifiedMemberName(
99+
new QualifiedModuleName("MSForms", "C:\\WINDOWS\\system32\\FM20.DLL", "FormEvents"), "Initialize"),
100+
formsClassModule,
101+
"FM20.DLL;MSForms.FormEvents",
102+
string.Empty,
103+
string.Empty,
104+
false,
105+
false,
106+
Accessibility.Global,
107+
DeclarationType.Event,
108+
false,
109+
null);
110+
}
111+
112+
private static Declaration UserFormQueryCloseEvent(Declaration formsClassModule)
113+
{
114+
return new Declaration(
115+
new QualifiedMemberName(
116+
new QualifiedModuleName("MSForms", "C:\\WINDOWS\\system32\\FM20.DLL", "FormEvents"), "QueryClose"),
117+
formsClassModule,
118+
"FM20.DLL;MSForms.FormEvents",
119+
string.Empty,
120+
string.Empty,
121+
false,
122+
false,
123+
Accessibility.Global,
124+
DeclarationType.Event,
125+
false,
126+
null);
127+
}
128+
129+
private static ParameterDeclaration UserFormQueryCloseEventCancelParameter(Declaration userFormQueryCloseEvent)
130+
{
131+
return new ParameterDeclaration(
132+
new QualifiedMemberName(
133+
new QualifiedModuleName("MSForms", "C:\\WINDOWS\\system32\\FM20.DLL", "FormEvents"), "Cancel"),
134+
userFormQueryCloseEvent,
135+
null,
136+
new Selection(),
137+
"Integer",
138+
null,
139+
string.Empty,
140+
false,
141+
true);
142+
}
143+
144+
private static ParameterDeclaration UserFormQueryCloseEventCloseModeParameter(Declaration userFormQueryCloseEvent)
145+
{
146+
return new ParameterDeclaration(
147+
new QualifiedMemberName(
148+
new QualifiedModuleName("MSForms", "C:\\WINDOWS\\system32\\FM20.DLL", "FormEvents"), "CloseMode"),
149+
userFormQueryCloseEvent,
150+
null,
151+
new Selection(),
152+
"Integer",
153+
null,
154+
string.Empty,
155+
false,
156+
true);
157+
}
158+
159+
private static Declaration UserFormResizeEvent(Declaration formsClassModule)
160+
{
161+
return new Declaration(
162+
new QualifiedMemberName(
163+
new QualifiedModuleName("MSForms", "C:\\WINDOWS\\system32\\FM20.DLL", "FormEvents"), "Resize"),
164+
formsClassModule,
165+
"FM20.DLL;MSForms.FormEvents",
166+
string.Empty,
167+
string.Empty,
168+
false,
169+
false,
170+
Accessibility.Global,
171+
DeclarationType.Event,
172+
false,
173+
null);
174+
}
175+
176+
private static Declaration UserFormTerminateEvent(Declaration formsClassModule)
177+
{
178+
return new Declaration(
179+
new QualifiedMemberName(
180+
new QualifiedModuleName("MSForms", "C:\\WINDOWS\\system32\\FM20.DLL", "FormEvents"), "Terminate"),
181+
formsClassModule,
182+
"FM20.DLL;MSForms.FormEvents",
183+
string.Empty,
184+
string.Empty,
185+
false,
186+
false,
187+
Accessibility.Global,
188+
DeclarationType.Event,
189+
false,
190+
null);
191+
}
192+
158193
}
159194
}

0 commit comments

Comments
 (0)