Skip to content

Commit 2e1bcc6

Browse files
committed
Fixed AccessibilityCheck. (Passes the tests, now.)
1 parent 304c3fa commit 2e1bcc6

File tree

1 file changed

+48
-19
lines changed

1 file changed

+48
-19
lines changed

Rubberduck.Parsing/Symbols/AccessibilityCheck.cs

Lines changed: 48 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ public static bool IsAccessible(Declaration callingProject, Declaration callingM
2222
}
2323
}
2424

25+
2526
public static bool IsModuleAccessible(Declaration callingProject, Declaration callingModule, Declaration calleeModule)
2627
{
2728
if (calleeModule == null)
@@ -54,14 +55,6 @@ private static bool IsEnclosingProject(Declaration callingProject, Declaration c
5455
return calleeModule.ParentScopeDeclaration.Equals(callingProject);
5556
}
5657

57-
private static bool IsValidAccessibility(Declaration moduleOrMember)
58-
{
59-
return moduleOrMember != null
60-
&& (moduleOrMember.Accessibility == Accessibility.Global
61-
|| moduleOrMember.Accessibility == Accessibility.Public
62-
|| moduleOrMember.Accessibility == Accessibility.Friend
63-
|| moduleOrMember.Accessibility == Accessibility.Implicit);
64-
}
6558

6659

6760
public static bool IsMemberAccessible(Declaration callingProject, Declaration callingModule, Declaration callingParent, Declaration calleeMember)
@@ -70,23 +63,34 @@ public static bool IsMemberAccessible(Declaration callingProject, Declaration ca
7063
{
7164
return false;
7265
}
73-
else if (IsEnclosingModuleOfInstanceMember(callingModule, calleeMember) || (IsSubroutineOrProperty(callingParent) && CaleeHasSameParentAsCaller(callingParent, calleeMember)))
66+
else if (IsEnclosingModuleOfInstanceMember(callingModule, calleeMember))
67+
{
68+
return true;
69+
}
70+
else if (IsLocalMemberOfTheCallingSubroutineOrProperty(callingParent, calleeMember))
7471
{
7572
return true;
7673
}
7774
var memberModule = Declaration.GetModuleParent(calleeMember);
7875
if (IsModuleAccessible(callingProject, callingModule, memberModule))
7976
{
80-
if (calleeMember.DeclarationType.HasFlag(DeclarationType.EnumerationMember) || calleeMember.DeclarationType.HasFlag(DeclarationType.UserDefinedTypeMember))
77+
if (calleeMember.DeclarationType.HasFlag(DeclarationType.EnumerationMember) || calleeMember.DeclarationType.HasFlag(DeclarationType.UserDefinedTypeMember))
8178
{
82-
return IsValidAccessibility(calleeMember.ParentDeclaration);
79+
return true;
80+
}
81+
else if (IsEnclosingProject(callingProject, memberModule) && IsAccessibleThroughoutTheSameProject(calleeMember))
82+
{
83+
return true;
8384
}
8485
else
8586
{
86-
return IsValidAccessibility(calleeMember);
87+
return HasPublicScope(calleeMember);
8788
}
8889
}
89-
return false;
90+
else
91+
{
92+
return false;
93+
}
9094
}
9195

9296
private static bool IsEnclosingModuleOfInstanceMember(Declaration callingModule, Declaration calleeMember)
@@ -105,16 +109,41 @@ private static bool IsEnclosingModuleOfInstanceMember(Declaration callingModule,
105109
return false;
106110
}
107111

108-
private static bool IsSubroutineOrProperty(Declaration decl)
112+
private static bool IsLocalMemberOfTheCallingSubroutineOrProperty(Declaration callingParent, Declaration calleeMember)
113+
{
114+
return IsSubroutineOrProperty(callingParent) && CaleeHasSameParentScopeAsCaller(callingParent, calleeMember);
115+
}
116+
117+
private static bool IsSubroutineOrProperty(Declaration decl)
118+
{
119+
return decl.DeclarationType.HasFlag(DeclarationType.Property)
120+
|| decl.DeclarationType.HasFlag(DeclarationType.Function)
121+
|| decl.DeclarationType.HasFlag(DeclarationType.Procedure);
122+
}
123+
124+
private static bool CaleeHasSameParentScopeAsCaller(Declaration callingParent, Declaration calleeMember)
125+
{
126+
return callingParent.Equals(calleeMember.ParentScopeDeclaration);
127+
}
128+
129+
private static bool HasPublicScope(Declaration member)
109130
{
110-
return decl.DeclarationType.HasFlag(DeclarationType.Property)
111-
|| decl.DeclarationType.HasFlag(DeclarationType.Function)
112-
|| decl.DeclarationType.HasFlag(DeclarationType.Procedure);
131+
return member.Accessibility == Accessibility.Public
132+
|| member.Accessibility == Accessibility.Global
133+
|| (member.Accessibility == Accessibility.Implicit && IsPublicByDefault(member));
113134
}
114135

115-
private static bool CaleeHasSameParentAsCaller(Declaration callingParent, Declaration calleeMember)
136+
private static bool IsPublicByDefault(Declaration member)
137+
{
138+
return IsSubroutineOrProperty(member)
139+
|| member.DeclarationType.HasFlag(DeclarationType.Enumeration)
140+
|| member.DeclarationType.HasFlag(DeclarationType.UserDefinedType);
141+
}
142+
143+
private static bool IsAccessibleThroughoutTheSameProject(Declaration member)
116144
{
117-
return callingParent.Equals(calleeMember.ParentScopeDeclaration);
145+
return HasPublicScope(member)
146+
|| member.Accessibility == Accessibility.Friend;
118147
}
119148
}
120149
}

0 commit comments

Comments
 (0)