@@ -4,94 +4,104 @@ public static class AccessibilityCheck
44 {
55 public static bool IsAccessible ( Declaration callingProject , Declaration callingModule , Declaration callingParent , Declaration callee )
66 {
7- if ( callee . DeclarationType . HasFlag ( DeclarationType . Project ) )
8- {
9- return true ;
10- }
11- if ( callee . DeclarationType . HasFlag ( DeclarationType . Module ) )
12- {
13- return IsModuleAccessible ( callingProject , callingModule , callee ) ;
14- }
15- return IsMemberAccessible ( callingProject , callingModule , callingParent , callee ) ;
7+ return callee != null
8+ && ( callee . DeclarationType . HasFlag ( DeclarationType . Project )
9+ || ( callee . DeclarationType . HasFlag ( DeclarationType . Module ) && IsModuleAccessible ( callingProject , callingModule , callee ) )
10+ || ( ! callee . DeclarationType . HasFlag ( DeclarationType . Module ) && IsMemberAccessible ( callingProject , callingModule , callingParent , callee ) ) ) ;
1611 }
1712
13+
1814 public static bool IsModuleAccessible ( Declaration callingProject , Declaration callingModule , Declaration calleeModule )
1915 {
20- bool validAccessibility = IsValidAccessibility ( calleeModule ) ;
21- bool enclosingModule = callingModule . Equals ( calleeModule ) ;
22- if ( enclosingModule )
23- {
24- return true ;
25- }
26- bool sameProject = callingModule . ParentScopeDeclaration . Equals ( calleeModule . ParentScopeDeclaration ) ;
27- if ( sameProject )
28- {
29- return validAccessibility ;
30- }
31- if ( calleeModule . DeclarationType . HasFlag ( DeclarationType . ProceduralModule ) )
16+ return calleeModule != null
17+ && ( IsTheSameModule ( callingModule , calleeModule )
18+ || IsEnclosingProject ( callingProject , calleeModule )
19+ || ( calleeModule . DeclarationType . HasFlag ( DeclarationType . ProceduralModule ) && ! ( ( ProceduralModuleDeclaration ) calleeModule ) . IsPrivateModule )
20+ || ( ! calleeModule . DeclarationType . HasFlag ( DeclarationType . ProceduralModule ) && ( ( ClassModuleDeclaration ) calleeModule ) . IsExposed ) ) ;
21+ }
22+
23+ private static bool IsTheSameModule ( Declaration callingModule , Declaration calleeModule )
3224 {
33- bool isPrivate = ( ( ProceduralModuleDeclaration ) calleeModule ) . IsPrivateModule ;
34- return validAccessibility && ! isPrivate ;
25+ return calleeModule . Equals ( callingModule ) ;
3526 }
36- else
27+
28+ private static bool IsEnclosingProject ( Declaration callingProject , Declaration calleeModule )
3729 {
38- bool isExposed = calleeModule != null && ( ( ClassModuleDeclaration ) calleeModule ) . IsExposed ;
39- return validAccessibility && isExposed ;
30+ return calleeModule . ParentScopeDeclaration . Equals ( callingProject ) ;
4031 }
41- }
4232
43- public static bool IsValidAccessibility ( Declaration moduleOrMember )
44- {
45- return moduleOrMember != null
46- && ( moduleOrMember . Accessibility == Accessibility . Global
47- || moduleOrMember . Accessibility == Accessibility . Public
48- || moduleOrMember . Accessibility == Accessibility . Friend
49- || moduleOrMember . Accessibility == Accessibility . Implicit ) ;
50- }
33+
5134
5235 public static bool IsMemberAccessible ( Declaration callingProject , Declaration callingModule , Declaration callingParent , Declaration calleeMember )
5336 {
54- if ( IsEnclosingModule ( callingModule , calleeMember ) )
37+ if ( calleeMember == null )
5538 {
56- return true ;
57- }
58- var callerIsSubroutineOrProperty = callingParent . DeclarationType . HasFlag ( DeclarationType . Property )
59- || callingParent . DeclarationType . HasFlag ( DeclarationType . Function )
60- || callingParent . DeclarationType . HasFlag ( DeclarationType . Procedure ) ;
61- var calleeHasSameParent = callingParent . Equals ( callingParent . ParentScopeDeclaration ) ;
62- if ( callerIsSubroutineOrProperty && calleeHasSameParent )
39+ return false ;
40+ }
41+ if ( IsEnclosingModuleOfInstanceMember ( callingModule , calleeMember )
42+ || IsLocalMemberOfTheCallingSubroutineOrProperty ( callingParent , calleeMember ) )
6343 {
64- return calleeHasSameParent ;
44+ return true ;
6545 }
6646 var memberModule = Declaration . GetModuleParent ( calleeMember ) ;
67- if ( IsModuleAccessible ( callingProject , callingModule , memberModule ) )
47+ return IsModuleAccessible ( callingProject , callingModule , memberModule )
48+ && ( calleeMember . DeclarationType . HasFlag ( DeclarationType . EnumerationMember )
49+ || calleeMember . DeclarationType . HasFlag ( DeclarationType . UserDefinedTypeMember )
50+ || HasPublicScope ( calleeMember )
51+ || ( IsEnclosingProject ( callingProject , memberModule ) && IsAccessibleThroughoutTheSameProject ( calleeMember ) ) ) ;
52+ }
53+
54+ private static bool IsEnclosingModuleOfInstanceMember ( Declaration callingModule , Declaration calleeMember )
6855 {
69- if ( calleeMember . DeclarationType . HasFlag ( DeclarationType . EnumerationMember ) || calleeMember . DeclarationType . HasFlag ( DeclarationType . UserDefinedTypeMember ) )
56+ if ( callingModule . Equals ( calleeMember . ParentScopeDeclaration ) )
7057 {
71- return IsValidAccessibility ( calleeMember . ParentDeclaration ) ;
58+ return true ;
7259 }
73- else
60+ foreach ( var supertype in ClassModuleDeclaration . GetSupertypes ( callingModule ) )
7461 {
75- return IsValidAccessibility ( calleeMember ) ;
62+ if ( IsEnclosingModuleOfInstanceMember ( supertype , calleeMember ) )
63+ {
64+ return true ;
65+ }
7666 }
67+ return false ;
7768 }
78- return false ;
79- }
8069
81- private static bool IsEnclosingModule ( Declaration callingModule , Declaration calleeMember )
82- {
83- if ( callingModule . Equals ( calleeMember . ParentScopeDeclaration ) )
70+ private static bool IsLocalMemberOfTheCallingSubroutineOrProperty ( Declaration callingParent , Declaration calleeMember )
8471 {
85- return true ;
72+ return IsSubroutineOrProperty ( callingParent ) && CaleeHasSameParentScopeAsCaller ( callingParent , calleeMember ) ;
8673 }
87- foreach ( var supertype in ClassModuleDeclaration . GetSupertypes ( callingModule ) )
88- {
89- if ( IsEnclosingModule ( supertype , calleeMember ) )
74+
75+ private static bool IsSubroutineOrProperty ( Declaration decl )
9076 {
91- return true ;
77+ return decl . DeclarationType . HasFlag ( DeclarationType . Property )
78+ || decl . DeclarationType . HasFlag ( DeclarationType . Function )
79+ || decl . DeclarationType . HasFlag ( DeclarationType . Procedure ) ;
80+ }
81+
82+ private static bool CaleeHasSameParentScopeAsCaller ( Declaration callingParent , Declaration calleeMember )
83+ {
84+ return callingParent . Equals ( calleeMember . ParentScopeDeclaration ) ;
9285 }
86+
87+ private static bool HasPublicScope ( Declaration member )
88+ {
89+ return member . Accessibility == Accessibility . Public
90+ || member . Accessibility == Accessibility . Global
91+ || ( member . Accessibility == Accessibility . Implicit && IsPublicByDefault ( member ) ) ;
92+ }
93+
94+ private static bool IsPublicByDefault ( Declaration member )
95+ {
96+ return IsSubroutineOrProperty ( member )
97+ || member . DeclarationType . HasFlag ( DeclarationType . Enumeration )
98+ || member . DeclarationType . HasFlag ( DeclarationType . UserDefinedType ) ;
99+ }
100+
101+ private static bool IsAccessibleThroughoutTheSameProject ( Declaration member )
102+ {
103+ return HasPublicScope ( member )
104+ || member . Accessibility == Accessibility . Friend ;
93105 }
94- return false ;
95- }
96106 }
97107}
0 commit comments