@@ -4,94 +4,104 @@ public static class AccessibilityCheck
4
4
{
5
5
public static bool IsAccessible ( Declaration callingProject , Declaration callingModule , Declaration callingParent , Declaration callee )
6
6
{
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 ) ) ) ;
16
11
}
17
12
13
+
18
14
public static bool IsModuleAccessible ( Declaration callingProject , Declaration callingModule , Declaration calleeModule )
19
15
{
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 )
32
24
{
33
- bool isPrivate = ( ( ProceduralModuleDeclaration ) calleeModule ) . IsPrivateModule ;
34
- return validAccessibility && ! isPrivate ;
25
+ return calleeModule . Equals ( callingModule ) ;
35
26
}
36
- else
27
+
28
+ private static bool IsEnclosingProject ( Declaration callingProject , Declaration calleeModule )
37
29
{
38
- bool isExposed = calleeModule != null && ( ( ClassModuleDeclaration ) calleeModule ) . IsExposed ;
39
- return validAccessibility && isExposed ;
30
+ return calleeModule . ParentScopeDeclaration . Equals ( callingProject ) ;
40
31
}
41
- }
42
32
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
+
51
34
52
35
public static bool IsMemberAccessible ( Declaration callingProject , Declaration callingModule , Declaration callingParent , Declaration calleeMember )
53
36
{
54
- if ( IsEnclosingModule ( callingModule , calleeMember ) )
37
+ if ( calleeMember == null )
55
38
{
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 ) )
63
43
{
64
- return calleeHasSameParent ;
44
+ return true ;
65
45
}
66
46
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 )
68
55
{
69
- if ( calleeMember . DeclarationType . HasFlag ( DeclarationType . EnumerationMember ) || calleeMember . DeclarationType . HasFlag ( DeclarationType . UserDefinedTypeMember ) )
56
+ if ( callingModule . Equals ( calleeMember . ParentScopeDeclaration ) )
70
57
{
71
- return IsValidAccessibility ( calleeMember . ParentDeclaration ) ;
58
+ return true ;
72
59
}
73
- else
60
+ foreach ( var supertype in ClassModuleDeclaration . GetSupertypes ( callingModule ) )
74
61
{
75
- return IsValidAccessibility ( calleeMember ) ;
62
+ if ( IsEnclosingModuleOfInstanceMember ( supertype , calleeMember ) )
63
+ {
64
+ return true ;
65
+ }
76
66
}
67
+ return false ;
77
68
}
78
- return false ;
79
- }
80
69
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 )
84
71
{
85
- return true ;
72
+ return IsSubroutineOrProperty ( callingParent ) && CaleeHasSameParentScopeAsCaller ( callingParent , calleeMember ) ;
86
73
}
87
- foreach ( var supertype in ClassModuleDeclaration . GetSupertypes ( callingModule ) )
88
- {
89
- if ( IsEnclosingModule ( supertype , calleeMember ) )
74
+
75
+ private static bool IsSubroutineOrProperty ( Declaration decl )
90
76
{
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 ) ;
92
85
}
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 ;
93
105
}
94
- return false ;
95
- }
96
106
}
97
107
}
0 commit comments