@@ -22,6 +22,7 @@ public static bool IsAccessible(Declaration callingProject, Declaration callingM
22
22
}
23
23
}
24
24
25
+
25
26
public static bool IsModuleAccessible ( Declaration callingProject , Declaration callingModule , Declaration calleeModule )
26
27
{
27
28
if ( calleeModule == null )
@@ -54,14 +55,6 @@ private static bool IsEnclosingProject(Declaration callingProject, Declaration c
54
55
return calleeModule . ParentScopeDeclaration . Equals ( callingProject ) ;
55
56
}
56
57
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
- }
65
58
66
59
67
60
public static bool IsMemberAccessible ( Declaration callingProject , Declaration callingModule , Declaration callingParent , Declaration calleeMember )
@@ -70,23 +63,34 @@ public static bool IsMemberAccessible(Declaration callingProject, Declaration ca
70
63
{
71
64
return false ;
72
65
}
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 ) )
74
71
{
75
72
return true ;
76
73
}
77
74
var memberModule = Declaration . GetModuleParent ( calleeMember ) ;
78
75
if ( IsModuleAccessible ( callingProject , callingModule , memberModule ) )
79
76
{
80
- if ( calleeMember . DeclarationType . HasFlag ( DeclarationType . EnumerationMember ) || calleeMember . DeclarationType . HasFlag ( DeclarationType . UserDefinedTypeMember ) )
77
+ if ( calleeMember . DeclarationType . HasFlag ( DeclarationType . EnumerationMember ) || calleeMember . DeclarationType . HasFlag ( DeclarationType . UserDefinedTypeMember ) )
81
78
{
82
- return IsValidAccessibility ( calleeMember . ParentDeclaration ) ;
79
+ return true ;
80
+ }
81
+ else if ( IsEnclosingProject ( callingProject , memberModule ) && IsAccessibleThroughoutTheSameProject ( calleeMember ) )
82
+ {
83
+ return true ;
83
84
}
84
85
else
85
86
{
86
- return IsValidAccessibility ( calleeMember ) ;
87
+ return HasPublicScope ( calleeMember ) ;
87
88
}
88
89
}
89
- return false ;
90
+ else
91
+ {
92
+ return false ;
93
+ }
90
94
}
91
95
92
96
private static bool IsEnclosingModuleOfInstanceMember ( Declaration callingModule , Declaration calleeMember )
@@ -105,16 +109,41 @@ private static bool IsEnclosingModuleOfInstanceMember(Declaration callingModule,
105
109
return false ;
106
110
}
107
111
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 )
109
130
{
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 ) ) ;
113
134
}
114
135
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 )
116
144
{
117
- return callingParent . Equals ( calleeMember . ParentScopeDeclaration ) ;
145
+ return HasPublicScope ( member )
146
+ || member . Accessibility == Accessibility . Friend ;
118
147
}
119
148
}
120
149
}
0 commit comments