public static bool IsMemberAccessible(Declaration callingProject, Declaration callingModule, Declaration callingParent, Declaration calleeMember) { bool enclosingModule = callingModule.Equals(calleeMember.ParentScopeDeclaration); if (enclosingModule) { return(true); } var callerIsSubroutineOrProperty = callingParent.DeclarationType.HasFlag(DeclarationType.Property) || callingParent.DeclarationType.HasFlag(DeclarationType.Function) || callingParent.DeclarationType.HasFlag(DeclarationType.Procedure); var calleeHasSameParent = callingParent.Equals(callingParent.ParentScopeDeclaration); if (callerIsSubroutineOrProperty && calleeHasSameParent) { return(calleeHasSameParent); } var memberModule = Declaration.GetMemberModule(calleeMember); if (IsModuleAccessible(callingProject, callingModule, memberModule) && calleeMember.ParentScopeDeclaration.DeclarationType.HasFlag(DeclarationType.Module)) { if (calleeMember.DeclarationType.HasFlag(DeclarationType.EnumerationMember) || calleeMember.DeclarationType.HasFlag(DeclarationType.UserDefinedTypeMember)) { return(IsValidAccessibility(calleeMember.ParentDeclaration)); } else { return(IsValidAccessibility(calleeMember)); } } return(false); }